前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Frame在自动化中的处理

Frame在自动化中的处理

作者头像
无涯WuYa
发布2018-10-25 16:19:42
8670
发布2018-10-25 16:19:42
举报

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>是定义内联的子窗口。

1.1 处理未嵌套的frame

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>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;

<a href="10-20(2).html" target="10-20">吻吻你</a>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;

<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>

&nbsp; &nbsp;&nbsp;&nbsp; 很久以前,在一个村庄里有一个远近闻名的财主。他从不思考自己所说的话,为此得罪了不少人。<br>

</body>

</html>

10-20(2).html的源码为:

<html>

<head>

<title>内容页面</title>

</head>

<body>

<center>

<font size=5>吻吻你</font><br><br>

</center>

&nbsp; &nbsp;&nbsp;&nbsp; 有个深圳人到北京出差,因人生地不熟,走到街上,往回走时竟找不着原来的路子,于是向路旁一个年轻姑娘问路:“小姐,吻吻(问问)你啦……”话未说完,脸上“啪”地挨了一巴掌,打得他丈二和尚摸不着头脑,捂着发红的脸颊,冲姑娘叫道:“你这个小姐,怎么乱打人?”<br>

</body>

</html>

10-20(3).html的源码为:

<html>

<head>

<title>内容页面</title>

</head>

<body>

<center>

<font size=5>吻吻你</font><br><br>

</center>

&nbsp; &nbsp;&nbsp;&nbsp; 豫西南某县的方言,对不满意的事物,不叫“不好”,也不叫“太差”,而是叫“日巴杈”。不久前,外地有个剧团到该县县城剧场演出。第一场演出结束时,剧团团长约剧场经理一道走出剧场,到观众中去<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()

1.2 iframe无ID的处理

有时候,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>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;

<a href="10-20(2).html" target="10-20">吻吻你</a>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;

<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()

1.3 iframe嵌套的处理

自动化的测试中,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()

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.1 处理未嵌套的frame
  • 1.2 iframe无ID的处理
  • 1.3 iframe嵌套的处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档