第三章 Webdriver Java API简介(下)

------Web自动化测试之Webdriver+TestNG--从零到熟练(系列)css

3.5  Xpath定位方法深刻探讨

相比cssSelector,xpath是我比较经常使用的一种定位元素的方式,由于它很方便,缺点是,消耗系统性能。若是Xpath使用的比较好,几乎能够定位到任何页面元素,并且受页面变化影响较小。html

(1)经常使用的Xpath定位方法及其特色java

  • Ø 使用绝对路径定位元素。

例如:driver.findElement(By.xpath("/html/body/div/form/input"))。python

特色:这个路径是从网页起始标签开始一直到要定位的元素的路径,若是要定位的元素在页面最下面,则这个Xpath路径会很是长。若是在要定位的元素与页面开始之间的元素有任何增减,元素定位就会失败。web

  • Ø 使用相对路径定位元素。

例如:driver. findElement(By.xpath ("//input") ) 返回查找到的第一个符合条件的元素。跨域

特色:相对路径通常只会包含与被定位元素最近的几层元素有关,相对路径写的好的话,页面变更影响最小,并且定位准确。数组

  • Ø 使用索引定位元素,索引的初始值为1,注意与数组等区分开。

例如:driver. findElement(By.xpath ("//input[2]") )返回查找到的第二个符合条件的元素。安全

特色:若是一个页面中有多个类似的元素,或是一个层下面有多个一样的元素的时候,须要用索引的方法来定位,不然没法区分。app

  • Ø 结合属性值来定位元素

  例如:driver. findElement(By.xpath ("//input[@id='username']"));函数

driver. findElement(By.xpath ("//img[@alt='flowr']"));

特色:属性定位也是比较经常使用的方法,若是元素中没有常见的id,name,class等直接有方法可调用的属性,也能够查找元素中是否有其余能惟一标识元素的属性,若是有,就能够用此方法定位。

  • Ø 使用逻辑运算符,结合属性值定位元素,andor

例如:driver.findElement(By.xpath("//input[@id='username' and @name='userID']"));

特色:多个属性值联合定位,更能准肯定位到元素。而且若是多个相同标签的元素,若是其包含的属性值有不一样的,也能够用这个方法区分开来。

  • Ø 使用属性名来定位元素。

例如:driver. findElement(By.xpath ("//input[@button]"))

特色:此方法能够区分同一种标签,含有不一样属性名的元素。定位相对简单一些儿,但也一样存在着没法区分同种标签含有同种属性名的多个元素,这个时候要配合索引定位才行。

  • Ø 相似于cssSlector,使用部分属性值匹配元素.

例如:

(a)starts-with()   

driver. findElement(By.xpath ("//input[stars-with(@id,'user')]"))

(b)ends-with()       

driver. findElement(By.xpath ("//input[ends-with(@id,'name')]"))

(c)contains()       

例如:driver. findElement(By.xpath ("//input[contains(@id,"ernam")]"))

   特色:此方法更加灵活,能够定位属性值不太规律,或是部分变更,中间有空格的状况。注:若是属性值中间包含空格,Webdriver定位的时候容易出错,时而能定位到时而定位不到,因此应该避免用含用空格的属性值定位。能够采用此方法,进行部分属性值定位。

  • Ø 使用任意属性值匹配元素

例如:driver. findElement(By.xpath ("//input[@*='username']"))

特色:此方法至关于模糊查询,只要欲定位的标签,如input中任何属性值等于‘username’,就能匹配成功。缺点,可能会匹配含有这个属性值的其余元素,因此咱们在定位的时候要查看一下这个元素值在页面中是否惟一。

(2)运用Xpath定位元素的思路

当咱们在作自动化测试的时候,欲对一个页面元素定位,经过上面咱们讲到的选择定位方法筛选后,决定用Xpath定位了,此时咱们应该怎么写Xpath呢?请按如下步骤来分析:

(a)先看一个这个元素是否有明显的,惟一的属性值。若是有,咱们就用相对路径加属性值定位,这是最简单准确的定位方法。如://input[@alog-alias=’search’]。

(b)若是要定位的元素,不符合上面的特症,元素属性要么是动态的,要么就是不能区分这个元素的,还有就是属性值中间有空格的状况,都没法定位。因此今后元素开始,向他的上一层查找。

