我是Selenium for Python的新手,并试图在多个iframe中定位元素。 这是我能看到的DOM元素。
<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>
我想要做的是获取第二个<body>
的{{1}}代码id
名称。
那是<iframe>
。
为了做到这一点,我编写了如下代码。
"multiple-addresses"
结果,我在控制台上获得了2个输出。
# Switch to the first iframe
iframe = driver.find_element(By.TAG_NAME, 'iframe')
driver.switch_to_frame(iframe)
# 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
second_iframe = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.TAG_NAME, 'iframe')))
driver.switch_to_frame(second_iframe)
print(second_iframe.get_attribute("id")
body = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))
print(body.get_attribute("id")
如您所见,selenium驱动程序找到了第二个CreativeLiftFrame
None
,但无法在SECOND iframe
中找到body
代码id
。< / p>
我不知道如何处理它。
答案 0 :(得分:1)
根据 HTML 您已共享以检索第二个孩子<frame>
的 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"))
答案 1 :(得分:0)
通常,在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_name搜索帧,这不是非常具体。整个文档中有多少个带有tag_name的标签?
如果该框架上确实没有唯一的id
或name
,您可以使用以下内容搜索框架src
:
By.XPath("//iframe[contains(@src,'<src url here')]")