有时候,有些控件明明就在网页上,可你不管用什么定位器就是一直报错,让人很恼火。造成这种情况的原因很多,遇到的时候先查自己的定位器语法有没有错,然后再查是不是缺少等待造成了网页不同步,或是控件在frame/iframe上造成不能直接访问,或是driver和浏览器是否兼容。如果这些都没问题可还是定位不上,大家还可以再是另一种方法。Selenium包里有一个叫JavaScriptExecutor的接口,可以拿来解决这个问题。javascript应该没什么人没听说过吧?一种web前端技术,可以提高网页颜值,让网页看起来更大气美观。更重要的是,执行它自己本身的一些代码就可以达到点击控件的目的,从而满足我们的基本需求。这就要求我们对javascript有些简单了解,网上的教程很多,不用看太复杂的,搞懂基本的常用的语法就可以了。
我们知道,selenium的driver本来是一个WebDriver类型的对象,但它可以通过强制转换变成JavaScriptExecutor的接口对象。driver一旦变成接口对象虽然不再拥有findElement()/get()/等等那些方法了,但却可以调用一个叫executeScript()的方法来执行javascript代码。
既然是接口,就不能实例化,但可以声明一个指向接口对象的引用,这也是之前讨论java接口那篇说过的。executeScript()方法接受两个参数,一个是javascript代码,一个是根据需求变化的参数。所以,格式就变成了:
参数根据情况,不是每次都必需。JavaScriptExecutor接口就相当于一个媒介,javascript代码可以作为参数传入来操作被测的网页或窗口。比如我想点击示例网页hrsystem上的登录按钮,代码就可以这么写:
arguments[0].click()是javascript用于点击的语句,后边的参数是loginBtn,代表登录按钮。所以,如果我发现示例网页hrsystem上的这个按钮出于某种原因定位不上,我就可以舍弃findElement()而用javascript的方法。如果按钮很多,你就要相应调整这个语句。
javascript不仅可以用来点击难定位的控件,还可以做很多事情,比如滚动栏的控制。有时我们因为网页一下不能加载全部内容,开发人员在右侧添加了个滚动栏。每次向下滚动一点,就多加载一点。以网易新闻的主页举例,代码如下:
这篇比较短,语法不难,难点主要是javascript的语法。其实绝大多数的网页控件都能被之前讨论的那八种定位器轻松定位,只是特殊情况需要javascript来帮帮忙。网上教程很多,大家稍微了解一下javascript,不仅对于selenium自动化测试有帮助,还能了解到一些web前端开发的知识,会令我们对于系统整体的把握大有裨益。
这篇源代码在SeleniumJs小项目中。