Selenium Web Driver自动化测试(java版)系列下半部分(6) - 网页控件定位工具和id定位器

这篇文章讨论selenium对于网页控件的操作。网页控件不像driver或是浏览器那样设置好直接用就可以了,操作一个网页控件我们首先要知道它在网页上的位置,找到它,然后再操作。所以我想先介绍一个必要的知识点– 控件的定位。

那怎么找到网页上的元素呢?除非是极简风格或是本身网站就简单,现在大多数网站源代码都很多很长。就即便是看起来很简单的网站,比如韩寒的“一个”(www.wufazhuce.com),打开源代码一看也是很长的。假设我现在想找下方某一篇文章的元素位置:

要是一行一行看源代码找,那肯定要花很长时间,不划算。不过没关系,现在咱们使用的三种浏览器都有自己内嵌的工具可以帮助我们找到想要的元素,不管网页多长多复杂,定位速度都很快。FireFox的内嵌工具叫Firebug,作为该浏览器其中一个插件存在。打开FireFox,选择”add-on”并搜索FireBug,可以找到该工具:

我们最好也把下面的FirePath也安装上,以后会用到。装好后我们会在浏览器右上角看到一个小虫子的图标,不过暂时还是灰色的,因为没激活。FireBug嘛,bug,小虫子。点击激活它,然后打开咱们的测试网站webelements.html就可以开始使用了。比如我想找页面上的链接“点击这里跳转”,只要把鼠标移到该链接上方->右键-> Inspect Element with Firebug(用Firebug查看元素),就可以看到这个链接元素的位置和代码,高亮显示:

我们的演示网站比较简单,大家可以在更复杂的网站上实验。

以上是FireFox。相比之下Chrome比较简单,不需要安装任何插件,因为它本身自带一个开发者工具。直接在元素上右键->Inspect(查看)就会弹出开发者工具:

IE也不需要插件,右键->Inspect Element(查看元素)即可。网页源代码不会因为浏览器的改变而发生变化,所以其实不管使用哪种浏览器,只要我们能定位到我们想要的元素就可以了。

定位到了我们想要的元素然后呢?我们可以在浏览器上鼠标右键点点点找到该元素,但和我们写的程序有什么关系呢?怎么能通过程序知道它的位置呢?所以我们要做的,就是把鼠标点出来的元素代码通过某种媒介告诉我们写的程序,而这个媒介就是定位器(Locators):

我们在eclipse里新建一个java项目叫SeleniumId,然后建包com.test -> Test.java,把该引的selenium jar包引进来,把driver设置创建好。我们还是用测试网页webelements.html做例子。直接上代码:

网页元素有8种定位器,任何一个网页元素都可以通过这8种之一找到:

1. Id;
2. Name;
3. ClassName;
4. TagName;
5. LinkText;
6. PartialLinkText;
7. CSS Locator;
8. Xpath。

还不少,后来我自己学习的时候在他人基础上编了个口诀记的:“一个id,两个link(Link, PartialLink),三个name(Name, ClassName, TagName)外加两个大bug(CSS Locator, Xpath)。”我管最后两个叫大bug因为一个网页元素可以没有id、name、link,但一定会有xpath。而且现在基本看不到不用css的网站了,所以css locator大部分情况也能通用。这二者秒杀一切网页元素,所有的都能找到,很bug。以后做例子的时候大家就能体会到了。

还记得前面咱们之前说driver还有一个方法叫findElement()吗?咱们还写了这么一句driver.findElement(),findElement的意思是找到元素。这句代码就是用来接收定位器的,让定位器作为参数传入findElement方法。

现在开始介绍第一种定位器id。id是一个网页元素的属性,它的语法格式是:

举个例子,用firefox打开咱们的webelements的网站,比如我们想定位第三个网页元素链接,用firebug查看结果如下:

我们可以看到链接这个网页元素有个id=hyperlink的属性。所以,我们的程序可以这么继续写:

