Frame在自动化中的处理

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

原文发布于微信公众号 - Python自动化测试(wuya-python)

原文发表时间:2015-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS开发笔记

iOS开发照片框架详解(一)-- AssetsLibrary

1 概要 在 iOS 设备中,照片和视频是相当重要的一部分。最近刚好在制作一个自定义的 iOS 图片选择器,顺便整理一下 iOS 中对照片框架的使用方法。在 ...

45770
来自专栏做全栈攻城狮

小白学编程实战项目-利用Winform开发美女音乐播放器

这是小白学习软件开发系列课程,旨在帮助对电脑编程感兴趣的朋友学习并熟悉C#技术。其中基础部分已经讲解完毕,可以查看:电脑编程入门(10)-C#面向对象编程浅聊,...

30130
来自专栏编程

前端三大框架大杂烩

摘要:从angular的诞生独步天下,到现在三大框架平分天下,基本形势已经趋于稳定。每一个框架从诞生到受欢迎,都有其特定的原因和背景。不同的开发者选择时,也是依...

39150
来自专栏我就是马云飞

View的事件拦截机制浅析

为什么要去分析view的事件 记得上周刚立的flag就是关于view的事件机制。那现在我来说说我对view的感受。关于view的事件,百度google一搜。一批...

18560
来自专栏java工会

前端进阶攻略|最全的前端开源JS框架和库

47770
来自专栏从零开始学 Web 前端

从零开始学 Web 之 JavaScript(一)JavaScript概述

JavaScript历史 要了解JavaScript,我们首先要回顾一下JavaScript的诞生。在上个世纪的1995年,当时的网景公司正凭借其Naviga...

13720
来自专栏web前端教室

[web零基础课]~记一个自定义checkBox标签的进化过程&&电商项目作业检查--张潇x

继昨天讲完了jq插件的二种编写方法和区别之后,今天的web前端零基础课中,又回过头来继续把电商网站中的checkBox复选框,进行了进一步的封装与自定义。 //...

22660
来自专栏极乐技术社区

五个套路看懂微信小程序开发(下)

你或许听说过,快速入门就是要学最小必要知识。而我最近在看微信小程序的官方教程时发现,这个教程虽然简单,但对于微信小程序开发来说,80%的套路都能从这里学习到,你...

37190
来自专栏lgp20151222

Java引用外部字体(路径引用)的一些坑

然后,一路踩了jvm关于字体的坑,重点是,java的报错很随意,甚至不报错,建议直接看最后面.

24210
来自专栏极乐技术社区

微信小程序 wx.request 的封装

自学转行到前端也已近两年,也算是简书和掘金的忠实粉丝,但是以前一直惜字如金(实在是胆子小,水平又低),现在我决定视金钱如粪土(就只是脸皮厚了,水平就那样),好了...

71280

扫码关注云+社区

领取腾讯云代金券