如何解决Selenium WebDriver在Jenkins运行时屏幕过小的问题
我之前也碰到过一模一样的坑!Jenkins在Windows slave上跑UI测试时默认的分辨率确实离谱,尤其是那些没适配低分辨率的网站,元素重叠、不可见的问题一抓一个准。下面几个方法都是我亲测有效的,你可以根据自己的场景选:
1. 直接修改Jenkins Slave的系统分辨率
这是最根本的解决办法,从系统层面把分辨率拉上去。
方法A:用命令行设置分辨率
在Jenkins Slave的启动脚本(比如bat或PowerShell)里添加以下命令,设置成你需要的分辨率(比如1920x1080):
- 用PowerShell脚本(更可靠直观):
把这段脚本加到Slave启动的前置步骤里,确保测试运行前分辨率已经设置好。Add-Type @" using System; using System.Runtime.InteropServices; public class DisplayManager { [DllImport("user32.dll")] public static extern int ChangeDisplaySettings(ref DEVMODE lpDevMode, int dwFlags); [StructLayout(LayoutKind.Sequential)] public struct DEVMODE { [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)] public string dmDeviceName; public short dmSpecVersion; public short dmDriverVersion; public short dmSize; public short dmDriverExtra; public int dmFields; public int dmPositionX; public int dmPositionY; public int dmDisplayOrientation; public int dmDisplayFixedOutput; public short dmColor; public short dmDuplex; public short dmYResolution; public short dmTTOption; public short dmCollate; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)] public string dmFormName; public short dmLogPixels; public int dmBitsPerPel; public int dmPelsWidth; public int dmPelsHeight; public int dmDisplayFlags; public int dmDisplayFrequency; public int dmICMMethod; public int dmICMIntent; public int dmMediaType; public int dmDitherType; public int dmReserved1; public int dmReserved2; public int dmPanningWidth; public int dmPanningHeight; } } "@ # 初始化DEVMODE结构体 $devMode = New-Object DisplayManager+DEVMODE $devMode.dmSize = [System.Runtime.InteropServices.Marshal]::SizeOf($devMode) # 设置目标分辨率 $devMode.dmPelsWidth = 1920 $devMode.dmPelsHeight = 1080 # 指定修改宽度和高度字段 $devMode.dmFields = 0x00000080 -bor 0x00000040 # 应用设置并保存到注册表 [DisplayManager]::ChangeDisplaySettings([ref]$devMode, 0x00000001)
方法B:用虚拟显示驱动
如果你的Slave机器没有物理显示器(比如云服务器),可以安装虚拟显示驱动(比如Virtual Display Driver),创建一个高分辨率的虚拟桌面,这样Jenkins就能在正常的分辨率下运行测试了。
2. 在测试代码中强制设置浏览器窗口大小
如果不想改系统分辨率,也可以直接在测试框架里控制浏览器窗口的尺寸,这对Selenium、Cypress这类UI测试工具都适用:
Selenium示例:
- Java:
import org.openqa.selenium.Dimension; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class TestSetup { public static void main(String[] args) { WebDriver driver = new ChromeDriver(); // 设置窗口为1920x1080 driver.manage().window().setSize(new Dimension(1920, 1080)); // 或者直接最大化窗口 driver.manage().window().maximize(); } } - Python:
from selenium import webdriver driver = webdriver.Chrome() driver.set_window_size(1920, 1080) # 或者最大化 driver.maximize_window()
Headless浏览器设置:
如果用Headless模式(比如Chrome Headless),一定要指定窗口大小,不然默认分辨率还是很小:
ChromeOptions options = new ChromeOptions(); options.addArguments("--headless=new"); options.addArguments("--window-size=1920,1080"); WebDriver driver = new ChromeDriver(options);
3. 解决远程桌面断开后的分辨率问题
如果你经常通过远程桌面连接Slave机器,断开后Windows会自动把分辨率降到最低,这时候可以用tscon.exe命令断开会话而不关闭桌面:
tscon %SESSIONNAME% /dest:console
把这个命令加到远程桌面断开前的脚本里,就能保持原来的分辨率了。
4. 配置Jenkins Slave服务的交互权限
如果Slave是作为Windows服务运行的,默认在会话0中没有桌面,这时候需要:
- 打开服务管理器,找到Jenkins Slave服务
- 右键→属性→登录选项卡,勾选“允许服务与桌面交互”
- 重启服务,这样Slave就能在有桌面的会话中运行,分辨率设置也能生效
我当时是结合了方法1和方法2:先在Slave启动时用PowerShell设置系统分辨率,然后在测试代码里把浏览器窗口最大化,从此再也没碰到过元素不可见的测试失败问题。
内容的提问来源于stack exchange,提问作者Lipson T A

