通过 Linux 以无头模式运行 Selenium 会导致错误

问题描述 投票:0回答:4

我在网站上运行了大量测试。 当我在 Windows 上本地运行测试时,它们都 100% 通过。该测试是在 Google Chrome 上设计和运行的。

现在,我们已经开始通过 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();

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

如何让无头测试更加稳定?

为什么无头状态会带来这么多问题?

java selenium jenkins google-chrome-headless headless-browser
4个回答
6
投票

Selenium 社区实际上知道 Headless 并不稳定,请阅读此处 了解更多信息

激活无头模式后,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");

4
投票

您可能缺少设置无头窗口大小。
试试这个设置:

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

在这里,我放置了更多我用于无头镀铬的设置。
我希望这对你有用。


1
投票

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

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

0
投票

请分享最终对OP有效的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.