(c)当遇到了一个符合条件的元素时,对其写Xpath,而后在Selenium IDE中验证是否能定位到该元素。如://div[@type=’good’],在Selenium IDE中验证能定位到这个div。

(d)而后从这个元素开始,一级级往下写,真到要定位的元素为止。若是你比较确定写的是正确的,能够写完后再验证,若是不愿定,就写一层,用Selenium IDE验证一下,以确保安全。如://div[@type=’good’]/div/input

(e)当Selenium IDE定位成功后,再放到测试用例中去调试运行。虽然Selenium IDE能定位到的代码也能定位到,不过还有由于延迟,操做顺序等会影响代码定位的因素存在。

3.6 元素定位不到的缘由及解决办法

在咱们编写自动化测试用例的过程当中,常常会遇到元素定位不到的现象,有的时候咱们用Selenium IDE检查的时候也能在Firebug中看到,但是运行代码的时候,老是提示元素找不到。通过我以往和经验和你们在网上的讨论,我总结了如下几种状况:

(1)定位属性值是动态变化的状况

现象:在咱们定位元素的时候,发现有id, name或其余的属性存在,因而就用相应的定位方法去定位。但是运行的时候提示定位不到,而后咱们再去查看元素的时候,发现属性值和咱们写代码的时候不同了。

缘由:一般产生这种状况的缘由就是你使用的属性值是动态变化的,主要表现有属性值是一串数据,或是字符加一串数据等状况。页面加载一次变化一次,每次都不相同。

解决办法:咱们应尽可能避免用这样的属性值去定位,而采用这个元素下的其余固定不变的属性值。或是向上层查找,采用Xpath定位。

(2)Iframe中的元素定位出错的状况

现象:咱们在定位元素的时候,查看网页源码,发现有iframe存在。但是咱们没有作特殊处理,而是直接用通用的定位方法,name ,id,  xpath或者CSS来定位。用Selenium IDE验证能查找到元素,但是运行测试用例的时候,老是元素找不到。

缘由:在咱们运行测试脚本的时候,代码获取的是页面的句柄,而iframe在句柄中是当成一个元素来处理的。脚本是没有办法本身去iframe中去定位元素的,因此当搜索完页面时,发现找不到要定位的元素,就当错误处理。

解决办法:当须要定位iframe中的元素的时候,先将句柄切换到iframe中(driver.switchTo().frame("framename");),而后再去定位,就能定位到要测试的元素。

(3)不一样页面或iframe切换时元素定位状况

现象:当咱们在编写测试用例的时候,会遇到打开一个新页面,或是切换到一个新的iframe中,而后再去定位元素进行操做。可是咱们的定位方法写的没有问题,并且在Selenium IDE中也验证经过,但是代码运行的时候仍是会提示找不到元素。

缘由:其实这个和定位iframe中元素的状况是同样的,在打开一个页面或是切换到一个iframe的时候,driver获取的是当前页面或是iframe的句柄。当你的操做切换到新的页面或是iframe的时候,若是代码不去作相应的切换,查找元素的时候还会在原来的句柄下查找,固然会出现查找不到的状况。

解决办法:当操做切换页面或是iframe的时候,咱们的测试脚本也要作相应的切换,选择新打开的页面或是切换到新的iframe下。而后再去定位的时候,就会在新页面或是iframe下定位了。

(4)Xpath编写出错的状况

现象:若是咱们对一个元素编写了对应的Xpath,而后在没有经过Selenium IDE进行验证的状况吧,就去编写代码执行测试用例。会出现查找不到元素的状况,或是页面发生了变化,致使Xpath路径有了变化,也会查找不到元素。

缘由:主要的问题就是Xpath编写出错了,或是页面有改动。无论是增长了新的模块或是隐藏的div,都会影响Xpath路径的。

解决办法:将代码中的Xpath拷出来,放到Selenium IDE中进行验证。若是出错了,就作相应的修改。这个也是代码维护中当遇到的问题,被测试对象变化,致使测试用例的修改。

(5)操做速度过快,被定位的元素没有加载出来的状况

现象:在测试用例运行过程当中,会出现被定位的元素有的时候能定位的到,有的时候却定位不到的现象。而咱们去页面上验证咱们的定位方法的时候,没有一点儿问题,显示不是定位方法写错了。

