WebDriver提供了方法来同步/异步执行JavaScript代码,这是因为JavaScript可以完成一些WebDriver本身所不能完成的功能,从而让WebDriver更加灵活和强大。

本文中所提到的都是JAVA代码。

1. 在WebDriver中如何执行JavaScript代码

JavaScript代码总是以字符串的形式传递给WebDriver,不管你的JavaScript代码是一行还是多行,WebDriver都可以用executeScript方法来执行字符串中包含的所有JavaScript代码。

WebDriver driver = new FirefoxDriver();

JavascriptExecutor driver_js=(JavascriptExecutor)driver;

String js = "alert(\"Hello World!\");";

driver_js.executeScript( js);

2.同步执行JavaScript和异步执行JavaScript的区别

  • 同步执行:driver_js.executeScript( js)

如果JavaScript代码的执行时间较短,可以选择同步执行,因为Webdriver会等待同步执行的结果,然后再运行其它的代码。

  • 异步执行:driver_js.executeAsyncScript(js)

如果JavaScript代码的执行时间较长,可以选择异步执行,因为Webdriver不会等待其执行结果,而是直接执行下面的代码。

3. 用Javascript实现等待页面加载的功能

public void waitForPageLoad() {

While(driver_js.executeScript("return document.readyState" ).equals ("complete")){

Thread.sleep(500);

}

}

这样做的缺点是,没有设定timeout时间,如果页面加载一直不能完成的话,那么代码也会一直等待。当然你也可以为while循环设定循环次数,或者直接采用下面的代码:

protected Function<WebDriver, Boolean> isPageLoaded() {

return new Function<WebDriver, Boolean>() {

@Override

public Boolean apply(WebDriver driver) {

return ((JavascriptExecutor) driver).executeScript("returndocument.readyState").equals("complete");

}

};

}

public voidwaitForPageLoad() {

WebDriverWait wait = new WebDriverWait(driver, 30);

wait.until(isPageLoaded());

}

需要指出的是单纯的JavaScript是很难实现等待功能的,因为JavaScript的执行是不阻塞主线程的,你可以为指定代码的执行设定等待时间,但是却无法达到为其它WebDriver代码设定等待时间的目的。有兴趣的同学可以研究一下。

4. Javascrpt模拟点击操作,并触发相应事件

String js ="$(\"button.ui-multiselect.ui-widget\").trigger(\"focus\");"

+"$(\"button.ui-multiselect.ui-widget\").click();"

+"$(\"button.ui-multiselect.ui-widget\").trigger(\"open\");";

((JavascriptExecutor)driver).executeScript( js);

5. Javacript scrollbar的操作

String js ="var obj = document.getElementsById(\“div_scroll\”);”

+”obj.scrollTop= obj.scrollHeight/2;”

((JavascriptExecutor)driver).executeScript(js);

6. Javascript重写confirm

String js ="window.confirm = function(msg){ return true;}”

((JavascriptExecutor)driver).executeScript( js);

通过执行上面的js,该页面上所有的confirm将都不再弹出。

7. 动态载入jquery

并不是所有的网页都引入了Jquery,如果我们要在这些网页上执行Jquery代码,就必须动态加载Jquery source文件

driver.get("file:///C:/test.html");

boolean flag =(boolean)(driver_js).executeScript("return typeof jQuery =='undefined'");

if (flag)

{

driver_js.executeScript("var jq =document.createElement('script');"

+ "jq.type ='text/javascript'; "

+"jq.src ='http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js';"

+"document.getElementsByTagName('head')[0].appendChild(jq);");

Thread.sleep(3000);

}

waiter.waitForPageLoad();

driver_js.executeScript("$(\"input#testid\").val(\"test\");");

8. 判断元素是否存在

可以通过下面的办法来判断页面元素是否存在,但是缺点就是如果元素不存在,必须在抛出exception后才能知道,所以会消耗一定的时间(需要超时后才会抛出异常)。

boolean ElementExist(By Locator){

try{

driver.findElement(Locator);

return true;

}

catch(org.openqa.selenium.NoSuchElementException ex)

{

return false;

}

}

也许我们可以在JavaScript中判断页面元素是否存在,然后再将结果返回给Webdriver的Java代码。

  • 页面元素

String js =" if(document.getElementById("XXX")){ return true; } else{ return false; }”

String result = ((JavascriptExecutor)driver).executeScript(js);

或者

  • 表单元素

String js =" if(document.theForm.###){return true; } else{ return false; }”

String result = ((JavascriptExecutor)driver).executeScript(js);

9. 结尾

