Python selenium在多个iframe中定位元素

时间:2018-02-02 17:12:34

标签: 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">
               <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>

我不知道如何处理它。

2 个答案:

答案 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的标签?

如果该框架上确实没有唯一的idname,您可以使用以下内容搜索框架src

By.XPath("//iframe[contains(@src,'<src url here')]")