java - 无法在 Chrome 无头模式下运行测试
问题描述
我正在尝试在 Chrome 无头模式下运行测试但得到java.lang.NullPointerException
Chrome 版本:版本 72.0.3626.121(官方构建)(64 位)
Selenium 版本:3.8.1
Chromedriver 版本:2.45.615355
这是我的基本测试:
public abstract class BaseTest {
public WebDriver driver;
protected abstract String getUrl();
@Before
public void setUp() {
Log.startLog("Test is Starting...");
System.setProperty("webdriver.chrome.driver", "src//test//resources//chromedriver");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setHeadless(true);
WebDriver driver = new ChromeDriver(chromeOptions);
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get(getUrl());
}
@After
public void tearDown() {
Log.endLog("Test is Ending...");
driver.manage().deleteAllCookies();
driver.close();
}
}
当我运行测试时,不是在无头模式下,每个测试都运行良好,但在无头模式下,我什至无法运行简单的测试来了解无头模式是否正常工作。
测试示例:
@Test
public void test() {
System.out.println(driver.getTitle());
}
示例网址:https ://www.wikipedia.org/
更新: 我用这段代码创建了新的示例项目:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class test {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "/Users/alexsomov/Desktop/chromedriver2");
//Set Chrome Headless mode as TRUE
ChromeOptions options = new ChromeOptions();
options.setHeadless(true);
//Instantiate Web Driver
WebDriver driver = new ChromeDriver(options);
driver.get("https://www.google.com/");
System.out.println("Page title is - " + driver.getTitle());
driver.close();
}
宾果游戏,一切正常......需要弄清楚为什么上面的代码从真实项目中不起作用似乎 BaseTest 类有问题,当我使用调试器运行代码时,我得到driver == null,也许任何人都有解决方案我该如何解决这个问题:/
解答 该解决方案非常简单,只需在 BaseTest 类的 setUp() 方法中更改 1 个字符串。
这个:
WebDriver driver = new ChromeDriver(chromeOptions);
改为:
driver = new ChromeDriver(chromeOptions);
一切都会奏效。
解决方案
如果您使用的是 linux 环境,可能您还必须添加 --no-sandbox 以及特定的窗口大小设置。如果您正确设置用户容器,则 Windows 中不需要 --no-sandbox。
disable-gpu 仅在 Windows 上。其他平台不再需要它。--disable-gpu 标志是针对一些错误的临时解决方法。
if(browser.equalsIgnoreCase("HLChrome")){
//Headless chrome browser and configure
WebDriverManager.chromedriver().setup();
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--no-sandbox");
chromeOptions.addArguments("--headless");
chromeOptions.addArguments("disable-gpu");
// chromeOptions.addArguments("window-size=1400,2100"); // linux should be activate
driver = new ChromeDriver(chromeOptions);
推荐阅读
- java - 尝试使用 NetBeans 连接到 MySQL 数据库时获取 Java 类转换扩展
- java - 获取动态创建的 Spinner 和 EditText 视图的价值
- reactjs - 具有动态 id 的路由在 react redux 中不起作用
- javascript - 如何在反应原生时以 SVG 六边形屏蔽用户图像
- aws-lambda - 我对 AWS Lambda 无服务器架构的理解是否正确?
- reactjs - react native 理解 textInput 组件
- phpmyadmin - 如何将 127.0.0.1.sql 文件导入本地主机
- c# - 使用命名管道将图像从 C++ 发送到 C# 应用程序
- php - 如何将 Soap Env API 响应转换为 PHP 数组或 JSON 数组
- macos - 无法转换“NSStoryboardSegue.Identifier”类型的值?到预期的参数类型“字符串”