You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Selenium中处理Embed标签内容及访问内嵌元素

Handling Embed Tags and Fixing Button Locator Issues in Python Selenium

Hey there! Let's break down your two Selenium problems and walk through practical solutions for each.

1. Working with Content Inside <embed> Tags in Python Selenium

First off, <embed> tags are typically used to load external resources like PDFs, SVG files, or legacy content (think Flash). Since these are external assets embedded into the page, Selenium can't directly interact with the content inside them the way you would with regular HTML elements. Here are the most common approaches depending on what's embedded:

  • If it's a PDF or downloadable resource:
    Grab the src attribute of the embed tag to get the direct URL of the content, then use a library like requests to download it for further processing (e.g., parsing text with PyPDF2). Example code:

    from selenium import webdriver
    import requests
    
    driver = webdriver.Chrome()
    driver.get("your-page-url")
    
    # Get the embed element and its src URL
    embed_element = driver.find_element("tag name", "embed")
    content_url = embed_element.get_attribute("src")
    
    # Download the content
    response = requests.get(content_url)
    with open("embedded_content.pdf", "wb") as f:
        f.write(response.content)
    
    driver.quit()
    
  • If it's an SVG or interactive HTML-like content:
    Some embeds might render as SVG. In this case, you can use JavaScript to access the embedded content's DOM (though this depends on same-origin policy). Example:

    # Execute JS to get content from the embed's document
    svg_content = driver.execute_script("return document.querySelector('embed').getSVGDocument();")
    # Now you can interact with svg_content like a regular DOM element
    

2. Fixing the XPATH Locator Issue for the Inner Input Button

The absolute XPATH /html/body/center/b/input is super fragile—any small change to the page structure (like adding a new div or rearranging elements) will break it. Plus, if the button is inside an iframe, you won't be able to locate it until you switch to that iframe's context. Here's how to fix this:

Step 1: Check if the button is inside an iframe

If the "内嵌部分" (inner section) is an iframe, you need to switch to it first. Do this by targeting the iframe via its id, name, or even a relative locator:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Wait for the iframe to load, then switch to it
iframe = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "your-iframe-id"))
)
driver.switch_to.frame(iframe)

# Now try locating the button
button = driver.find_element(By.XPATH, "//input[contains(@value, 'Your Button Text')]")
button.click()

# Switch back to the main page when done
driver.switch_to.default_content()

Step 2: Use a more robust relative XPATH

Ditch the absolute path and use attributes unique to the button. For example:

  • If the button has a type attribute: //input[@type='submit']
  • If it has a specific value or text: //input[@value='Submit Form']
  • If it's nested inside a <b> tag under a <center>: //center/b/input (still relative, better than absolute)

Step 3: Wait for the button to be interactable

Dynamic pages often load elements after the initial page load. Use WebDriverWait to ensure the button is ready before clicking:

button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//center/b/input"))
)
button.click()

If none of these work, right-click the button in your browser's dev tools, copy the relative XPATH (not absolute!) and test that—browser-generated relative paths are usually more reliable than hand-written absolute ones.

内容的提问来源于stack exchange,提问作者user7186568

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:32:43