Python selenium在多个IFrame中定位元素
我不熟悉Selenium for Python,并尝试在多个iFrame中定位元素。 这是我能看到的DOM元素Python selenium在多个IFrame中定位元素,python,selenium,iframe,selenium-webdriver,Python,Selenium,Iframe,Selenium Webdriver,我不熟悉Selenium for Python,并尝试在多个iFrame中定位元素。 这是我能看到的DOM元素 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head>...</head> <body> <form> ... <div class="page">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>...</head>
<body>
<form>
...
<div class="page">
<div class="main clear" style="z-index: 20; position:relative;">
<div id="placeOrder">
<iframe src="BuyFlow.aspx" frameborder="0" width="1150" height="950">
#document
<html>
<body>
<form>
...
<iframe id="CreativeLiftFrame">
#document
<html>
...
<body id="multiple-addresses">
...
</body>
</html>
</iframe>
</form>
</body>
</html>
</iframe>
</div>
</div>
</div>
</form>
</body>
</html>
结果,我在控制台上得到了2个输出
CreativeLiftFrame
None
如您所见,selenium驱动程序找到了第二个iframe
,但无法在第二个iframe
中找到body
标记的id
我不确定如何处理它。通常,在Selenium中导航帧时,以下方法可能是最可靠的 在每次帧更改时,返回根帧或默认值:
driver.switch_to.default_content()
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//Some XPATH here')))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//Some Xpath here')))
在您的情况下,切换到默认值,然后切换到第一个子项,然后切换到下一个子项,依此类推。在下一帧切换中,重复此操作-首先是默认设置,然后是第一个子项,以此类推
我还想添加一个选项,您正在通过tag_名称搜索帧,这不是很具体。整个文档中有多少个具有该标签名称的标签
如果在该框架上确实没有唯一的id
或name
,则可以使用如下方式通过框架的src
进行搜索:
By.XPath("//iframe[contains(@src,'<src url here')]")
By.XPath(“//iframe[contains(@src),根据您共享的HTML检索第二个子项的body标记的id
,您可以使用以下代码:
# Switch to the first iframe
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@src='BuyFlow.aspx']")))
# Fill in Address and ZipCode inputbox and submit form
address_input.send_keys(address)
postcode_input.send_keys(postcode)
postcode_input.send_keys(Keys.RETURN)
# Check Available - Inner iframe
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"CreativeLiftFrame")))
print(WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body'))).get_attribute("id"))
我在您的代码中看到两条print语句和三行输出。是什么产生了错误?嗨,一条是exception。我理解,但是是什么命令产生了异常?我以>>>python run.py的形式运行脚本。我的意思是上面的代码是snippet,另一条代码发生了异常。您发布的脚本根本没有运行;)
# Switch to the first iframe
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@src='BuyFlow.aspx']")))
# Fill in Address and ZipCode inputbox and submit form
address_input.send_keys(address)
postcode_input.send_keys(postcode)
postcode_input.send_keys(Keys.RETURN)
# Check Available - Inner iframe
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"CreativeLiftFrame")))
print(WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body'))).get_attribute("id"))