Python 硒(蟒蛇):可以';t切换到iframe(名称是动态生成的)

Python 硒(蟒蛇):可以';t切换到iframe(名称是动态生成的),python,selenium,iframe,Python,Selenium,Iframe,我在选择iframe和访问其中的不同元素时遇到问题。iframe名称是动态生成的(例如frame11424758092173或frame0005809321或frame32138092173)。问题是,无论我做什么,Selenium都找不到iframe 切换到最近的帧不起作用: iframe = driver.find_elements_by_tag_name('iframe')[0] driver.switch_to_frame(iframe) 等待帧获取超时异常: try:

我在选择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

确实需要一些帮助…

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

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();')
要获取选择器和/或XPath,您需要使用浏览器(在我的例子中是Chrome)输入元素。在元素上单击鼠标右键。单击“检查”。然后右键单击HTML元素,然后单击复制>复制Xpath或复制>复制选择器

如果这对我来说不起作用,我的最后一个办法就是转到iframe的url。要获得它,你需要右键单击网页中iframe存在的区域,然后单击
查看框架源代码
。然后,它将引导您进入新的一页。该页面的url将显示在浏览器顶部的
查看来源:
之后。然后,您只需导航到该url即可:

driver.get('insert url of iframe here')
现在您可以访问iframe中的元素。如果您在iframe中操作元素,然后退出iframe,我不推荐这种方法。您的更改将丢失。只有在从该iframe中删除信息时,这才有效,而不是在操作iframe中的元素时。找到iframe元素并切换到它通常更好、更安全