我正在 Windows 10 上使用 Appium/Winappdriver 运行一组自动化 UI 测试。测试框架是使用 mstest 在 Visual Studio 2017 中编译的。
我遇到的问题是使用右键单击打开上下文菜单的测试,然后从结果菜单中选择一个元素。在本地,它有效。它也适用于我们的远程 CI/CD 机器。但是,它不适用于该项目的其他两个开发人员,我们花了两个工作日试图找出原因,但徒劳无功。
我们有相同的 Windows 版本(Windows 10,版本 1903),我们有相同的 Visual Studio 2017(我们也在 2019 上尝试过,没有运气),我们有相同的显示器分辨率(1920 x 1080),我们的目标相同.NET 框架(4.72),我们有相同的 WinAppDriver 等。
其他一切都很好。但是,当 UI 测试到达该上下文菜单时,测试失败并出现错误“使用给定的搜索参数无法在页面上找到一个元素”。
我使用 WinAppDriver UI Recorder 来查找元素的 XPath。我们还在其他用户的机器上使用了它,并确认就 UI Recorder 而言,两台机器上的路径是相同的。
失败的具体调用:
Session.FindElementByXPath("/Pane[@ClassName=\"#32769\"][@Name=\"Desktop 1\"]/Menu[@ClassName=\"#32768\"][@Name=\"Context\"]/MenuItem[@Name=\"" + itemName + "\"]");
我机器上的 WinAppDriver 调用(成功):
{"using":"xpath","value":"/Pane[@ClassName=\"#32769\"][@Name=\"Desktop 1\"]/Menu[@ClassName=\"#32768\"][@Name=\"Context\"]/MenuItem[@Name=\"New Location\"]"}
HTTP/1.1 200 OK
Content-Length: 125
Content-Type: application/json
{"sessionId":"8970FDC1-E869-4304-A87D-D8F2CB711EA2","status":0,"value":{"ELEMENT":"42.856234.4.-2147483646.8140.18614751.1"}}
并在其他用户的机器上进行相同的调用(失败):
{"using":"xpath","value":"/Pane[@ClassName=\"#32769\"][@Name=\"Desktop 1\"]/Menu[@ClassName=\"#32768\"][@Name=\"Context\"]/MenuItem[@Name=\"New Location\"]"}
HTTP/1.1 404 Not Found
Content-Length: 139
Content-Type: application/json
{"status":7,"value":{"error":"no such element","message":"An element could not be located on the page using the given search parameters."}}
同样,其他一切都有效。其他不使用右键单击上下文菜单的 UI 测试工作得很好。只有这个特定的区域失败了。
到目前为止我已经尝试过:
- 在拨打电话之前使用 Thread.Sleep 强制等待很长时间
- 使用 DefaultWait 包装调用并在几秒钟内对其进行轮询,以查看该元素在此期间是否可用。
- 当抛出“找不到元素”时,重试最多设置的次数以找到该元素。
- 大量重复检查以确保我们都使用相同版本的代码、相同的库、相同的 nuget 包等。
- 尝试更广泛的定位器( Session.FindElementByName(itemName); )
最令人头疼的是,当我们使用 UI Recorder 检查时,该元素就在那里。当我们检查我的机器或远程构建机器时,WinAppDriver 可以正常找到它。但由于某种原因,WinAppDriver 在我同事的机器上找不到它。