这篇文章介绍链接(Link)的操作。链接的代码大家应该不陌生,格式是
链接分为文字链接(text link)和图像链接(image link)两种,它们都用来跳转到某个特定网页,常用的操作是
1. 检查是否显示;
2. 点击;
第一点是用isDisplayed(),前几篇文章说过几次了就不说了。直接说第二点。链接的点击和按钮一样,都是用click()。之前介绍定位器时说过selenium对链接情有独钟,不光专门对链接设计了定位器,而且一设计就设计了两种。一种叫LinkText,另一个叫PartialLinkText,这两种都介绍过,大家如果忘了可以再去复习一下。总之,PartialLinkText比LinkText强大的地方就是可以仅通过链接的一部分相连的文字就可以定位整个链接,并且实现点击操作。
点击本身没什么难的,但这里有几点需要注意的地方。第一个是链接文字是字母大小写敏感的,如果你测试网页是英文的就需要注意一下了。比如某个网页上有两个链接 - 一个Login,一个是LOGIN:
这种情况下你要是想定位LOGIN就必须写成driver.findElement(By.linkText("LOGIN")),写Login就错了。即便你用partialLinkText你也不能写成driver.findElement(By.partialLinkText("L")),因为这两个链接都有大写字母L,根据相同元素定位第一个的原则,被定位的还是Login。
第二点是因为HTML5的广泛使用,有时大家查看网页元素时可能会看到在<a></a>之间还有别的标签,比如:
这种情况下你光看网页本身看不出来上面这两个链接有什么区别,只有查看源代码才能看到<div></div>或是<span></span>这类的标签。不过好在这种情况一般来说你也可以通过linkText或是partialLinkText来定位:
第三点是关于窗口切换。有时候点击链接的时候当前网页并不会自动跳转,而是弹出新的窗口,就是因为链接的代码中有target="_blank"这类的字眼。这种情况下虽然新窗口打开,可默认情况下driver的焦点还是在旧窗口上,比如我点击咱们示例网站主页上的“网页控件WebElements”链接,链接打开后driver的焦点还是在主页上:
这就意味着你要是直接定位新窗口的控件就会报错。所以,这种情况下我们需要进行窗口切换,把driver的焦点果断挪到新窗口去。
想要挪动driver就得先获取这两个窗口。每一个窗口都有一个唯一标识符,就好像人的名字一样,这个标识符又叫做句柄,英文是handle。知道了哪个窗口的句柄就可以切换到哪个窗口并把driver挪过去。在selenium中,获取一个窗口的句柄是通过用driver对象调用getWindowHandle()方法来实现的:
返回的字符串就是当前窗口的句柄,比如我想打印咱们这个例子中主页的句柄:
要想实现切换还需要找到第二个窗口。selenium并不能直接定位第二个窗口,但它还有一个方法叫getWindowHandles(),多了一个s,可以获取所有的句柄,并且返回一个Set类型的集合:
Set之前没提过,但它和ArrayList/Hashmap这些类似,也是一个大麻袋,只不过这个麻袋里边的元素是无序的,而且不能有重复的,正好符合窗口句柄唯一这个特点。大家有兴趣可以研究研究。介绍过ArrayList/Hashmap了,大家也肯定对集合有了一定得了解,别的集合类或接口也大同小异,查询API文档就可以学会。
鉴于getWindowHandles()可以获取所有句柄,所以你想到了什么?是不是我们可以用遍历来切换到目标窗口?先上程序再讲:
当点击链接“网页控件WebElements”后,第20行返回的set里应该同时包含“Selenium自动化测试练习网站”和“网页控件(WebElements)”两个窗口的句柄。执行for循环时每次从set里取出一个句柄,如果和当前的不一样,就执行切换操作。和Alert一样,窗口之间切换也是用driver.switchTo(),但后面接的是window(),里面接收目标窗口的句柄作为参数:
知道了哪个窗口的句柄就可以把driver切换到哪个窗口。很明显,最多执行两次循环就会获取第二个窗口的句柄,然后就能切换窗口把driver挪过去,这时你再操作新窗口的控件就没问题了。
以上就是文字链接需要注意的,再简单说说图像链接。图像链接没有文字,所以你不能用linkText()和partialLinkText()来定位,只能通过其它方法,比如我想点击网页元素那页上的图片:
我可以通过xpath来定位,点击图像会打开一个百度的新窗口:
这篇的源代码在SeleniumLink项目里。
本篇知识点及注意事项:
1. 点击链接打开新窗口时默认情况下driver的焦点还是在旧窗口上,这种情况下我们需要进行窗口切换,把driver的焦点挪到新窗口去。
2. 链接文字是英文大小写敏感的。
网友评论