如何配置Azure Windows Server 2012R2 VM默认分辨率适配Selenium测试?
解决Azure Windows Server 2012R2 VM上VSO Agent运行Selenium时分辨率过低的问题
我之前在Azure上部署Windows Server 2012R2虚拟机跑Selenium UI测试时,也碰到过一模一样的问题——RDP连接时分辨率和客户端一致是1600x900,但VSO Agent会话默认的1024x768分辨率直接导致测试失败,而且RDP里的分辨率设置还灰掉改不了。下面是几个亲测有效的解决方案:
方法1:将VSO Agent配置为交互式运行模式
默认情况下VSO Agent是以Windows服务的形式运行的,后台会话的分辨率会被限制在1024x768。改成交互式登录模式就能让Agent在有桌面的会话中运行,从而可以自定义分辨率:
- 进入VSO Agent的安装目录,运行
config.cmd打开配置命令行 - 选择Change service account选项,将服务账户改为拥有本地管理员权限的账户
- 接着选择Run as interactive process,按照提示完成配置
- 重启Agent服务后,登录到VM的交互式会话,手动设置你需要的分辨率(比如1600x900),之后Agent运行时就会沿用这个会话的分辨率
方法2:用PowerShell脚本强制设置分辨率(无需修改Agent模式)
如果不想改动Agent的运行模式,可以在Selenium测试执行前,用PowerShell脚本强制修改当前会话的分辨率。Hyper-V Video驱动支持通过系统API修改分辨率,脚本如下:
Add-Type @" using System; using System.Runtime.InteropServices; public class DisplayResolution { [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; } [DllImport("user32.dll")] public static extern bool EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode); [DllImport("user32.dll")] public static extern bool ChangeDisplaySettings(ref DEVMODE lpDevMode, int dwFlags); public const int ENUM_CURRENT_SETTINGS = -1; public const int CDS_UPDATEREGISTRY = 0x01; public const int DISP_CHANGE_SUCCESSFUL = 0; } "@ $dm = New-Object DisplayResolution+DEVMODE $dm.dmSize = [System.Runtime.InteropServices.Marshal]::SizeOf($dm) [DisplayResolution]::EnumDisplaySettings($null, [DisplayResolution]::ENUM_CURRENT_SETTINGS, [ref]$dm) | Out-Null # 设置目标分辨率为1600x900 $dm.dmPelsWidth = 1600 $dm.dmPelsHeight = 900 $result = [DisplayResolution]::ChangeDisplaySettings([ref]$dm, [DisplayResolution]::CDS_UPDATEREGISTRY) if ($result -eq [DisplayResolution]::DISP_CHANGE_SUCCESSFUL) { Write-Host "分辨率已成功设置为1600x900" } else { Write-Host "设置分辨率失败,错误代码: $result" }
把这个脚本保存为Set-DisplayResolution.ps1,在VSO Agent的测试任务中,先执行这个脚本,再启动Selenium测试即可。
方法3:调整Azure VM的Hyper-V视频适配器配置
对于Azure上的Windows Server 2012R2 VM,还可以通过PowerShell修改虚拟机的视频适配器设置,增加最大分辨率支持:
- 登录到Azure PowerShell或Azure Cloud Shell
- 运行以下命令(替换你的资源组和VM名称):
$vm = Get-AzVM -ResourceGroupName "你的资源组名称" -Name "你的VM名称" # 修改视频适配器的最大分辨率限制 $vm.VirtualMachineProfile.VideoAdapter.MaxResolutionWidth = 1600 $vm.VirtualMachineProfile.VideoAdapter.MaxResolutionHeight = 900 Update-AzVM -ResourceGroupName "你的资源组名称" -VM $vm
修改完成后重启VM,之后Agent会话的分辨率上限就会提升到你设置的数值。
补充说明:为什么RDP里分辨率设置灰掉?
这是因为Hyper-V的视频驱动在RDP会话中,分辨率是由RDP客户端和服务器协商决定的,默认不允许在会话中修改。只有在本地控制台会话(或者交互式Agent会话)中,才能手动修改分辨率,或者通过上述脚本/VM配置的方式强制调整。
内容的提问来源于stack exchange,提问作者Dodda Venkata
相关产品推荐
相关产品推荐

