【问题标题】:Issue with setting AutomationElement value设置 AutomationElement 值的问题
【发布时间】:2019-12-15 19:11:54
【问题描述】:

我在使用 ValuePattern.SetValue() 方法设置 AutomationElement 值时遇到问题。

在出现一些对话框之前一切正常。当对话框出现时,代码执行被卡住了。不会抛出异常。确认对话框后,代码执行将继续。下面是代码示例:

            BasePattern basePattern = null;
            ValuePattern valuePattern = null;

            AutomationElement elementA = Window.GetElement(SearchCriteria.ByText(propertyName));

            object patternObjectA = null;          
            elementA.TryGetCurrentPattern(ValuePattern.Pattern, out patternObjectA);               

            basePattern = (BasePattern)patternObjectA;
            valuePattern = (ValuePattern)patternObjectA;     

            valuePattern.SetValue(optionToSet);

// Window.GetElement() 是来自 TestStack.White 框架的方法

// 代码执行卡在最后一行,直到对话框被确认

还有其他方法可以设置 AutomationElement 值吗?

是否有可能避免被对话框卡住?

如有任何帮助,我将不胜感激。 提前谢谢。

【问题讨论】:

    标签: ui-automation microsoft-ui-automation


    【解决方案1】:

    可能是此对话框不支持 UI 自动化正确您只是定位错误的元素

    验证您是否可以使用Inspect.exe from Microsoft 或类似工具。


    如果有效,请再次检查您的代码是否真的针对正确的组件。

    如果它不起作用并且:

    • 如果您能够更改应用程序

      1. 您可以更改 UI 组件的所谓 AutomationPeer - 这里是 link 了解更多信息
      2. 或者干脆使用另一个正确支持 UI 自动化的 UI 组件。
    • 如果您无法更改应用程序,并且也不需要在后台运行、并行运行等。您可以只关注组件(调用 setFocus() 到AutomationElement,或展开它(通过 IsExpandCollapsePatternAvailable 或模拟 MouseClick 到组件坐标上),然后使用 SendKeys.SendWait("test") 方法。


    编辑:还有一件事你应该看看,我想知道为什么我一开始没有提到它:Register to UI Automation Events 例如,您可以为 Structure change 事件类型注册一个回调,并检查您所说的对话框是否出现。 如果是这样 --> 点击对话框的确认按钮。

    您可能必须同步执行,以便 UI 自动化脚本中的每个进一步操作都等到执行注册的回调并单击确认按钮。

    【讨论】:

    • 我一直在研究其他问题,所以我几乎忘记了这个问题。我已经完成了您的建议并在 Inspect 中使用了 Value.SetValue 函数,但我遇到了类似的问题。当对话框出现时,检查卡住了。确认对话框后,Inspect 开始工作。使用正确支持 UI 自动化的另一个元素是什么意思? SendKeys.SendWait() 也不是解决方案,因为我尝试自动化的 UI 元素是选项列表(列表视图下拉),您需要选择一个选项而不是输入值。
    • 因为 Inspect.exe 与“列表视图下拉”有相同的问题,我坚信“列表视图下拉”的 UI 自动化 API 已损坏。因此,问题在于您正在测试的应用程序(而不是您编写的 UI 自动化代码)。对于“使用另一个元素”,我的意思是选择正确实现 UI 自动化 API 的不同 UI 组件(“列表视图下拉列表”除外)。如果您出于某种原因需要使用此“列表视图下拉菜单”,您可以按照建议“更改 AutomationPeer”...
    • 关于 SendKeys.SendWait():我想回想一下标准下拉菜单用于使用它,但您可能必须先展开它们(使用 IsExpandCollapsePatternAvailable - 如果 IsExpandCollapsePatternAvailable 不受支持(这将再次成为关于 UI 自动化的 UI 组件的问题)您可以尝试使用(自动)鼠标单击到组件坐标上...)
    • 感谢您提供的所有全面的答案。现在,我要处理它。希望我能最终解决这个问题。
    • @Olafvolafka 刚刚注意到您还有另一个选择,请阅读添加的“编辑”部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多