Jenkins构建失败:VSTest执行异常及Selenium元素定位超时问题
解决CI构建中的VSTest与Selenium测试问题
嘿,我帮你拆解了这次CI构建遇到的几个问题,咱们逐个来解决:
1. .NET框架与平台不匹配问题
你遇到的核心问题是AutomationCisive.dll的编译配置(.NET 4.7.2 + AnyCPU)和测试运行设置(.NET 4.5 + X64)不兼容,导致VSTest无法正常执行。
解决思路:
- 对齐配置:要么修改测试运行配置文件(
.runsettings),把目标.NET框架改成4.7.2,平台设置为AnyCPU;要么调整AutomationCisive测试项目的编译属性,将目标框架改为4.5,平台目标设为X64,重新生成dll后再运行测试。 - 兼容多版本(可选):如果需要同时支持多个.NET版本,可以在测试项目的
.csproj里添加<TargetFrameworks>net45;net472</TargetFrameworks>,但要注意项目依赖的包是否兼容这两个版本。
2. 数据收集器找不到CodeCoverage.exe问题
这个问题大概率是VS安装时没包含代码覆盖率工具,或者路径配置有误:
解决步骤:
- 检查VS安装组件:打开Visual Studio 2017安装器,切换到"单个组件"标签,找到代码覆盖率工具并确保已安装,没安装的话勾选后更新VS。
- 手动指定工具路径:如果工具已安装但VSTest找不到,可以在
.runsettings文件里添加CodeCoverageExecutablePath配置,示例如下:<DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <Configuration> <CodeCoverage> <IncludeTestAssembly>True</IncludeTestAssembly> <CodeCoverageExecutablePath>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe</CodeCoverageExecutablePath> </CodeCoverage> </Configuration> </DataCollector> - 配置环境变量:把VS的动态代码覆盖率工具路径(就是上面的
CodeCoverage.exe所在目录)添加到系统PATH环境变量里,确保CI进程能找到这个工具。
3. Selenium元素定位超时问题(#NewCaseFormButton找不到)
这个用例失败是因为Chrome 81下无法定位到目标元素,120秒超时后抛出异常,咱们从几个方向排查:
解决办法:
- 确认元素的实际位置:用Chrome开发者工具(F12)检查
#NewCaseFormButton是否存在,有没有嵌套在iframe或者shadow DOM里。如果在iframe里,需要先切换到对应的iframe再定位:driver.SwitchTo().Frame("iframe-id-or-name"); // 之后再查找元素 - 优化等待策略:不要依赖固定等待,改用显式等待结合元素可见的条件,确保元素渲染完成后再操作:
(注意:如果你用的是Selenium 4+,ExpectedConditions已经移到var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(120)); var newCaseButton = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.CssSelector("#NewCaseFormButton")));SeleniumExtras.WaitHelpers包,需要先安装这个NuGet包) - 匹配ChromeDriver版本:Chrome 81.0.4044.122对应的ChromeDriver版本必须是81.x.x.x,CI环境里的ChromeDriver版本不对会导致各种定位异常,替换成对应版本即可。
- 等待页面完全加载:有时候页面DOM加载完了,但JS还没渲染完元素,可以先等待页面状态完成:
wait.Until(d => ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete")); - 检查选择器有效性:可能元素的id是动态生成的,或者前端代码更新了id,用开发者工具重新复制最新的CSS选择器或XPath,替换测试代码里的旧选择器。
内容的提问来源于stack exchange,提问作者Ishtiyak
相关产品推荐
相关产品推荐

