Appium / WinAppDriver无法找到上下文菜单-只能在某些计算机上

时间:2019-10-01 21:44:17

标签: selenium user-interface appium mstest winappdriver

我正在Windows 10上使用Appium / Winappdriver运行一组自动化的UI测试。该测试框架是使用mstest在Visual Studio 2017中编译的。

我遇到的问题是使用右键单击打开上下文菜单,然后从结果菜单中选择一个元素的测试。在本地,它可以工作。它也可以在我们的远程CI / CD机器上使用。但是,它不适用于该项目上的其他两个开发人员,并且我们花了两个工作日毫无结果地试图找出原因。

我们具有相同的Windows版本(Windows 10,版本1903),我们具有相同的Visual Studio 2017(我们也尝试了2019,没有运气),我们具有相同的显示器分辨率(1920 x 1080),针对相同的.NET Framework(4.72),我们具有相同的WinAppDriver等。

其他一切都很好。但是,当UI测试到达该上下文菜单时,测试失败,并显示错误“使用给定的搜索参数无法在页面上找到一个元素。”

我使用WinAppDriver UI记录器查找该元素的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在我同事的机器上找不到它。

3 个答案:

答案 0 :(得分:0)

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

我想排除XPath选择器在这里的潜在问题。根据您的语法,看起来您正在使用绝对XPath。根据情况的不同,它们可能会非常脆。并不是说这是根本问题,但我想尝试使用其他选择器将其排除。

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

使用相对的//表示法指示您的路径是在页面上的任意位置,而不是沿着元素本身的特定路径。

尝试一下,让我知道是否有帮助。

答案 1 :(得分: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();

答案 2 :(得分:0)

我刚刚复制了这个问题。我正在进行上周编写的测试,现在试图从桌面会话中找到上下文菜单时陷入了困境。我尝试使用各种XPath,按类名或仅按名称搜索,但这似乎没有什么区别。

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