-1

WinAppDriver 的 FindElement 不会总是在程序中找到要自动化的对象。

我已经让它与其他程序一起工作,比如记事本,甚至我的程序中的一个不同的对话框都可以自动化,并且它在那些地方工作。

这是我目前使用的代码。前三行执行没有错误,成功地将应用程序启动到它的登录对话框中:

Dim appCapabilities As DesiredCapabilities = New DesiredCapabilities()
appCapabilities.SetCapability("app", "C:\[my program].exe")
Dim ProgramSession = New WindowsDriver(Of WindowsElement)(New Uri("http://127.0.0.1:4723"), appCapabilities)

ProgramSession.FindElementByName("Password").SendKeys("Password")

第四行应该找到元素,一个文本框,并通过 sendkeys 将字符串“密码”输入其中,但它失败了,除了以下异常:

System.InvalidOperationException:“使用给定的搜索参数无法在页面上找到元素。”

目标对象在屏幕上,这应该可以工作。我正在使用为 Inspect.exe 中的对象显示的信息,名称:“密码”。

WinAppDriver 的窗口显示以下错误信息:

{"using":"name","value":"Password"}
HTTP/1.1 404 Not Found
Content-Length: 139
Content-Type: application/json

{"status":7,"value":{"error":"no such element","message":"使用给定的搜索参数无法在页面上找到一个元素。"}}

4

2 回答 2

0

我能够通过使用FindElementByXPath而不是找到密码字段FindElementByName

为了找到 xpath,我使用了 WinAppDriver 的 Recorder。

这些 xpath 可能非常长。我可以通过删除一些重复的属性来缩短其中的一些属性,但有些属性的长度超过 450 个字符。有时我可以使用变量进一步减少它,但到目前为止,我对 WinAppDriver 作为 CodedUI 的替代品并不十分满意。

于 2019-04-24T13:09:41.223 回答
0

程序启动后直接执行第四行代码。由于程序需要一些加载时间,因此您需要等待程序完成加载,然后再尝试在 GUI 上搜索控件。您可以通过将 while 循环与秒表结合使用来实现此目的,以实现超时。

Dim shouldContinue As Boolean = True
Dim stopWatch As StopWatch = New StopWatch()
Dim timeOut As TimeSpan = TimeSpan.FromSeconds(30)
stopWatch.Start()

While shouldContinue AndAlso timeOut > stopWatch.Elapsed

    If element.IsFound Then
        shouldContinue = False
        stopWatch.Stop()
    End If
End While

element.IsFound只是模拟代码,您需要填写该空白。是一个很好的问答,向您展示如何检查元素是否已加载。

您需要考虑的另一件事是您的登录对话框在另一个窗口句柄中运行的可能性。如果 winappdriver 使用的窗口句柄与元素所在的窗口句柄不同,您将无法找到该元素。

PageSource还要检查您是否可以在驱动程序的属性 xml中找到您要搜索的任何内容。我通常通过在 Visual Studio 监视窗口中调用该属性并将其内容复制到 xml 格式化程序工具来执行此操作。

于 2019-04-23T07:40:36.293 回答