缘由:这种状况多半是由于测试用例执行到代码的时候,被定位元素没有加载出来形成的。网速缘由,执行代码的机器缘由,都会形成加载比程序执行的慢的状况。

解决办法:在咱们定位元素以前,评估一下页面的加载状况,若是有加载慢的地方,须要添加必定等待时间self.sleep(5000),等上几秒后再去定位操做。

(6)定位页面嵌入式元素的状况

现象:在页面中会有一些儿嵌入式元素,如object,播放器等。这个时候,咱们对其操做的时候,是没法定位到上面的元素的。

缘由:嵌入式元素对webdriver来讲是一个元素,无论里面包含多少元素,都没法操做。对于object对象,网上有说要对相应的Flash从新编译,添加相应的代码或是控件才能定位。但这样同样又不安全了,因此嵌入式对象一直是自动化测试的盲区。

解决办法:嵌入式对象若是是简单的单击操做,但是用模拟鼠标单击相应的区域,就能完成操做。若是是输入操做,咱们能够先模拟点击输入区,而后模拟键盘进行输入。除此以外,好像也没有什么好的办法。

(7)firefox安全性报错的状况

现象:firefox安全性强,不容许跨域调用出现报错,错误描述:uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMNSHTMLDocument.execCommand]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location:

缘由:这是由于firefox安全性强,不容许跨域调用。

解决办法:Firefox 要取消XMLHttpRequest的跨域限制的话,

第一是从 about:config 里设置 signed.applets.codebase_principal_support = true; (地址栏输入about:config 便可进行firefox设置)。

第二就是在open的代码函数前加入相似以下的代码:

try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");

}

catch (e)

 {

alert("Permission UniversalBrowserRead denied.");

 }

对错误进行处理。

3.7 检查点的设置

   自动化测试不像手工测试,在执行测试用例的过程当中,咱们能够随时看到结果,而后能判断正确与否。而自动化测试对应的就是检查点,若是不设置检查点,只有测 试步骤的自动化测试是没有任何做用的。由于执行步骤执行完了,结果不是咱们想要的时候,测试用例也是正确的。因此检查点才是自动化测试执行成功或是失败的 检验标准,而检查点的设置是发现Bug的关键。

3.7.1 经常使用的检测点设置方法

   咱们经过了一系列的操做后,就须要检查测试执行的结果,经常使用的就是Assert相关的函数。下面咱们谈一下最经常使用的两种方法:

(1)手工设置检测点

在咱们测试用例执行完成以后,对测试结果进行检测。咱们仍是个例子来讲明一下:

例子:在众筹网上喜欢一个项目,在进行了一系列的喜欢操做后,咱们要检测操做是否成功。

  • 进入到“喜欢的项目”列表页,检查是否有刚刚喜欢的项目。
  • 咱们能够直观地看到有喜欢的项目,但是怎么用程序判断呢?如图3.7.1所示:

 



3.7.1 检查喜欢的项目

Ø  咱们要先定位项目名称“Girls Summit组合首张EP众筹”对应的Xpath:“//div[@class='m-location']/table/tbody/tr[2]/td/div/div/p/a”,而后获取这个元素对应的Text。

Ø  将获取到的Text与“Girls Summit组合首张EP众筹”字符串进行assertEquals(),若是相同,则说明喜欢成功。不然,喜欢操做失败。

Ø  一样方法验证一下日期是否是今天,若是不是,多是先前喜欢的操做,测试用例仍然失败。

(2)Selenium IDE设置检测点

咱们也能够用Selenium IDE录制测试用例,在操做完成后,须要添加检测点,此时只要利用Selenium IDE提供的“Show all Available Commands”菜单选择合适的检测点便可。

例如:一样是上面的那个喜欢项目操做的例子,咱们的设置步骤以下:

  • 进入到“喜欢的项目”列表页,检查是否有刚刚喜欢的项目。
  • 如图3.7.2所示,右击项目名称,选择“Show all Available Commands”菜单,而后在打开的子菜单中选择合适的Assert菜单。

 



3.7.2 selenium IDE设置检测点

  • 而后Selenium IDE中就会出现相应的assert命令,如图3.7.3所示:

 


