Python selenium在多个IFrame中定位元素

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">

我不熟悉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>
结果,我在控制台上得到了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"))