Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本

上篇文章介绍的是css定位器,到此为止就说完了所有的定位器,从这篇开始我们就利用定位器来仔细讨论每一个网页元素的操作。众所周知,我们测试网页的时候主要就是测试网页上的商业逻辑以及数据验证,而一个完整的商业逻辑其实就是由各种各样网页元素的操作来组成。这儿随便举个商业逻辑的例子:比如我这人有个好习惯,喜欢看书,有一本书一直想买但没时间买,干脆就在网上买吧。于是打开某宝或某东,用我自己的用户名密码登录,然后在搜索框里敲了三个字 -金瓶梅,发现还有库存很开心,就把它加入购物车,最后下单结算。根据这个小逻辑写出来的test case就应该是:

1. 打开某宝或某东网站;
2. 用个人账户登录;
3. 搜索该物品;
4. 加入购物车;
5. 下单结算。

这5步需要的网页元素操作是:

1. 打开某宝或某东网站:

  • 浏览器打开网页;
    2. 用个人账户登录:
  • 在用户名文本框输入用户名;
  • 在密码文本框输入密码;
  • 验证码文本框输入验证码(看不清还得换一换);
  • 点击登录按钮;
    3. 搜索该物品:
  • 在搜索文本框里输入“金瓶梅”;
  • 点击搜素按钮;
    4. 加入购物车:
  • 点击《金瓶梅》图像按钮添加商品;
    5. 下单结算:
  • 点击付款按钮。

差不多就是这么个意思,网站不同操作会有一点不一样。你看,商业逻辑都是由对网页元素的点击或输入之类的操作来完成的。虽然基本就是鼠标点点点,键盘敲敲敲,但还是有必要形成一个完整的知识体系,所以未来几篇文章里我会尽量给大家把常用的都覆盖到。我还是继续索引式方法,每篇文章讲一个,但争取讨论得细致些,以便大家记忆和总结。

先讨论普通文本的操作,因为它最简单。介绍网页元素那篇的时候说它就是网页上极其普通的一句话,起到提示的作用,除此之外就没什么功能了。所以,它的方法也相对较少。比如我们的示例网页上那句“登录成功,正在跳转中...”,用firebug定位如下:

Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第1张图片

还是先建立一个项目,介绍元素操作这部分我还是主要用示例网页来演示,不过我也会在必要的时候用一些其它的网页。打开eclipse,新建一个叫SeleniumTextArea的java项目 -> 包com.test -> Test.java,顺便添上main函数。注意,咱们现在还属于初学,一个项目里就一个文件,比较简单,等到后面设计整个项目时就会带着大家一点一点变成多个文件,把需要的结构布局都加进来,让你自己独立完成架构。

接下来把driver声明配置好,把示例网页全屏打开:

Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第2张图片

通常,对于一个普通文本测试员们可能需要的操作是:

1. 查看文本内容;
2. 检查该文本在不在当前页面显示。

主要就这么两个。第一个好理解,咱们之前经常在使用,就是getText()。getText()得到文本内容。这个我就不多说了,之前练过很多了。直接上代码:

Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第3张图片

下一个检查文本在不在当前页面显示也是在咱们测试当中经常会碰到的情况。它使用的方法是isDisplayed()。Display意思是显示,isDisplayed()当然返回的也就是个布尔类型的值。在这个例子中,就是textArea.isDisplayed()。因为这个网页元素存在,所以返回的是true:

Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第4张图片

但是,如果一个网页元素不显示呢?按理说应该返回false对吧?那我们验证一下。我故意把前面xpath的内容写错,把”//div”写成”//div1”,这回应该不存在了吧,看看结果是不是false:

Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第5张图片

然鹅,并不是!它竟然报错了。注意,它并不会返回false,而是直接报错!为什么会出现这个情况?因为isDisplayed()有一个前提,那就是在元素已经存在的前提下,判断它显示不显示。有人说存在和显示不是一个意思么?其实不一定。有些控件可能存在,但只是隐藏状态,你并不能看见。比如打开源代码,你会看到有这么一行,里面有个控件的属性为type=”hidden”,这样它在网页上就不能显示:

Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第6张图片

hidden就是隐藏的意思,任何一个网页元素如果type=”hidden”的话就不会在网页上显示。但不显示不代表不存在,你如果定位的话还是可以定位到的,并不会报错,只是看不见而已。而且因为隐藏所以getText()也不会打印任何东西。

搞清楚存在与显示的关系后,我们就知道了,不想让它抛异常就得先判断它是否存在,只有存在了才可以用isDisplayed()。比如这个隐藏的按钮返回的就肯定是false:

Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第7张图片

觉没觉得isDisplayed()和findElement()有点像?一言不合就抛异常?心好累,现在咱们就想个办法把它们都处理了。findElement()有个兄弟叫findElements(),加了个s,表示复数。findElement()只能返回当前页面第一个匹配的元素,而findElements()则可以返回当前页面所有匹配的元素。这些匹配的元素组成一个List接口对象,所以你可以声明一个List接口对象来存储。举个例子,比如我想返回webelements.html所有匹配标签的控件,那我可以这么写:

Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第8张图片
Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第9张图片

打印的都是当前页面带有标签的控件,不信你可以照着网页源代码一个个对比,肯定不会错。这些控件全都被存入了一个叫elements的List接口对象中中,然后通过遍历List把它们全都打印出来。

那findElements()跟异常处理有啥关系?findElements()有一个大大的优点,就是不会抛异常。为什么呢?就是因为它返回的是一个List,而不是一个单独的控件对象。控件对象不存在会抛异常,但List则没有存不存在的问题呀,它只要创建出来了就一直存在,顶多你不往里装东西,里边为空而已。所以,它不抛异常,我们可以放心使用,只需要检查它里面是否有我们想找的控件对象即可。我们以前讲List的时候说它有个size()方法,可以查看里面有几个元素。如果为0,说明List为空,说明里面没有我们要找的控件,是不是也就间接证明了我们要找的控件不存在?沿着这个思路我们把之前抛异常的程序改一下:

Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本_第10张图片

我创建了一个num_elements来存匹配元素的个数。为了简单点,假设网页里要么没有匹配,要么只有一个匹配即该控件。如果确实没有匹配,程序打印“textArea不存在”。

看明白了吧?用findElements()既可以判断控件是否存在,也不抛异常。有人说抛异常也没什么呀,报个错还能提醒我程序写错了呢。怎么说呢?我的建议是对findElement()可以不用管,但尽量不让isDisplayed()抛。因为isDisplayed()方法通常用在某个检查点上,也就是咱们所谓的断言。既然是断言,我们当然希望程序每次都能告知我们test case是pass还是fail并给出确切信息,而不是一大堆的错误及异常。而findElement()不同于isDisplayed(),它通常只是用在测试步骤中,不用在断言上,抛出来反倒提醒你可能是因为步骤出错了才抛的异常。

这篇文章的代码在SeleniumTextArea里,下一篇介绍文本框(textbox)的操作。

本篇知识点及注意事项:
1.任何一个网页元素如果type=”hidden”的话就不会在网页上显示。但不显示不代表不存在,你如果定位的话还是可以定位到的,并不会报错,只是看不见而已。
2.用findElement()和isDisplayed()方法时找不到元素会抛异常,而findElements()不会抛异常,通常在断言点前先用findElements()判断元素是否存在。

你可能感兴趣的:(Selenium Web Driver自动化测试(java版)系列下半部分(12) - 元素操作 - 普通文本)