3.7.3 Selenium IDE记录Assert操做

  • 转化成相应的编码,如python,就能够直接拷到测试用例中使用。转化后的编码如:assertEqual(u"Girls Summit组合首张EP众筹", driver.findElement(By.linkText(u"Girls Summit组合首张EP众筹").text)

3.7.2 检测点设置技巧

正如咱们上面所说的,好的检测点是发现Bug的关键。可是并非说检测点设置的越多越好,由于检测点会消耗机器资源,测试用例出错的时候增长排查难度。因此如何设置检测点呢?一般能够参考以下方法:

(1)根据测试用例的侧重点设置检测点

每一个测试用例都有测试的重点,好比说,咱们测试登陆的时候,登陆是否成功,就须要检测。可是在咱们测试喜欢项目的时候,须要先登陆,这个时候登陆就不须要设置检测点了,由于在登陆测试用例中已经测试过了。

(2)设置检测点要全面

咱们在编写测试用例的时候,必定要全面了解测试操做影响了哪些儿方面。对影响到的地方,都设置一下检测点,防止出现遗漏的地方。

(3)设置检测点要灵活

设置检测点的时候,咱们一般会比较一下实际的结果和预期结果是否相同。但是有些儿时候,咱们不能简单地进行是否相等来判断。好比说:检测图片的时候,可能 会检测图片是否显示;有的检测对象在某些儿页面会换行或是添加空格,与预期有变化,这个时候咱们能够判断是否包含关键字便可。灵活使用各类判断函数,才能 使自动化测试用例更加健壮。

3.7.3 检测点设置中常见的错误

   在测试过程当中,咱们编写了测试用例,设置了检测点,但是在测试用例投入使用的过程当中,咱们不得不反复修改测试用例。由于测试用例老是通不过,维护成本很高。虽然这一部分是由于被测对象变化形成的,还有一部分缘由是检测点设置的不对。因此常见的检测点设置中的错误以下:

(1)检测动态变化的元素

检测点不能随着操做而变化,好比说翻页。咱们想要测试翻页是否成功,就不能去检测第二页第一个元素是不是某个项目。由于若是项目增长的话,第二页第一个元 素的项目可能会变化。应该先取一下第一个位置的项目名称,而后翻页,再判断如今第一个位置的项目是否是和刚刚获取的项目名称相同,若是不一样,就证实翻页成 功。

(2)遗漏检测点

在一个测试用例中,咱们要检测全部影响到的地方。如喜欢项目操做,若是咱们只检测个人喜欢项目列表中有没有刚刚喜欢的项目,这是不够的。还要检测一下这个项目的喜欢数据是否+1,喜欢项目的入口是否变成已喜欢等相关检测点。

(3)检测点设置过多

既然上面讲到,检测点是检测Bug的关键,咱们就在每一步操做后添加检测点。这样作也是多余的,虽然增长检测点,更加安全一点儿,可是过多的检测点影响测试用例运行。并且测试用例若是出错了,咱们去定位错误的时候,是很是困难,或是一个测试用例出错会致使相关的测试用例没法执行。

(4)忘记设置检测点或是检测点不是测试重点

新手写自动化测试用例的时候,每每会写了每一步的测试操做代码,没有添加对应的检测点或是检测点设置不正确。明明是登陆操做,操做完成以后却检测页面显示是否正确,这样会无论操做成功与否,测试用例都不会报错,使自动化测试用例失去了意义。

(5)检测须要刷新才有反映的元素

在测试的时候,有些儿元素在操做完成后须要刷新一下页面才能显示出操做的结果。手工测试的时候,通常会触发刷新操做,但是自动化的时候,若是不刷新,就不符合预期结果。因此咱们要添加刷新页面的代码,而后再去检测。

这几种是常见的错误,固然也会有一些比较奇葩的检测点设置错误的状况。在此也不能一下列举了,遇到问题,要多尝试几种方法,会在网上搜索解决办法,这也是学习自动化测试必备的技能。

3.8 本章小结

本章咱们讲解了Webdriver java API的一些基本操做和页面元素的定位方法,检测点的设置以及常见的错误。经过本章的学习,咱们对页面元素的定位及相关操做有了进一步的了解。在此咱们重复了python+webdriver教程中的内容,但愿对没有看过那个教程的同窗有所帮助。下章咱们开始讲解,如何从须要开始一步步到自动化测试用例的编写,运行,以调试输出。

相关文章
相关标签/搜索