By.id(“hyperlink”)作为参数传入findElement()方法,里面有一个关键字叫By,英文里是“依靠”的意思,所以这句话的意思就是“依靠一个id值为hyperlink的属性找到某控件”。记起来也就不难了。By这个关键字很重要,只要一设计网页控件定位就需要它。findElement()方法返回的是一个网页元素的对象,类型是WebElement,咱们这个例子里指的就是这个链接,我用link表示。因为现在还没有系统介绍网页控件的操作和断言,所以我们只能在终端打印出来链接信息来证明已经找到了该链接。不过大家可以看一下一个网页控件可以有多少操作:

getText()方法可以打印出一个链接上的文本内容,所以我们用这个方法在终端打印出来:

结果如下:

没问题吧?如果没找到肯定打印不出来这句话对不对?其实不光打不出来,找不到还会抛异常,selenium就是这么个玩意儿。

你看,我们随便写了个id,其实压根不存在。错误妥妥地爆出来。你可以用try…catch…捕获错误信息,但我们总不希望测试的时候老有异常抛出来吧?以后讲控件操作时会告诉大家怎么处理。控件的操作我们会在讲完定位器后挨个扫荡一遍,暂时咱们用到哪个就先提一句。以上就是一个使用id查找链接的小例子,大家可以用别的网站再做做实验。

有人说,那如果在同一个网页上有两个元素拥有同一个id怎么办呢?比如它们都等于hyperlink,程序怎么知道该选哪个呢?完全没必要顾虑,因为在同一个网页上不可能有两个元素拥有同一个id,有些功能因为id冲突会在某些情况下失效!这是web应用前端开发时的规定,你可以去任何正规大型网站上看看,同一个网页上绝不会出现同一个id。所以,如果一个元素有id,那我们最好先用id来定位,因为它可以唯一标识当前网页上的某一个元素。当然,如果是同一个网站中的不同网页,id可以重复。

看来放到不同网页就不会引起冲突,我们可不可以这么想:网页之间是彼此独立的,定位控件时都是根据当前网页来执行的?为了证明这个观点,请看下面这个例子,我们先打印出来链接文本,然后导到百度,然后再尝试打印链接文本:

执行一下肯定会报错,因为跳转到百度后原先网页上的链接对象就不存在了!同样的System.out.println(link.getText())操作,只不过中间隔了一个跳转百度并等3秒钟就报错了。所以我们可以得出这个结论了:所有的控件定位都是针对当前网页来说的,当从一个网页跳转到另一个网页的时候,所有之前存在的都会失效。这不光适用于id,还适合于其它定位器。这也间接证明了不同网页元素可以用同一个id,因为同一时间selenium只能处理一个网页。至于网页之间为什么是彼此独立的,这个涉及http协议以及web应用程序相关知识,有兴趣的可以上网查查资料。咱们是做测试的,其实更需要知识的广度。如果以后有时间我也会写相关的文章的。

如果id不存在还能用id来定位这个链接吗?当然不能,不存在怎么能使用id呢?那就得从另外七种定位器中选择了。

这篇文章的源代码是SeleniumId这个项目,下篇介绍和Name相关的三种定位器使用方法。

本篇知识点及注意事项:
1.所有的控件定位都是针对当前网页来说的,当从一个网页跳转到另一个网页的时候,所有之前存在的都会失效。

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

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,965评论 3 119
  • 这是一个谁也离不开金融的年代,也许您没有刻意关注但其实早就参与其中。人人都值得学点必要的金融思想,且让我们从零开始...
    云时之间阅读 879评论 0 3
  • 你不知道什么将会发生 就像走路的时候 鞋底突然张开了大嘴 意欲吞噬周遭的一切 鞋说:众生平等,你为何踩我于脚下 我...
    SuperVenus阅读 197评论 0 0
  • 在周末这两天的时间里,我的世界很小,小到只能看到孩子的身影。然而我的世界却又很大,很大。因为每个孩子都是一个未...
    庄如澖阅读 665评论 0 0