我正试图通过FlaUI通过Python.NET从一个接口中使用一个通用成员。
下面的C#代码工作,
// myLegacyTreeItem is a valid AutomationElement
// this works and the default action expands the tree node
myLegacyTreeItem.Patterns.LegacyIAccessible.Pattern.DoDefaultAction();但是,下面对应的Python.NET代码不起作用,
# my_legacy_tree_item is a valid element
my_legacy_tree_item.Patterns.LegacyIAccessible.Pattern.DoDefaultAction()我收到以下错误,
AttributeError: 'UIA3FrameworkAutomationElement' object has no attribute 'LegacyIAccessible'我可以看到LegacyIAccessible成员正在使用泛型语法。但我想不出如何将它绑定到具体的类型。
https://github.com/FlaUI/FlaUI/blob/master/src/FlaUI.Core/FrameworkAutomationElementBase.Patterns.cs
using FlaUI.Core.Patterns;
namespace FlaUI.Core
{
public abstract partial class FrameworkAutomationElementBase : FrameworkAutomationElementBase.IFrameworkPatterns
{
private IAutomationPattern<IAnnotationPattern> _annotationPattern;
private IAutomationPattern<IDockPattern> _dockPattern;
private IAutomationPattern<IDragPattern> _dragPattern;
private IAutomationPattern<IDropTargetPattern> _dropTargetPattern;
private IAutomationPattern<IExpandCollapsePattern> _expandCollapsePattern;
private IAutomationPattern<IGridItemPattern> _gridItemPattern;
private IAutomationPattern<IGridPattern> _gridPattern;
private IAutomationPattern<IInvokePattern> _invokePattern;
private IAutomationPattern<IItemContainerPattern> _itemContainerPattern;
private IAutomationPattern<ILegacyIAccessiblePattern> _legacyIAccessiblePattern;
...
public IFrameworkPatterns Patterns => this;
IAutomationPattern<IAnnotationPattern> IFrameworkPatterns.Annotation => _annotationPattern ?? (_annotationPattern = InitializeAnnotationPattern());
IAutomationPattern<IDockPattern> IFrameworkPatterns.Dock => _dockPattern ?? (_dockPattern = InitializeDockPattern());
IAutomationPattern<IDragPattern> IFrameworkPatterns.Drag => _dragPattern ?? (_dragPattern = InitializeDragPattern());
IAutomationPattern<IDropTargetPattern> IFrameworkPatterns.DropTarget => _dropTargetPattern ?? (_dropTargetPattern = InitializeDropTargetPattern());
IAutomationPattern<IExpandCollapsePattern> IFrameworkPatterns.ExpandCollapse => _expandCollapsePattern ?? (_expandCollapsePattern = InitializeExpandCollapsePattern());
IAutomationPattern<IGridItemPattern> IFrameworkPatterns.GridItem => _gridItemPattern ?? (_gridItemPattern = InitializeGridItemPattern());
IAutomationPattern<IGridPattern> IFrameworkPatterns.Grid => _gridPattern ?? (_gridPattern = InitializeGridPattern());
IAutomationPattern<IInvokePattern> IFrameworkPatterns.Invoke => _invokePattern ?? (_invokePattern = InitializeInvokePattern());
IAutomationPattern<IItemContainerPattern> IFrameworkPatterns.ItemContainer => _itemContainerPattern ?? (_itemContainerPattern = InitializeItemContainerPattern());
IAutomationPattern<ILegacyIAccessiblePattern> IFrameworkPatterns.LegacyIAccessible => _legacyIAccessiblePattern ?? (_legacyIAccessiblePattern = InitializeLegacyIAccessiblePattern());
...
}
}如果按下面的方式更改调用,则没有错误,但树项没有展开,
((FrameworkAutomationElementBase.IFrameworkPatterns)(my_legacy_tree_item.Patterns)).LegacyIAccessible.Pattern.DoDefaultAction()试图使用下面的强制转换抛出错误,
((FrameworkAutomationElementBase.IFrameworkPatterns[ILegacyIAccessiblePattern])(parent.Patterns)).LegacyIAccessible.Pattern.DoDefaultAction()Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at Python.Runtime.GenericUtil.GenericByName(String ns, String name, Int32 paramCount)
at Python.Runtime.ClassBase.type_subscript(IntPtr idx)发布于 2022-02-08 03:52:12
回答我自己的问题,因为这是一个愚蠢的错误。
下面的行实际上扩展了遗留树项,
((FrameworkAutomationElementBase.IFrameworkPatterns)(my_legacy_tree_item.Patterns)).LegacyIAccessible.Pattern.DoDefaultAction()但是,由于在我的示例中,我也立即右键单击了同一项,在树项展开之前会弹出上下文菜单。因此,在上述调用之后添加sleep(1)对我来说是有效的。
另外,my_legacy_tree_item.DoubleClick()和sleep(1)也起作用。
https://stackoverflow.com/questions/71027774
复制相似问题