在作为 Jenkins Slave 的虚拟机上设置 Selenium 测试的显示分辨率

Setting display resolution for Selenium tests on virtual machine as Jenkins Slave

我在 Jenkins Slave 上进行一些 Selenium 测试时遇到了问题 运行。具体来说,运行测试使用的显示分辨率太小,导致部分测试失败。

为了检查显示分辨率,我们将显示高度和宽度记录到控制台,使用:

driver.manage().window().maximize();
System.out.println("Window height: " + driver.manage().window().getSize().getHeight());
System.out.println("Window width: " + driver.manage().window().getSize().getWidth());

这个returns:

Window height: 784
Window width: 1040

这对我来说似乎是一个非常奇怪的解决方案。所需分辨率为 1920 x 1080。

作为slave的服务器是虚拟机(WindowsServer 2012 R2)。 Jenkins Slave 通过 JNLP 代理连接。奴隶有服务 运行 登录为 "Local System" 并启用 "Allow service to interact with desktop" 选项。

到目前为止,我们已经尝试了很多方法,例如:

所有这些都没有解决问题。非常欢迎提出建议!

根据我的经验,您无法通过编程方式解决此问题。您的测试将 运行 使用您上次物理访问此 VM 显示器时使用的分辨率。例如,如果我在我的大屏幕显示器上打开 VM 并将其最大化,测试将在该分辨率下 运行。但是,如果我在我的笔记本电脑屏幕上打开它并关闭 RDP 连接,测试将在较小的屏幕尺寸上 运行。 我知道这听起来很奇怪,但我真的找不到更好的解决方案。 :D 所以现在我必须小心在关闭 VM 之前在我的大屏幕上最大化 VM 显示。您可能不喜欢这个答案,但是当您发现自己没有其他解决方案时请记住它。 ;)

在意识到 Jenkins 不一定需要 运行 奴隶作为 windows 服务后,终于设法解决了这些问题。要启动从站,可以从 Jenkins 下载 JNLP 代理并将其复制到服务器。 运行打开 JNLP 文件时,您可以 select 选择将从属代理安装为服务的选项。

以前我们有这个选项 selected,这就是为什么从服务器 运行ning 作为服务。停止并删除服务后,我们再次 运行 JNLP 文件并确保没有 select 选项。

建议的解决方案包括断开远程桌面会话并使会话以较大的分辨率保持打开状态在 运行将从属服务器作为服务时不起作用。但是,当 运行 以默认方式连接从站时,它们确实可以工作。

确保远程桌面会话在一段时间后没有结束:

希望这对某人有所帮助!

我也遇到过同样的问题。我的 seleniumn 在安装为 windows 服务的 jenkins slave 下测试 运行,使用 "Local System" 帐户并在 windows 中启用 "Allow service to interact with desktop" 选项 7. 一些测试用例总是失败,因为显示分辨率不正确。

我登录了windows虚拟机(EXSI Server + VMware Fusion)的控制台,将分辨率改为1400x900,重启了windwos虚拟机。现在一切正常。

对我有用的解决方案是 运行 Chrome 'headless' 模式(无 GUI)。当 GUI 不可用时,它作为服务与 Jenkins Agent 运行 一起工作。 这是网络驱动程序初始化的代码示例:

var options = new ChromeOptions();
options.BinaryLocation = @"C:\Program Files\Google\Chrome\Application\chrome.exe";
options.AddArgument("Headless");
options.AddArgument("window-size=1920,1080");

driver = new ChromeDriver(@"<path>\Selenium.WebDriver.ChromeDriver.2.37.0\driver\win32", options);