首页 > 解决方案 > 无法在 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);

一切都会奏效。

标签: javaseleniumgoogle-chrome-headless

解决方案


如果您使用的是 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);

推荐阅读