运行 无头模式下的 Selenium 通过 Linux 导致错误

Running Selenium in headless mode via Linux causes errors

我在网站上进行了大量测试 运行。 当我 运行 在 Windows 上进行本地测试时 - 他们都通过了 100%。测试是在 Google Chrome.

上设计和 运行ning

现在,我们已经开始通过 Jenkins 作业在无头模式下 运行 Linux 上的测试。现在有些测试失败率为 0%,或者仅通过 20% 甚至 10%。在我的代码中,我通过 ID、xpath 或 css 查找元素,然后简单地单击它们。我使用 WebDriverWait 对象等待 - 元素出现和可点击。

我的代码示例:

    WebDriverWait wait = new WebDriverWait(browser, secondsToWait);
    wait.until(ExpectedConditions.presenceOfElementLocated(By.id(elementID)));           
    lastFoundElement = wait.until(ExpectedConditions.elementToBeClickable(By.id(elementID)));
    clickLastFoundElement();

在我的报告中,我看到的主要是未找到元素并且我超过了等待对象中设置的超时时间。

如何让无头测试更稳定?

为什么无头状态会导致这么多问题?

您可能没有设置无头 window 大小。
试试这个设置:

Map<String,String> prefs = new HashMap<>();
prefs.put("download.default_directory", downloadsPath); // Bypass default download directory in Chrome
prefs.put("safebrowsing.enabled", "false"); // Bypass warning message, keep file anyway (for .exe, .jar, etc.)
ChromeOptions opts = new ChromeOptions();
opts.setExperimentalOption("prefs", prefs);
opts.addArguments("--headless", "--disable-gpu", "--window-size=1920,1080","--ignore-certificate-errors","--no-sandbox", "--disable-dev-shm-usage");

driver = new ChromeDriver(opts);

这里我放了很多我用过的无头设置chrome。
希望对你有用。

Selenium 社区实际上已知的问题是无头并不稳定,阅读此处 about the issue more

Chrome 运行 无头模式激活时非常不稳定。 存在多个不同的问题和错误,具体取决于:Chrome 版本、ChromeDriver 版本和 executed tests.

问题和修复(目前已发生):

Chrome 不以无头模式启动

Exception:
No informative Error message. Only a timeout exception when navigate() is called on the driver:
org.openqa.selenium.TimeoutException: timeout

Fix:
options.addArguments("--proxy-server='direct://'");
options.addArguments("--proxy-bypass-list=*");

Chrome 在无头模式下非常慢

Fix:
options.addArguments("--proxy-server='direct://'");
options.addArguments("--proxy-bypass-list=*");

Chrome 在一定时间后无法正确运行,当测试 运行 很长时。在一个测试会话中执行许多操作

Exception:
... Timed out receiving message from renderer: ...
Fix (not tested yet!):
options.addArguments("--disable-browser-side-navigation");

请在 chrome 选项中包含屏幕尺寸。

ChromeOptions options = new ChromeOptions();
options.addArguments(Arrays.asList("--window-position=0,0"));
options.addArguments(Arrays.asList("--window-size=1840,1080"));