在 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 浏览器的主要内容,如果未能解决你的问题,请参考以下文章