JavaScript在WebDriver中还可以做很多事情,但这还不是全部。比如,我们是否可以编写代码来监视在整个Webdrvier测试代码运行过程是否产生过JavaScriptError呢,答案是肯定的,有兴趣的同学可以深入研究一下。

Selenium WebDriver之JavaScript的更多相关文章

  1. 转:selenium webdriver 执行javascript代码

    在用selenium webdriver 编写web页面的自动化测试代码时,可能需要执行一些javascript代码,selenium本身就支持执行js,我们在代码中import org.openqa ...

  2. selenium webdriver ——执行javascript代码

    在代码中import org.openqa.selenium.JavascriptExecutor;就可以使用executeScript.executeAsyncScript这两个方法了 execut ...

  3. selenium webdriver 执行Javascript

    @Test public void testElementByID() { //通过JS获取页面元素 driver.get(url); driver.manage().window().maximiz ...

  4. selenium webdriver——JavaScript警告窗处理

    在WebDriver中处理JavaScript所生成的alert.confirm以及prompt,具体方法是使用switch_to_alert()方法定位到alert.confirm以及 prompt ...

  5. Selenium WebDriver 之 PageObjects 模式 by Example

    目录 1. 项目配置 2. 一个WebDriver简单例子 3. 使用Page Objects模式 4. 总结 5. Troubleshooting 6. 参考文档 本篇文章通过例子来阐述一下Sele ...

  6. selenium webdriver (python) 第三版

    感谢 感谢购买第二版的同学,谢谢你们对本人劳动成果的支持!也正是你们时常问我还出不出第三版了,也是你们的鼓励,让我继续学习整理本文档. 感谢乙醇前辈,第二版的文档是放在他的淘宝网站上卖的,感谢他的帮忙 ...

  7. 【转】Watir, Selenium & WebDriver

    转自:http://watirmelon.com/2010/04/10/watir-selenium-webdriver/ Please also see my new ‘Watir-WebDrive ...

  8. [selenium webdriver Java]使用自定义条件同步测试

    Selenium WebDriver可以结合ExpectedCondition类来定义自己期望的条件 创建一个新的ExpectedCondition接口,必须实现apply方法 等待元素出现 publ ...

  9. [selenium webdriver Java]常用api

    1. 获取元素文本 WebElement类的getText()方法返回元素的innerText属性.所以元素里如果有子节点一样也会被返回出来.如下所示 public class GetText { @ ...

随机推荐

  1. 查询出结果 给其 加上序号的方法 msql

    基本用法 SELECT @rownum := @rownum +1 AS rownum, e.*FROM (SELECT @rownum := 0) r , (select A.id,B.user_u ...

  2. VPS(Centos6)连ROS做GRE隧道完整版

    国内徐庄1.1.1.1     内网地址192.168.0.0/16  gre隧道适配器地址 172.16.0.45 国外2.2.2.2内网地址无 gre隧道地址172.16.0.46 国外 cent ...

  3. Keras 入门

    “sample”“batch”“epoch” Sample:样本,比如:一张图像是一个样本,一段音频也是一个样本. Batch:批,含有N个样本的集合.每一个batch的样本都是独立的并行处理.在训练 ...

  4. [置顶] caffe+CPU︱虚拟机+Ubuntu16.04+CPU+caffe安装笔记

    由于虚拟机下的Ubuntu系统一般不包含GPU,故这次安装时为了在无GUP环境下运行caffe.所以只需安装CPU版本的caffe 由于本机是window10系统,所以想尝试caffe就在自己电脑上整 ...

  5. 停止调试 IIS 不退出

    在VS主面板打开:工具->选项->调试->编辑继续   取消选中[启用"编辑并继续"] 就可以(不过这是针对所有的调试). 若只想对单个项目进行设置,可以选择自己 ...

  6. 第7课 Qt中的坐标系统

    1. 坐标系统 (1)GUI操作系统都有特定的坐标系统 (2)图形界面程序在坐标系统中进行窗口和部件的定位 (3)定位类型 ①顶级窗口部件的定位 ②窗口内部件的定位 ③窗口部件的大小设置 (4)QWi ...

  7. hdu-4432-Sum of divisors

    /* Sum of divisors Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  8. 由du,df 得出不同结果反应出的问题

    最近遇到了因为某种异常情况导致某目录下日志暴增,在修复异常情况后,发现pm2 不能启动,查看日志发现原因为空间不足. 使用du -sh查看确实为空间不足.在rm -rf 删除之后,仍然不能启动.这时用 ...

  9. java的方法传参,最容易混淆的问题!!!

    参数传递 参数传递,可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我们称为参数传递. 在这里 ...

  10. windows下使用nginx配置tomcat集群

    转自:https://blog.csdn.net/csdn15698845876/article/details/80658599