1 Frame的处理
在自动化中,如果一个元素定位不到,那么最大可能是在iframe中,我们先了解frame。frame是html中的框架,在html中,所谓框架就是可以在同一个浏览器窗口中显示不止一个页面。而基于html的框架,又分为垂直框架和水平框架,如下分别使用html的代码来演示垂直框架和水平框架的源码以及示例图。
见如下垂直框架的html代码:
<html>
<framesetcols="25%,50%,25%">
<framesrc="/example/html/frame_a.html">
<framesrc="/example/html/frame_b.html">
<framesrc="/example/html/frame_c.html">
</frameset>
</html>
那么相对应的水平框架的html代码为:
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<frameset rows="25%,50%,25%">
<framesrc="/example/html/frame_a.html">
<frame src="/example/html/frame_b.html">
<framesrc="/example/html/frame_c.html">
</frameset>
</html>
在html中,<frameset>是框架结构的标签,<frame>是框架标签,<iframe>是定义内联的子窗口。
frame存在二种,一种是嵌套的,一种是未嵌套的,本小节部分,主要介绍,frame没嵌套的时候,在frame中的对象的处理。见如下的案例图:
我们点击“不会说话的主人”,然后获取文本域中标题是不是“不会说话的主人”。该案例的html代码为:
<html>
<head>
<title>浮动框架窗口的链接</title>
</head>
<body>
<center>
<img src="趣味图.jpg"><br><br>
<a href="10-20(1).html" target="10-20">不会说话的主人</a>
<a href="10-20(2).html" target="10-20">吻吻你</a>
<a href="10-20(3).html" target="10-20">方言误</a>
<br><br>
</center>
<iframe id="test"src="10-20(1).html" name="10-20" width="500"height="170">
</iframe>
</body>
</html>
10-20(1).html的源码为:
<html>
<head>
<title>内容页面</title>
</head>
<body>
<center>
<font size=5>不会说话的主人</font><br><br>
</center>
很久以前,在一个村庄里有一个远近闻名的财主。他从不思考自己所说的话,为此得罪了不少人。<br>
</body>
</html>
10-20(2).html的源码为:
<html>
<head>
<title>内容页面</title>
</head>
<body>
<center>
<font size=5>吻吻你</font><br><br>
</center>
有个深圳人到北京出差,因人生地不熟,走到街上,往回走时竟找不着原来的路子,于是向路旁一个年轻姑娘问路:“小姐,吻吻(问问)你啦……”话未说完,脸上“啪”地挨了一巴掌,打得他丈二和尚摸不着头脑,捂着发红的脸颊,冲姑娘叫道:“你这个小姐,怎么乱打人?”<br>
</body>
</html>
10-20(3).html的源码为:
<html>
<head>
<title>内容页面</title>
</head>
<body>
<center>
<font size=5>吻吻你</font><br><br>
</center>
豫西南某县的方言,对不满意的事物,不叫“不好”,也不叫“太差”,而是叫“日巴杈”。不久前,外地有个剧团到该县县城剧场演出。第一场演出结束时,剧团团长约剧场经理一道走出剧场,到观众中去<br>
</body>
</html>
对应的图片为;
见该frame框架的html的案例代码的结构:
那么实现这样的一个过程,我们来分析源码,我们需要获取"不会说话的主人",它的xpath="html/body/center/font",但是我们发现无法定位到,这是因为它存在于iframe的子窗口中,我们必须先进入到iframe中,然后才可以对里面的对象进行操作,进入的方法为:driver.switch_to_frame(ID),里面是iframe的id,依据源码<iframe id="test" align="middle" width="500" height="170" name="10-20" src="10-20(1).html">
我们可以获取到,该iframe的ID为test,那么就为:driver.switch_to_frame('test'),我们实现点击"不会说话的主人",然后验证标题是不是"不会说话的主人",实现的测试代码如下:
#coding:utf-8
fromselenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///C:/Users/liwangping/Desktop/HTML+css/%E6%BA%90%E6%96%87%E4%BB%B6/10/10-21.html')
#点击“请点击”
driver.find_element_by_link_text(u'不会说话的主人').click()
driver.switch_to_frame('test')
assertdriver.find_element_by_xpath("html/body/center/font").text in u'不会说话的主人'
driver.quit()
有时候,iframe开发写的时候,没有写ID,导致在driver.switch_to_frame(ID)的时候,不知道如何定位才好,当iframe无ID的时候,我们可以依据索引来处理,切记索引是从0开始的,查看iframe在页面中的位置,确定索引的位置。我们任然已之前的页面作为案例来说明,我们去掉iframe的id,去掉后,html的源码为:
<html>
<head>
<title>浮动框架窗口的链接</title>
</head>
<body>
<center>
<img src="趣味图.jpg"><br><br>
<a href="10-20(1).html" target="10-20">不会说话的主人</a>
<a href="10-20(2).html" target="10-20">吻吻你</a>
<a href="10-20(3).html" target="10-20">方言误</a>
<br><br>
</center>
<iframe src="10-20(1).html" name="10-20"width="500" height="170">
</iframe>
</body>
</html>
那么,再次实现点击"不会说话的主人",获取到标题是否为"不会说话的主人",实现的测试脚本为:
#coding:utf-8
fromselenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///C:/Users/liwangping/Desktop/HTML+css/%E6%BA%90%E6%96%87%E4%BB%B6/10/10-21.html')
#点击“请点击”
driver.find_element_by_link_text(u'不会说话的主人').click()
driver.switch_to_frame(0)
assertdriver.find_element_by_xpath("html/body/center/font").text in u'不会说话的主人'
driver.quit()
自动化的测试中,iframe的嵌套也是很常见的,对于嵌套的iframe,我们处理的方式是先进入到iframe的父节点,再进入到子节点,然后可以对子节点里面的对象进行处理和操作。如我们的so.html文件,源码为:
<html>
<head>
<title></title>
</head>
<body>
<iframe id="test"src="bing.html" width="1200" height="600"align="center">
</iframe>
</body>
</html>
bing.html的文件源码为:
<html>
<head>
<metahttp-equiv="content-type" content="text/html;charset=utf-8"/>
<title>inner</title>
</head>
<body>
<iframeid="test2" src="http://www.bing.com" width="1500"height="500">
</iframe>
</body>
</html>
依据so.html和bing.html的源码,我们可以得到iframe出现了嵌套,id=test2的iframe被嵌套在id=test中,打开so.html,见效果图:
如果我们要在bing的搜索输入框输入搜索的关键字,我们先定位到搜索输入框的位置,见代码的截图;
依据如上的截图,我们看到,我们如果想操作bing搜索输入框的,得首先进入到id=test的iframe,再进入到id=test2的iframe,才可以操作搜索输入框,见实现的代码:
#coding:utf-8
fromselenium import webdriver
fromtime import sleep
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///F:/html/so.html')
#进入到第一层iframe
driver.switch_to_frame('test')
#进入到第二层的iframe
driver.switch_to_frame('test2')
driver.find_element_by_id('sb_form_q').send_keys('webdriver')
sleep(6)
driver.quit()