我在选择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
真的需要一些帮助...
答案 0 :(得分:3)
您是否尝试过使用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();')
要获得选择器和/或XPath,您需要使用浏览器来检查元素(在我的情况下为Chrome)。右键单击元素。单击“检查”。然后右键单击HTML元素,然后单击复制>复制Xpath或复制>复制选择器。
如果这对我不起作用,我最后的办法就是转到iframe的网址。为此,您需要右键点击iframe所在网页的区域,然后点击{{ 1}}。然后它将引导您进入新页面。该页面的网址将在View Frame Source
后显示在浏览器的顶部。然后,您只需导航到该网址:
view-source:
现在您可以访问iframe中的元素。如果您在iframe中操作元素然后退出iframe,我不建议使用此方法。您的更改将会丢失。这只有在你从iframe中删除信息时才有效,而不是在你操纵其中的元素时。找到iframe元素并切换到它通常会更好更安全。