3

我正在 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 测试工作得很好。只有这个特定的区域失败了。

到目前为止我已经尝试过:

  1. 在拨打电话之前使用 Thread.Sleep 强制等待很长时间
  2. 使用 DefaultWait 包装调用并在几秒钟内对其进行轮询,以查看该元素在此期间是否可用。
  3. 当抛出“找不到元素”时,重试最多设置的次数以找到该元素。
  4. 大量重复检查以确保我们都使用相同版本的代码、相同的库、相同的 nuget 包等。
  5. 尝试更广泛的定位器( Session.FindElementByName(itemName); )

最令人头疼的是,当我们使用 UI Recorder 检查时,该元素就在那里。当我们检查我的机器或远程构建机器时,WinAppDriver 可以正常找到它。但由于某种原因,WinAppDriver 在我同事的机器上找不到它。

4

3 回答 3

0

对于我的应用程序上下文菜单在 inspect.exe 中的实际应用程序的 DOM 中列出。因此,在选择上下文菜单后切换回桌面会话对我来说效果很好。

var regressionChannelRow = labelProcessorSession.FindElementByName("5000");
Actions action1 = new Actions(labelProcessorSession);
regressionChannelRow.Click();
action1.ContextClick(regressionChannelRow).Perform();

现在创建一个桌面会话以从上下文菜单中获取“停止”选项

AppiumOptions appCapabilities = new AppiumOptions();
appCapabilities.AddAdditionalCapability("app", "Root");
WindowsDriver<WindowsElement> desktopSession;
desktopSession = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), appCapabilities);

下面是我需要选择的上下文菜单选项,记得在这里使用桌面会话

var stopService = desktopSession.FindElementByName("Stop");
stopService.Click();
于 2020-03-18T07:52:27.750 回答
0

我刚刚复制了这个问题。我正在处理我上周编写的测试,现在在尝试从桌面会话中查找上下文菜单时遇到了困难。我尝试使用各种 XPath,按类名或名称搜索,但似乎没有任何区别。

最终我尝试关闭 Spotify,这解决了问题!如果您遇到此问题,请尝试关闭所有可能的应用程序窗口。

于 2020-06-15T14:14:33.497 回答
0

这确实是一个奇特的问题。

我想在这里排除 XPath 选择器是一个潜在问题。根据您的语法,您似乎使用的是绝对 XPath。根据具体情况,它们可能非常脆弱。并不是说这是根本问题,但我想尝试使用不同的选择器来排除这种情况。

{"using":"xpath","value":"//MenuItem[@Name=\"New Location\"]"}

使用相对//表示法告诉您的路径可以查看页面上的任何位置,而不是沿着特定路径向下到达元素本身。

试试这个,让我知道它是否有帮助。

于 2019-10-01T22:40:04.123 回答