【问题标题】:FindElements not working for controls in some parts of some Windows programsFindElements 不适用于某些 Windows 程序的某些部分中的控件
【发布时间】:2019-09-09 02:20:09
【问题描述】:

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 的窗口显示如下错误信息:

{"使用":"名称","值":"密码"}
HTTP/1.1 404 未找到
内容长度:139
内容类型:application/json

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

【问题讨论】:

    标签: vb.net winappdriver


    【解决方案1】:

    程序启动后直接执行第四行代码。 由于程序需要一些加载时间,因此您需要等待程序完成加载,然后再尝试在 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 格式化工具来做到这一点。

    【讨论】:

    • 我使用断点来确保第 4 行的登录对话框存在。不过我应该提一下...
    • 大声笑,是的,那会很有帮助。努力并没有完全浪费,我可能为您提供了一些有用的代码来处理程序加载:-)。
    • 我能够通过 xpath 解析对象,所以我不确定句柄是否是使用 FindElementByName 的问题的一部分。
    • 嗯,好的。把手不会是你的问题。登录页面可能没有名为“密码”的元素,您可以与制作该程序的开发人员确认。一个小提示,如果您在查找元素时遇到问题,最好将您的 PageSource xml 连同查询 gui 的代码一起发布。
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我也来自 CodedUI。我需要一点时间来习惯使用 XPath,但是一旦我习惯了,我发现它是一种非常强大的查询 gui 的方法。我发现this 资源非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2019-09-06
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多