开发手册 欢迎您!
软件开发者资料库

Java Selenium WebDriver 操作调用浏览器后台执行Js(JavaScript)代码

本文主要介绍Java中,使用Selenium WebDriver调用浏览器(Chrome,IE,Firefox等)方法代码,并且可以在后台代码中执行Js(JavaScript)代码,可以实现一些网站自动化操作。

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/

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"));