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,“值”:{“错误”:“没有这样的元素”,“消息”:“使用给定的搜索参数无法在页面上找到元素。”}} >
答案 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并不满意。