1、Selenium WebDriver安装引用
注意:要用使用的浏览器肯定要装,并且Selenium.Chrome.WebDriver版本要和浏览器版一致。
如果要操作其它浏览器,则下载安装对应其它浏览器的程序包,本文主要是Chrome浏览器。
WebDriver下载地址: https://www.seleniumhq.org/download/
ChromeDriver下载地址:https://chromedriver.storage.googleapis.com/index.html?path=75.0.3770.140/
其它浏览器Driver下载地址:https://www.seleniumhq.org/download/
如使用Maven管理项目,可以在pom.xml
文件中添加如下依赖:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>4.0.0</version> </dependency>
2、Selenium WebDriver执行Js代码
import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; class PerformJavaScript { WebDriver driver; String baseurl; private JavascriptExecutor js; public static void main(String[] args) throws InterruptedException { //谷歌浏览器的本地驱动 System.setProperty("webdriver.chrome.driver", "/Users/lisen/webselenium/selenium/chromedriver"); //谷歌浏览器 driver = new ChromeDriver(); //设置访问网址 baseurl = "https://www.baidu.com/"; // //将WebElement类型的driver强制转换为js类型的 js = (JavascriptExecutor) driver; //设置隐性等待 driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); //窗口最大化 driver.manage().window().maximize(); //打开网址 //使用Javascript语言打开百度网址 js.executeScript("window.location='https://www.baidu.com/';"); System.out.println("执行Javascript命令完成"); //等待3秒钟 Thread.sleep(3000); //查找元素 //向下转型,将WebElement 转换为object WebElement TestBOx = (WebElement) js.executeScript( "return document.getElementById('kw');"); System.out.println("执行Javascript,根据ID查找元素完成"); TestBOx.sendKeys("test"); //等待 Thread.sleep(3000); //关闭浏览器 driver.quit(); } }
3、使用executeAsyncScript执行Js代码
调用的函数executeAsyncScript将'done callback'作为最后一个参数,必须调用该函数来表示脚本已完成执行。否则会报执行脚本超时(Timeout)的错误。代码如下:
1) 在浏览器中执行sleep
long start = System.currentTimeMillis();
((JavascriptExecutor) driver).executeAsyncScript(
"window.setTimeout(arguments[arguments.length - 1], 500);");
System.out.println(
"Elapsed time: " + (System.currentTimeMillis() - start));
2) 将测试与AJAX应用程序同步
WebElement composeButton = driver.findElement(By.id("compose-button"));
composeButton.click();
((JavascriptExecutor) driver).executeAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"mailClient.getComposeWindowWidget().onload(callback);");
driver.switchTo().frame("composeWidget");
driver.findElement(By.id("to")).sendKeys("bog@example.com");
3) 注入XMLHttpRequest并等待结果
Object response = ((JavascriptExecutor) driver).executeAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"var xhr = new XMLHttpRequest();" +
"xhr.open('GET', '/resource/data.json', true);" +
"xhr.onreadystatechange = function() {" +
" if (xhr.readyState == 4) {" +
" callback(xhr.responseText);" +
" }" +
"}" +
"xhr.send();");
JSONObject json = new JSONObject((String) response);
assertEquals("cheese", json.getString("food"));