在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
frame.html
<html>
<head>
<link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" />
<script type="text/javascript">&(document).ready(function(){});
</script>
</head>
<body>
<div class="row-fluid">
<div class="span10 well">
<h3>frame</h3>
<iframe id="if" name="nf" src="http://www.baidu.com" width="800" height="300">
</iframe
</div>
</div>
</body>
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
</html>
通过iframe表单嵌入一个百度页面,用浏览器打开如下图:
这时候直接定位页面上的百度的输入框一定会报错:找不到元素。因此可以使用switch_to.frame()先找到frame.html中的<iframe>标签,然后再定位百度输入框。
frame.py
from selenium import webdriver import os,time driver=webdriver.Firefox() file_path='file:///' + os.path.abspath('frame.html') driver.get(file_path) #切换到iframe(id="if") driver.switch_to.frame("if") #下面就可以正常的操作元素了 driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() time.sleep(3) driver.quit()
switch_to.frame默认可以直接取表单的id或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式定位。
frame1.py
from selenium import webdriver import os,time driver=webdriver.Firefox() file_path='file:///' + os.path.abspath('frame.html') driver.get(file_path) #先通过xpth定位到iframe xf=driver.find_element_by_xpath('//*[@name="nf"]') #再将定位对象传给switch_to.frame()方法 driver.switch_to.frame(xf) driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() driver.switch_to.parent_frame() time.sleep(3) driver.quit()
如果完成了在当前表单上的操作,则可以通过switch_to.parent_frame()方法跳出当前一级表单。该方法默认对应于离它最近的switch_to.frame()方法。除此之外,在进入多级表单的情况下,还可以通过switch_to.default_content()跳回最外层的页面。