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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容