Selenium能够执行js,这使得Selenium拥有更为强大的能力。既然能执行js,那么js能做的事,Selenium应该大部分也能做。这应该得益于JavascriptExecutor这个接口,而ChromeDriver, EdgeDriver, EventFiringWebDriver, FirefoxDriver, InternetExplorerDriver, OperaDriver, RemoteWebDriver, SafariDriver均实现了这个接口。跟使用WebDriver一样,我们可以这样使用该接口: 

 WebDriver driver=new ChromeDriver();
JavascriptExecutor jsExecutor=(JavascriptExecutor) driver;

  该接口十分简单,只有两个方法:

  1.java.lang.Object executeScript(java.lang.String script, java.lang.Object... args)   同步执行js

  2.java.lang.Object executeAsyncScript(java.lang.String script, java.lang.Object... args)  异步执行js

  对于返回值:

  1.如果js返回的是html元素,那么方法返回WebElement

  2.如果js返回的是小数,方法返回Double

  3.如果js返回的是非小数,方法返回Long

  4.如果js返回的是布尔,方法返回Boolean

  5.如果js返回的是其他,方法返回String

  6.如果js返回的是数组,方法返回List<Object>,可以嵌套,Object的值的类型是根据上面5条而定。

  7.如果js返回的是map,方法返回Map<String, Object>,Object值类型的定义同上。

  8.如果js返回null或没有返回,方法返回null

  对于 arg参数:

  js会用一个“魔法”变量arguments来接收。参数的类型可以是:数字,布尔,字符串,元素(WebElement)以及List<Object>,Object类型为上述类型

  下面通过一些简单的例子,来说明用法

  首先,我们在项目的html文件夹增加一个空白的html文件,jsTest.html

  html的代码如下:这是一个空白的html

<html>
<head> </head> <body> </body> </html>

  我们的代码:

        System.setProperty("webdriver.chrome.driver", "D:/WorkSpace/SeleniumTest/tools/chromedriver.exe");
WebDriver driver=new ChromeDriver(); driver.get("file:///D:/WorkSpace/SeleniumTest/html/jsTest.html");
//调用js,弹出信息
((JavascriptExecutor) driver).executeScript("alert('hello,selenium');");

  执行的效果如下:

  

  是不是非常简单,我们尝试使用带有参数的调用:

        System.setProperty("webdriver.chrome.driver", "D:/WorkSpace/SeleniumTest/tools/chromedriver.exe");
WebDriver driver=new ChromeDriver(); driver.get("file:///D:/WorkSpace/SeleniumTest/html/jsTest.html");
//调用js,"11111","22222"等参数将会被arguments接收,成为一个数组,此处arguments[0]表示调用第一个参数
((JavascriptExecutor) driver).executeScript("alert(arguments[0]);","1111111","222222");

  执行的效果:

  

  我们再修改一下jsTest.html,增加一个js方法,代码如下:

<html>
<head>
<script>
function sayHello()
{
alert("hi,Selenium");
}
</script>
</head> <body> </body> </html>

  调用的java改成如下:

        System.setProperty("webdriver.chrome.driver", "D:/WorkSpace/SeleniumTest/tools/chromedriver.exe");
WebDriver driver=new ChromeDriver(); driver.get("file:///D:/WorkSpace/SeleniumTest/html/jsTest.html");
//调用页面上的方法
((JavascriptExecutor) driver).executeScript("sayHello()");

  发现依然可以执行成功,效果如下:

  对于异步执行,使用的方法是类似的。更详细的可参考官网:http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/JavascriptExecutor.html

  但是对于异步执行,Selenium提供了一个时间限制的方法:

  WebDriver.Timeouts setScriptTimeout(long time, java.util.concurrent.TimeUnit unit)

  该方法是针对 executeAsyncScript 方法的执行,对executeScript无效。官方的文档说: If the timeout is negative, then the script will be allowed to run indefinitely.如果timeout的时间设为负数,表示不限执行时间,但我发现,设置为负数,一样会抛出异常(当然,官方没有说不会抛出异常,但抛出异常后,后面的代码就无法执行,除非自己去捕捉这个异常进行额外的处理)。 

        System.setProperty("webdriver.chrome.driver", "D:/WorkSpace/SeleniumTest/tools/chromedriver.exe");
WebDriver driver=new ChromeDriver(); driver.get("file:///D:/WorkSpace/SeleniumTest/html/jsTest.html"); //设置超时时间为-1秒
driver.manage().timeouts().setScriptTimeout(-1, TimeUnit.SECONDS); JavascriptExecutor js=(JavascriptExecutor) driver;
//3秒后执行
js.executeAsyncScript("setTimeout(\"alert('本信息3秒后弹出!')\",3000)");

  3秒后,js依然能弹出框,但之前就已经先抛出异常。也就是说,超时并未停止js的执行,只是抛出异常。

    异常信息为:Exception in thread "main" org.openqa.selenium.ScriptTimeoutException:asynchronous script timeout: result was not received in -1 seconds

  如果将超时时间设置为3或以上,则js能顺利执行,并且不会抛出异常。

  如果是executeScript,则无论setScriptTimeout如何设置,都不会对它有任何影响。

   当然,我们一般不会将超时时间设为负数,否则无任何意义,这里只是想验证一下官方的说法而已,结果说明与官方文档的说法稍有些出入。所以,如果想使设置异步脚本超时的这句代码无效,最好的方法还是将它注释掉,而非将超时时间改成负数。

