介绍javascript
在Selenium IDE中咱们可使用runScript命令去执行js代码片断,以辅助完成一些Selenium不方便达成的任务,一样,在WebDriver中咱们也可使用JavascriptExecutor工具类去完成js代码执行,下面我就四点详细阐述该工具的使用及工做原理。java
本篇文章讨论主题包括:web
1. JavascriptExecutor执行js代码的两种方法介绍。数组
2. JavascriptExecutor执行js代码的两种方法使用示例。app
3. JavascriptExecutor执行js的原理。函数
4. JavascriptExecutor经常使用案例。工具
下面咱们依次对以上三个话题进行详细讲解!spa
1. JavascriptExecutor执行js代码的两种方法介绍code
Object executeScript(String script, Object... args);索引
Object executeAsyncScript(String script, Object... args);
executeScript方法接收两个参数和一个返回值:
script,javascript代码片断,这段js代码片断是做为js函数的完整方法体,可使用return语句做为函数的返回值。
args, 参数数组,参数数组用于将外部数据传递给script(js代码片断),script中能够经过arguments[index]方式索引args数组中的参数;参数数据类型必须是如下几种(number, boolean, String, WebElement, 或者以上数据类型的List集合),固然无参数能够保留为空。
返回值,返回值是由js代码片断计算后经过return语句返回,返回值数据类型能够为(WebElement,Double,Long,Boolean,String,List或Map),没有return语句,这里返回数据为null。
executeAsyncScript方法接收两个参数和一个返回值:
script,javascript代码片断,这段js代码片断是做为js函数的完整方法体,与executeScript主要有两点不一样:
1. 此处的script必须在代码结束时明确调用callback方法以通知webdriver该script执行结束;该callback方法是由webdriver注入到arguments数组中最后一个元素;能够经过arguments[arguments.length-1]获取到,且可使用该回调函数返回计算结果(只须要将放回结果做为回调函数的参数便可)
2. 该script执行会有超时时间,默认为60s,超时时间内未调用callback方法,JavascriptExecutor会抛出Timeout异常。
args, 规则同executeScript。
返回值,规则同executeScript
2. JavascriptExecutor执行js代码的两种方法使用示例。
3. JavascriptExecutor执行js的原理。
如何理解JavascriptExecutor如何运行js代码,须要对javascript基础有必定的认识,首先给你们罗列两个javascript中三种定义和调用函数的示例,你们看完示例就不难理解webdriver是如何去运行javascript代码了,同时也能消除(为什么在javascript中使用arguments来接收方法传入的参数)的困惑。
固然函数的定义不限于以上三种写法,咱们这里重点讲解第二种和第三种方法,相信你们在看到这两种使用方式时,已经理解webdriver是如何调用js代码了,但还会疑惑为何会使用arguments来接收参数。
咱们全部定义的function实质上是对Function类的实现,而Functions类的定义中arguments做为局部变量,经过arguments索引接收全部参数,即便在方法定义中未指定的参数,你们来看下面的代码示例:
相信讲到这里你们应该很是清楚webdriver是如何去执行js代码的原理了,事实上webdriver就是经过new Function方式定义匿名函数来运行javascript代码的。