【问题标题】:Selenium (python): can't switch to iframe (name is dynamically generated)Selenium(python):无法切换到 iframe(名称是动态生成的)
【发布时间】:2015-02-24 06:15:44
【问题描述】:

我在选择 iframe 和访问其中的不同元素时遇到问题。 iframe 名称是动态生成的(例如 frame11424758092173 或 frame0005809321 或 frame32138092173)。问题是无论我做什么,Selenium 都找不到 iframe....

切换到最近的帧不起作用:

iframe = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to_frame(iframe)

等待帧得到超时异常:

try:
        iframe = WebDriverWait(driver, 5).until(EC.frame_to_be_available_and_switch_to_it(By.TAG_NAME('iframe')))
    except:
        logger.error(traceback.format_exc())

以下代码行也超时:

try:
        iframe = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.TAG_NAME, u"iframe")))
        driver.switch_to_frame(iframe)
    except:
        logger.error(traceback.format_exc())

我也尝试过遍历帧,但找不到。返回列表为空

iframes = driver.find_elements_by_tag_name('iframe')
#iframes is empty

真的需要帮助...

【问题讨论】:

    标签: python selenium iframe


    【解决方案1】:

    您是否尝试过通过其 XPath 定位 iframe 并使用 contains 方法?:

    iframe = driver.find_element_by_xpath('//iframe[contains(@name, "frame")]')
    driver.switch_to_frame(iframe)
    

    现在您可以访问 iframe 中的元素。

    退出 iframe 使用:

    driver.switch_to_default_content()
    

    contains 方法允许您通过部分属性值获取元素。对于动态生成的 ID、名称等非常有用。您也可以使用 XPath 按其他属性进行搜索。例如,假设您的 iframe 元素具有属性value = "3"。你可以使用:

    iframe = driver.find_element_by_xpath('//iframe[contains(@name, "frame")][@value = "3"]')
    driver.switch_to_frame(iframe)
    

    这种方法也可以用于任意数量的属性。

    您也可以尝试通过其选择器获取元素。请记住,这限制了您可以使用它执行的操作:

    driver.execute_script('document.querySelector("INSERT SELECTOR HERE").doSomething();')
    

    要获取 Selector 和/或 XPath,您需要使用浏览器(在我的情况下为 Chrome)检查元素。右键单击元素。单击检查。然后右键单击 HTML 元素并单击复制 > 复制 Xpath 或复制 > 复制选择器。

    如果这对我不起作用,我最后的手段是访问 iframe 的 url。要获得它,您需要右键单击 iframe 所在的网页区域,然后单击 View Frame Source。然后它会引导你到一个新的页面。该页面的 url 将显示在浏览器顶部 view-source: 之后。然后,您可以简单地导航到该网址:

    driver.get('insert url of iframe here')
    

    现在您可以访问 iframe 中的元素了。如果您在 iframe 中操作元素然后退出 iframe,我不推荐这种方法。您的更改将丢失。这仅在您从该 iframe 中抓取信息时才有效,而不是在您操作其中的元素时。找到 iframe 元素并切换到它通常会更好、更安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2021-06-19
      • 2017-12-24
      • 1970-01-01
      • 2014-06-11
      • 2017-05-06
      相关资源
      最近更新 更多