执行js-----Selenium快速入门(十四)的更多相关文章

  1. driver.get()和driver.navigate().to()到底有什么不同?-----Selenium快速入门(四)

    大家都知道,这两个方法都是跳转到指定的url地址,那么这两个方法有什么不同呢?遇到这种情况,第一反应就是查查官方的文档. 官方文档的说法是:Load a new web page in the cur ...

  2. Node.js API快速入门

    Node.js API 快速入门 一.事件EventEmitter const EventEmitter = require('events'); class MyEmitter extends Ev ...

  3. Vue (一) --- vue.js的快速入门使用

    =-----------------------------------把现在的工作做好,才能幻想将来的事情,专注于眼前的事情,对于尚未发生的事情而陷入无休止的忧虑之中,对事情毫无帮助,反而为自己凭添 ...

  4. 隐式等待-----Selenium快速入门(九)

    有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败.在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现 ...

  5. 元素(WebElement)-----Selenium快速入门(三)

    上一篇<元素定位-----Selenium快速入门(二)>说了,如何定位元素,本篇说说找到的元素(WebElement)该怎么用. WebElement常用方法:  返回值  方法名  说 ...

  6. Scala快速入门(四)——继承、接口

    Scala快速入门(四)--继承.接口 一.继承 1.继承的概念:省略 2.模板: class Person(n:String,a:Int) { var name:String=n var age:I ...

  7. CSS快速入门(四)

    目录 CSS快速入门(四) 浮动 float属性 clear属性 浮动解决的问题及其影响 解决父标签塌陷的方法 浮动案例 定位 什么是脱离文档流 定位的两种方法 position定位 static定位 ...

  8. html5快速入门(四)—— JavaScript

    前言: 1.HTML5的发展非常迅速,可以说已经是前端开发人员的标配,在电商类型的APP中更是运用广泛,这个系列的文章是本人自己整理,尽量将开发中不常用到的剔除,将经常使用的拿出来,使需要的朋友能够真 ...

  9. JavaScript快速入门(四)——JavaScript函数

    函数声明 之前说的三种函数声明中(参见JavaScript快速入门(二)——JavaScript变量),使用Function构造函数的声明方法比较少见,我们暂时不提.function func() { ...

  10. Selenium快速入门(上)

    浏览器驱动下载 Edge浏览器 Firefox浏览器 Safari浏览器 Chrome浏览器 PhantomJS浏览器 下载完成之后,添加到环境变量. 声明浏览器对象 selenium支持的浏览器版本 ...

随机推荐

  1. Windows phone 自定义控件(无外观控件)——ColorPicker

    编码前 在上一篇博客中,写的是一个UserControl的子类,它具有固定的外观(虽然也可以通过样式来进行修改,但受到的限制很大).如果你想要使用这个控件的逻辑,但是希望在使用的时候可以更改控件的外观 ...

  2. 控制span的width属性及display属性值的选择

    给span设置width样式,会发现并没有改变它的宽度,但有时候我们需要给它设置固定的宽度,那么就可以设置它的display样式,改变span的显示模式就好了. span默认显示模式是inline,无 ...

  3. SQL某时间段记录查询

    --查询当天: select * from info where DateDiff(dd,datetime,getdate())=0 --查询24小时内的: select * from info wh ...

  4. 转:从框架看PHP的五种境界及各自的薪资待遇(仅限于二三线城市,一线除外)

    在撰写此文前首先必须申明的是本人不鄙视任何一种框架,也无意于挑起PHP框架间的战争,更没有贬低某个框架使用者的用意,本文纯粹个人的看法.你可以认为我无知也好,或者装逼也好,请不要试着在任何情况下,随便 ...

  5. ubuntu 开机自动挂载nfs服务器上的home分区

    通过‘fstab’也可以配置 NFS 和 SMB 的共享目录.由于涉及到的可选项很重要,并且需要了解一些协议的工作情况,您得先阅读 Samba 和 NFS . 基本语法和本地介质相差不是很多.条目中的 ...

  6. 讲真的,千万别得罪会PS的人

    传说中有一种软件炒鸡可怕 那就是PS,专业术语是photoshop! 它能让你貌美如花 也能让你瞬间丑得掉渣 更可怕的是网络上大神的出现 简直让我们难以想象的厉害! 下面大家一起来欣赏一下 那些大神帮 ...

  7. pip安装包

    默认的在安装文件的Lib\site-packages\路径下面 cmd窗口 cd切换路径:C:\Users\admin\AppData\Local\Programs\Python\Python36\S ...

  8. tomcat 启动报 找不到 StrutsPrepareAndExecuteFilter。。

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...

  9. oracle常用函数速记

    1.截断中文字符串 CREATE OR REPLACE function cn_cutstr(v_str varchar2,v_len number) return varchar2 IS v_i n ...

  10. Unicode、UTF-8 和 ISO8859-1

    Unicode.UTF-8 和 ISO8859-1到底有什么区别 1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文" ...