FindElements不适用于某些Windows程序某些部分中的控件

时间:2019-04-18 17:41:04

标签: vb.net winappdriver

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在其中输入字符串“ Password”,但是失败,但以下情况除外:

  

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

     

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

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

  

{“正在使用”:“名称”,“值”:“密码”}
  找不到HTTP / 1.1 404
  内容长度:139
  内容类型:application / json

     

{“状态”:7,“值”:{“错误”:“没有这样的元素”,“消息”:“使用给定的搜索参数无法在页面上找到元素。”}}

2 个答案:

答案 0 :(得分: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只是模型代码,您需要填写该空白。 This是一个很好的问答,它向您展示了如何检查元素是否已加载。

您需要考虑的另一件事是the possibility that your Login Dialog runs in another window handle。如果winappdriver使用的窗口句柄与元素所在的窗口句柄不同,则将找不到该元素。

还要检查是否可以从驱动程序的PageSource属性xml中找到要搜索的内容。通常,我可以通过在Visual Studio监视窗口中调用该属性,然后将其内容复制到xml格式化工具来实现此目的。

答案 1 :(得分:0)

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

为了找到xpath,我使用了WinAppDriver记录器。

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