文章目录

  • 前言
  • 一、Selenium是什么?
  • 二、使用步骤
  • 1.下载驱动
  • 2.加载依赖
  • 3.编写代码
  • 3.1需要在jvm运行时环境中,添加配置
  • 3.2 配置chrome
  • 3.3 执行脚本
  • 总结



前言


本文主要介绍通过Java调用Selenium执行js脚本,并获取js中的返回值,并且可以实现不弹出浏览器,后台静默执行。


提示:以下是本篇文章正文内容

一、Selenium是什么?


selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,可以使用包括括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等浏览器,和用户自己操作浏览器一样。 可以作为web自动化测试工具,也可以作为第三方中介来执行一些java中执行不了的js代码

ps: java从jdk1.6开始引入js引擎,从而支持执行js脚本,但是如果js脚本中包含一些浏览器内置对象,比如window对象,那么java在执行该脚本时会抛异常:uncaught JavaScript runtime exception: ReferenceError: “window” is not defined

二、使用步骤

1.下载驱动

我们以chrome为例,当前我电脑上chrome版本为87.0.428.141

java selenium 执行nodejs java selenium 执行脚本_js脚本


到chrome官网上下载驱动

http://chromedriver.storage.googleapis.com/index.html

一定要对应住大版本,比如,我下载的是87.0.4280.88

然后把chromedriver.exe放到任意有可读权限的位置。

2.加载依赖

maven依赖如下:

<dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>3.141.59</version>
</dependency>

3.编写代码

3.1需要在jvm运行时环境中,添加配置
System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");

后面的值就是上一步把chrome驱动放在的位置,相对或绝对地址都可以,但是一定要有可读权限。

3.2 配置chrome
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setHeadless(true);

声明一个ChromeOptions变量,并配置headless属性为true,表示不在前台打开chrome。

3.3 执行脚本

ChromeDriver提供两种执行脚本的方式:executeScriptexecuteAsyncScript,后一个表示异步执行,不阻塞当前进程,为了方便,本文使用executeScript方法

executor.executeScript(readJsFile())

readJsFile()方法为读取js脚本的内容

这时大家会有疑问,如何获取js脚本中的返回值呢?

我们需要在js脚本中return,如:

java selenium 执行nodejs java selenium 执行脚本_js脚本_02

这里的entry()函数是我自定义的密码加密函数。

我们只需要把p return回来,java代码中就会获得这个值。

完整代码见下:

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

/**
 * @auther jixiang.ma
 * @date 2021/1/11
 **/
public class JsTest {
    public static void main(String[] args) throws Exception {
        System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setHeadless(true);
        WebDriver driver = new ChromeDriver(chromeOptions);
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        System.out.println(executor.executeScript(readJsFile()));
        driver.quit();
    }

    private static String readJsFile() throws Exception {
        StringBuffer script = new StringBuffer();
        File file = new File("D:\\test.js");
        FileReader filereader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(filereader);
        String tempString = null;
        while ((tempString = bufferedReader.readLine()) != null) {
            script.append(tempString).append("\n");
        }
        bufferedReader.close();
        filereader.close();
        return script.toString();
    }
}

执行结果如下:

java selenium 执行nodejs java selenium 执行脚本_js脚本_03

为了验证返回值是否正确,我们先把静默去掉,对比浏览器console和返回值的数据。

在js脚本中加入一行console.log(p);
java代码中将headless设置为false,driver.quit();注释掉

java selenium 执行nodejs java selenium 执行脚本_java_04


对比一下,发现返回值和js脚本中的计算结果是一致的。


总结

本文讲述了selenium如何安装,并用java代码去获取脚本返回值。