在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方法,是为了方便看到运行的效果。