表单切换

在Web开发中,有一种特殊的标签叫做iframe,就是内嵌框架。内嵌框架能够在一个页面下同时打开多个网页,这些iframe以父子、兄弟的方式组织在一个页面中。在WebDriver中,每次只能对一个iframe进行操作,如果我们想切换iframe,该如何做呢?

WebDriver针对多iframe的场景提供了switch_to_iframe的方法。API方法:

# 切换iframe, 已经废弃
# id,被切换的id
switch_to_iframe(self, id)
# 切换iframe,新方法
swich_to.frame(self, id)

看一个实例,如下页面:

对应的网页源码:

<html>
    <body>
        <div class="alert" align="center">The link 
            <a class="alert-link" href="http://www.baidu.com"> 
              baidu 
            </a>
        </div>
        <div class="row-fluid">
            <div class="span-ifrme" align="center">
                <h4 align="center">iframe</h4>>
                <!--内嵌iframe-->
                 <iframe id="iname" name="nf" src="https://www.baidu.com" width="800" height="600"></iframe>>
            </div>
        </div>
    </body>
</html>

看上面网页代码,有一个iframe,id为iname,src就是百度的链接(https://www.baidu.com),默认情况下,webdriver打开这个html的时候,指向的就是最外层的页面,如果需要定位iframe内部的元素,就需要通过switch来切换。如下示例代码:

from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("file:///D:/iframe.html")
# 切换到内联iframe中,并在内联的百度页面输入Bela搜索
# driver.switch_to_frame("iname"), 方法已经废弃,使用下面新方法
driver.switch_to.frame("iname")
driver.find_elment_by_xpath(“//input[@id='kw']”).send_keys("Bela")
driver.find_elment_by_xpath(“//input[@id='su']”).click()
sleep(2)

# 切换回原来的iframe,switch_to.parent_iframe
driver.switch_to.parent_iframe()
driver.find_element_by_xpath("//a[@href='http://www.baidu.com']").click()
sleep(3)
driver.quit()

这段代码分为两部分,切换到id为iname的iframe,然后切换回来。id为iname的iframe与原网页是一个父子管子,所以切换回来就是使用switch_to.parent_iframe()。其中有几个sleep方法,是为了方便看到运行的效果。

IT赶路人

专注IT知识分享