我们在浏览器的操作主要分为两大类,第一类是对浏览器自身的操作,这类操作在任何的界面都是通用的,比如说控制界面前进,后退,刷新,最小化,最大化,关闭,打开新标签,输入url等。第二类是对界面元素的操作,这类操作是在被打开界面上进行,主要针对页面中某个具体的元素或控件,比如在某个特定的输入框输入内容,或者在某张照片和按钮上施行点击操作。
因为页面元素操作,往往是在一个具体的元素上执行,所以必须要先找到这个元素。才能执行操作,在手工测试工作中,这基本不是一个问题,因为我们使用浏览器的经验非常丰富,条件反射就能判定哪里是输入框,哪里是图片,但是在自动化测试中,我们是使用程序操作页面元素,工具不会有任何经验,所以测试员需要说明被操作元素在页面中的路径,并且把这个程序告诉程序,程序在通过这个路径在网页中进行寻找。
元素路径是寻找该元素的依据,目前可以使用三种方式来表示,第一种是界面的DOM结构,第二种是坐标,第三种是通过图像识别技术,selenium主要使用DOM结构路径来查找元素,这种方式的好处是兼容性强,不管是在电脑端还是在手机端,也不管窗口的大小如何设置,只要这个DOM结构的数据不变,就能找到元素。不好的地方在于需要学习网页的这种DOM结构,以及如何编写定位器。
首先我们看看什么是DOM
文档对象模型,DOM是html和xml文档的编程接口,它提供了对文档结构的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,他会将web页面和脚本或程序语言链接起来。
网页是由html文档编写,在浏览器中,通常可以用F12快捷键查看网页的html源代码。一个html文档由标签组成,标签之间可以并列排序,也可以嵌套排列。一个标签由标签名称,标签属性以及文本构成,被嵌套的标签被称为子标签。
HTML
input
checkbox
radio
submit
file
form
a
img
iframe
每个元素都有自己喜欢用的属性,比如input通常使用name属性,a标签通常用src属性和链接文本。
html标签的构成决定了selenium元素定位的方式:
id
name
class name
tag name
link text
partial link text
DOM
html这些标签归根结底就是字符串,不方便被程序控制和访问,因此浏览器通过DOM这种方式把文档转化成对象,方便程序进行访问。现在我们通过F12快捷键打开浏览器的控制台,对打开的网页进行一些简单的DOM操作,在控制台当中输入document,浏览器当中将会显示整个html标签内容,输入document.boby 显示打开页面的整个boby标签。这样,通过DOM面向对象的编程方式能非常方便的获取到想要的元素,也非常方便的执行浏览器操作
上面我们编写的代码是javascript代码,实际上DOM和编程语言没有直接关系,使用其他语言同样是可以操作DOM的,比如使用python语言操作DOM类似于:
Python DOM example
import xml.dom.minidom as m doc = m.parse("C:\Projects\Py\chap1.xml"); doc.nodeName # DOM property of document object; p_list = doc.getElementsByTagName("para");
然后我们看看怎么编写元素定位器。
html是由标签组成的,一个网页中包含的标签有很多,他们会形成很深的嵌套关系,因此我们会从最外层的html标签开始,沿着body以及其他子标签的嵌套顺序,一直找到需要操作的标签,沿途经过的标签就形成了查找元素需要的完整路径,我们还会根据属性和文本在路径上做一些标签,让程序更快捷的找到需要的元素,在一个完整的表达式中通常包含了标签之间的嵌套关系,标签属性以及文本内容等信息。
知道元素定位表达式的作用之后,我们来看看selenium中具体是如何进行元素定位的。selenium支持定位的元素方法有很多种,其中功能最强大的是css选择器和xpath。比如用css选择器举个例子。
首先,我们编写css选择器的元素定位器#kw 它表示需要找一个属性id,等于kw的元素,然后我们将元素定位器传给selenium提供的find_element 方法,让他帮助我们去查找这个元素,将得到的元素对象存储在变量当中,如果程序没有找到符合要求的元素,将会抛出异常,如果通过表达式找到不止一个元素,find_element方法只会返回第一个元素,如果想得到所有符合要求的元素,使用find_elements方法,所有结果会存到一个列表当中。
css选择器
css选择器是使用最广泛的元素定位方式,他可以组合元素关系,元素属性以及索引来查找元素,几乎所有的页面定位工具都会支持这种方式,在任意的浏览器控制台中,通过document.queryselector方法可以直接输入css选择器来定位元素。
css选择器分为基本选择器,组合选择器,分组选择器以及伪选择器。
基本选择器匹配单个要素,主要有:
元素选择器,用elementName表示,比如input表示匹配标签名为input的元素。
ID选择器,用#id 表示,比如#kw表示匹配id等于kw的元素
css选择器用classname 表示,比如container表示匹配class属性中包含container的元素。
属性选择器
通用选择器
xpath
Xpath和CSS定位元素可以结合多种条件选择,功能更加强大和灵活。如果不知怎的发现了更多的元素,需要进一步删除选定的,加上条件..
1、支持所有元素属性。
2、支持文本text
3,可以通过标签name
4,可以通过元素之间的关系。
5、元素和元素可以是任何形式的组合。
Xpath长什么样?可以在浏览器中找到复制一个xpath表达式的元素,这是做测试时的策略,另一个策略是使用chropath这样的定位插件。xpath的副本有绝对路径和相对路径。如何编写自己的和验证xpath?在浏览器源代码中按F12快捷键。
1 .浏览器,右键复制,chrpath第三方库
2,检查xpath好xpath:少一级到1-2
3。查找元素验证的xpath: CTRL + f
4。/ / input / [@ id = 'kw']基本
5.//input[@id='kw' and @name='wd'] and
6.//input[@id='kw' and text()='wd']text
7.//input[contains(text(), '')]contains
8.//input[contains(text(), '')][1]索引
9.//from//input[] 通过祖先找子孙
轴运算
查找哥哥姐姐:/ / input [@ name = 'wd']/preceding-sibling::span
查找兄弟姐妹:/ / input [@ name = 'wd'] / following -sibling :: span
查找祖先:/ / input [@ name = 'wd'] /ancestor::span
css选择器定位元素
xpath
css VS xpath
其他元素定位方式
id,class,name,link text,partial link text ,tagname
Xpath和CSS选择器有什么优点?
CSS编写更简洁
css更快CSS不支持文本定位
xpath功能更强
Xpath函数对于复杂的定位,相反更简洁
css与HTML一起使用,Xpath必须能够使用遍历DOM树。
css用途更少,xpath效率更低。也就是说,CSS和HTML是绑定在一起的,你切换到其他标记语言,XML。就不行了。Xpath是绑定DOM, DOM是什么?是HTML和JS的中介,所以生成DOM对象也需要时间,但只要有了DOM,就可以使用Xpath,这意味着Xpath使用的范围更广,手机也可以用,也可以用于其他客户端。
Xpath的效率更低Xpath在查找元素时可以上下移动。CSS只有水平。就像,当你读一本书的时候,恍惚间记得之前你提到过的一些知识点,你就会走到前面,这就是xpath。别给前面翻了,这是CSS, xpath在IE里效率会更高,其他谷歌和firefox浏览器,会更少。CSS选择器表达得更简洁。通常非常简短,但与Xpath相比,功能非常弱。
想象一下,如果包含5个class,xpath得有多复杂.
css不能用text,很尴尬