Selenium WebDriver之JavaScript
JavaScript selenium WebDriver
2023-09-11 14:19:43 时间
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后才能知道,所以会消耗一定的时间(需要超时后才会抛出异常)。
也许我们可以在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呢,答案是肯定的,有兴趣的同学可以深入研究一下。 最新内容请见作者的GitHub页:http://qaseven.github.io/
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后才能知道,所以会消耗一定的时间(需要超时后才会抛出异常)。
也许我们可以在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呢,答案是肯定的,有兴趣的同学可以深入研究一下。 最新内容请见作者的GitHub页:http://qaseven.github.io/
相关文章
- 教你如何检查一个函数是否为JavaScript运行时环境内建函数
- 大型情感剧集Selenium:6_selenium中的免密登陆与cookie操作
- 大型情感剧集Selenium:8_selenium网页截图的四种方法
- [Javascript] Safely Access a Property on a JavaScript Array with Optional Chaining
- [Javascript] Linting JavaScript with ESLint
- JavaScript 字符串(String)对象
- [Javascript] Use requestIdleCallback to schedule JavaScript tasks at an optimal time
- [Javascript] Await a JavaScript Promise in an async Function with the await Operator
- [Javascript] Delegate JavaScript (ES6) generator iteration control
- [Javascript] String method: endsWith() && startsWith()
- [Javascript] Hoisting in JavaScript
- [Javascript] Create an Array concatAll method
- 使用JavaScript Function.prototype进行代码重构的一些例子
- 利用ES6里标准化的JavaScript proxy对象拦截SAP C4C页面的HTML div原生操作
- Javascript 学习 笔记五
- Atitit.js javascript的rpc框架选型
- 2022年web前端开发值得学习的10个javascript框架
- 【华为OD机试 2023】 计算数组中心位置(C++ Java JavaScript Python)
- 2014年辛星解读Javascript之DOM之事件及其绑定
- python3+selenium实现Web自动化2:Selenium原理,定位元素以及浏览器常规操作!