我在Selenium/Java测试类中有以下代码。现在,这段代码我已经推送到了GitHub。此外,我还设置了Jenkins作业来执行相同的代码(在Jenkins作业中,我将代码指向GitHub)。Jenkins作业触发正常并开始执行测试,但在打开浏览器时抛出以下错误。测试用例应该打开Firefox浏览器,但是Firefox浏览器没有打开。
所以,我的问题是,如果我想在Jenkins作业中执行测试用例(Jenkins服务器在Cento7.4OS上运行),下面的selenium代码是否正确。
注意:在同一个CentOS VM中,我能够在eclipse中执行相同的selenium代码(如下所示),并且它能够打开Firefox浏览器并打开URL,没有任何问题。只有当我尝试在Jenkins服务器中运行与Jenkins作业相同的代码时,问题才会出现。
Selenium代码
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
发布于 2020-11-10 04:33:34
您可能想研究一下如何设置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,与二进制文件执行的信息日志行匹配。假设你正在运行一个无头服务器,这就是为什么你会得到这个错误。在本地运行时情况并非如此。使用xvfb,您应该能够指定屏幕编号并相应地设置您的配置,或者简单地使用xvfb-run。
发布于 2020-11-10 09:35:03
测试用例应该打开火狐浏览器,但是火狐浏览器没有打开。
要解决此问题,请使用WebDriverManager自动管理驱动程序(例如chromedriver、geckodriver等)。Selenium WebDriver需要。
要在Maven项目中使用WebDriverManager
,请在pom.xml
中添加以下依赖项(需要Java8或更高版本)。
<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在火狐和Chrome上运行JUnit 4
测试的基本示例。
发布于 2020-11-10 14:23:06
--display=n
短语display用于指代共享公共键盘和指针的监视器的集合,例如鼠标、平板电脑等。大多数工作站往往只有一个键盘,因此也就只有一个显示器。多用户系统通常具有多个显示器,当用于该显示器的X服务器启动时,机器上的每个显示器都会被分配一个显示编号(从0开始)。display:0
通常是本地显示器,即计算机的主显示器。
使用Jenkins
当Jenkins执行批处理文件时,Jenkins slave会在后台为它启动的每个程序运行服务。因此,通常情况下,您无法看到Firefox浏览器启动,但在任务管理器中,您可以看到Jenkins在后台打开几个Firefox进程。
解决方案
有几种方法可以解决这个问题,如下所示:
如果您使用Jenkins作为windows服务,则需要允许服务与桌面交互。步骤:
windows服务中的
在这种方法中,的自动启动在X11会话下工作,否则将被禁用,因为不同的应用程序无法建立dbus守护进程的公共实例。
您可以在Jenkins : Selenium GUI tests are not visible on Windows中找到相关的详细讨论
另一种方法是在命令提示符下以java -jar jenkins.war
身份运行Jenkins,而不是windows installer版本。
另一种方法是使用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?中找到相关的详细讨论
无效参数:无法终止已退出的进程
在以下两种情况下,通常会观察到此错误:
当您以超级用户/管理员用户身份执行测试时使用
中找到详细的讨论
https://stackoverflow.com/questions/63501595
复制相似问题