frame/iframe多表单切换

应用场景:

在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
 
frame.html
 1 <html>
 2 <head>
 3 <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.mincss" rel="stylesheet" />
 4     <script type="text/javascript">$(document).ready(function(){});</script>
 5 </head>
 6 <body>
 7     <div class="row-fluid">
 8         <div class="span10 well">
 9             <h3>frame</h3>
10                 <iframe id="if" name="nf" src="http://www.baidu.com" width="1600" height="800"></iframe>
11         </div>
12     </div>
13 </body>
14     <script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
15 </html>

在上面的html代码中,我通过iframe表单嵌入一个百度页面,用浏览器打开后如图所示:

这时候直接定位页面上的百度输入框一定会报错:找不到元素。因此可以使用switch_to.frame()先找到frame.html中的

 1 #导包
 2 from selenium import webdriver
 3 from time import sleep
 4 #定义浏览器句柄
 5 driver=webdriver.Chrome()
 6 #打开本地frame.html
 7 url="file:///C:/Users/Charseki/Desktop/Web%E8%87%AA%E5%8A%A8%E5%8C%96/iframe%E5%A4%9A%E8%A1%A8%E5%8D%95%E5%88%87%E6%8D%A2/frame.html"
 8 driver.get(url)
 9 #窗口最大化
10 driver.maximize_window()
11 #直接去拿百度输入框元素
12 #driver.find_element_by_xpath('//input[@id="kw"]')
13 #发现报错,因为元素在iframe表单里面
14 #正确的方法:进入到iframe表单,再去获取百度输入框元素
15 driver.switch_to.frame(driver.find_element_by_xpath('//iframe[contains(@src,"www.baidu.com")]'))
16 driver.find_element_by_xpath('//input[@id="kw"]').send_keys("可以操作元素了")
17 #点击“百度一下”按钮
18 driver.find_element_by_xpath('//input[@id="su"]').click()
19 sleep(3)
20 driver.quit()

 

 switch_to.frame()默认可以直接取表单的id或name属性。如果iframe没有可以用的id和name属性,则可以通过下面的方式进行定位。

1 #先通过xpath定位到iframe
2 xf=driver.find_element_by_xpath('//*[@class="if"]')
3 #再将定位对象传给switch_to.frame()方法
4 driver.switch_to.frame(xf)
5 ......
6 driver.switch_to.parent_frame()

如果完成了在当前表单上的操作,则可以通过switch_to.parent_frame()方法跳出当前一级表单。该方法默认对应于离它最近的switch_to.frame()方法。除此之外,在进入多级表单的情况下,还可以通过switch_to.default_content()跳回最外层的页面。

----------------------------------------------------------------------------------------------------------------------------------------------------------------
Talk is cheap,show me the code.

 

posted @ 2019-08-04 13:51  charseki  阅读(741)  评论(0编辑  收藏  举报