我正在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测试也可以正常工作。只是这个特定的区域失败了。
到目前为止,我已经尝试过:
最大的麻烦是,当我们使用UI Recorder检查时,该元素就在其中。当我们检查我的机器或远程构建机器时,WinAppDriver可以正常找到它。但是由于某些原因,WinAppDriver在我同事的机器上找不到它。
答案 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,这解决了问题!如果您遇到此问题,请尝试关闭每个应用程序窗口。