在 Jenkins 服务器中作为 Job 运行 selenium 代码时,Selenium 代码未打开 firefox 浏览器

Posted

技术标签:

【中文标题】在 Jenkins 服务器中作为 Job 运行 selenium 代码时,Selenium 代码未打开 firefox 浏览器【英文标题】:Selenium code is not opening firefox browser when running selenium code in Jenkins server as Job 【发布时间】:2020-12-09 14:02:22 【问题描述】:

我在 Selenium/Java 测试类中有以下代码。现在,我已将这段代码推送到 GitHub。 另外,我已经设置了 Jenkins 作业来执行相同的代码(在 Jenkins 作业中,我将代码指向了 GitHub)。 Jenkins 作业触发良好并开始执行测试,但在打开浏览器时抛出错误。 测试用例应该是打开火狐浏览器,但是火狐浏览器打不开。

所以,我的问题是,如果我想在 Jenkins 作业中执行测试用例(Jenkins 服务器在 Cento7.4 OS 中运行),下面的 selenium 代码是否正确。

注意:在同一个 CentOS 虚拟机中,我能够在 eclipse 中执行相同的(如下)selenium 代码,它能够打开 Firefox 浏览器并打开 URL,没有任何问题。 只有当我尝试在 Jenkins 服务器中运行与 Jenkins 作业相同的代码时,才会出现问题。

硒代码

System.setProperty("webdriver.gecko.driver",  "geckodriver");
FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.addArguments("--display=0");
    
WebDriver driver = new FirefoxDriver(firefoxOptions);
driver.get("https://www.facebook.com");

Jenkins 作业输出

Running TestSuite

Failed to open connection to "session" message bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
1597912923234   mozrunner::runner   INFO    Running command: "/bin/firefox" "-marionette" "--display=0" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofileFz0Zr2"
Failed to open connection to "session" message bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Running without a11y support!
Error: cannot open display: 0
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.972 sec <<< FAILURE!

Results :

Failed tests:   loginTest4(com.training.browsers.LinuxTest): invalid argument: can't kill an exited process

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

[ERROR] There are test failures.

xauth list 输出

[root@localhost ~]# xauth list
localhost.localdomain/unix:0  MIT-MAGIC-COOKIE-1  4eb74af687f2dbc022ef03617614456e
#ffff#6c6f63616c686f73742e6c6f63616c646f6d61696e#:0  MIT-MAGIC-COOKIE-1  4eb74af687f2dbc022ef03617614456e

【问题讨论】:

不相关但...请确保您没有在“root”下运行测试。在大多数情况下,普通用户帐户就足够了 【参考方案1】:

您可能需要考虑设置 xvfb (https://centos.pkgs.org/7/centos-x86_64/xorg-x11-server-Xvfb-1.20.4-10.el7.x86_64.rpm.html)。问题是您的 Jenkins 服务器无法打开 display 0 来运行。请注意,发送到 firefox 二进制文件的参数在 firefoxOptions 中指定 display 0 与二进制文件执行的 INFO 日志行匹配。假设您正在运行无头服务器,这就是您收到此错误的原因。在本地运行时并非如此。 使用 xvfb,您应该能够指定屏幕编号并相应地设置您的配置,或者只需使用 xvfb-run。

【讨论】:

即使本地是无头虚拟机?【参考方案2】:

测试用例应该是打开火狐浏览器,但是火狐浏览器打不开。

要解决此问题,请使用 WebDriverManager 自动管理 Selenium WebDriver 所需的驱动程序(例如 chromedriver、geckodriver 等)。 要在 Maven 项目中使用 WebDriverManager,请在您的 pom.xml 中添加以下依赖项(需要 Java 8 或更高版本)。

<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>4.2.2</version>
</dependency>

然后只需在代码中添加WebDriverManager.firefoxdriver().setup();,如下所示:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import io.github.bonigarcia.wdm.WebDriverManager;

WebDriverManager.firefoxdriver().setup();

FirefoxOptions firefoxOptions = new FirefoxOptions();  
firefoxOptions.addArguments("--display=0");
WebDriver driver = new FirefoxDriver(options);

查看使用 WebDriverManager here 在 Firefox 和 Chrome 上运行 JUnit 4 测试的基本示例。

【讨论】:

【参考方案3】:

--display=n

短语display 用于指代共享通用键盘和指针的监视器集合,例如鼠标、平板电脑等。大多数工作站往往只有一个键盘,因此只有一个显示器。多用户系统,通常有多个显示器,并且在启动该显示器的 X 服务器时,为一台机器上的每个显示器分配一个显示器编号(从 0 开始)。 display:0 通常是本地显示,即电脑的主显示。


使用詹金斯

当 Jenkins 执行批处理文件时,Jenkins slave 在后台为它启动的每个程序作为服务运行。因此,通常您无法看到 Firefox 浏览器正在启动,但在任务管理器中您可以看到 Jenkins 在后台打开了多个 Firefox 进程。


解决方案

有以下几种方法可以解决此问题:

如果您使用 Jenkins 作为 Windows 服务,您需要允许服务与桌面交互。步骤:

在windows服务中选择Jenkins的服务:

打开Jenkins服务的属性窗口->登录->勾选复选框Allow service to interact with desktop

在这种方法中,dbus-daemon 的自动启动在 X11 会话下工作,否则它被禁用,因为不同的应用程序无法建立 dbus 守护程序的公共实例。

您可以在Jenkins : Selenium GUI tests are not visible on Windows找到相关的详细讨论

另一种方法是从命令提示符以 java -jar jenkins.war 的身份运行 Jenkins,而不是 Windows 安装程序版本。

另一种方法是使用RemoteWebDriver。从 Jenkins,确保有一台机器可以运行 selenium 测试。在此服务器上,您启动 firefox 浏览器。

您可以在How to launch chrome browser from Jenkins directly instead of using code in eclipse找到相关的详细讨论

另一种方法是通过FirefoxOptions() 类的实例将setHeadless 设置为true 来调用firefox-headless 浏览器,如下所示:

FirefoxOptions options = new FirefoxOptions();
options.setHeadless(true);
WebDriver driver = new FirefoxDriver(options);
driver.get("https://www.google.com/");

您可以在How to make Firefox headless programmatically in Selenium with Python?找到相关的详细讨论


无效参数:无法终止已退出的进程

此错误常见于以下两种情况:

当您以 root/admin 用户身份执行测试时。建议以非 root/非管理员用户身份执行测试。 当您使用的二进制文件版本不兼容时。

您可以在WebDriverException: Message: invalid argument: can't kill an exited process with GeckoDriver, Selenium and Python on RaspberryPi3找到详细讨论

【讨论】:

您能否扩展“在前台将 Jenkins slave 作为常规程序运行” - 特别是如果这是由 cron 或 apache 等后台任务调用的情况下 @User 查看更新后的答案并告诉我状态。

以上是关于在 Jenkins 服务器中作为 Job 运行 selenium 代码时,Selenium 代码未打开 firefox 浏览器的主要内容,如果未能解决你的问题,请参考以下文章

如果没有用户登录,则无法通过Jenkins运行COM应用程序

jenkins参数化构建过程中的各个参数之间是没有关联的吗

Jenkins 配置任务中的坑s

Jenkins中配置多任务,一次运行多个job

jenkins 批量添加任务job

jenkins暂停恢复job