在 UITestControl 而不是 BrowserWindow 的范围内搜索时,CodedUI 无法识别 HtmlControl

CodedUI not recognizing HtmlControl when searched within scope of UITestControl instead of BrowserWindow

Page 的页面对象模型中,我们在构造函数中初始化一个 Container 并定义一个名为 MyTextBoxHtmlEdit 和一个使用此文本框的方法搜索。

public class Page 
{
    private readonly UITestControl _container;
    private HtmlEdit _myTextBox;
    private const string MyTextBoxId = "MyTextBoxHtmlId";

    protected Page()
    { }

    protected Page(Process process)
    {
        CurrentBrowser = BrowserWindow.FromProcess(process);
        _container = CurrentBrowser;
    }

    public UITestControl Container
    {
       get { return _container; }
    }

    protected HtmlEdit MyTextBox
    {
        get
        {
            if (_myTextBox == null)
            {
                _myTextBox = Container.FindHtmlEditById(MyTextBoxId);
            }

            return _myTextBox;
        }
    }

    public Page SearchMethod(string accountId)
    {
         MyTextBox.CopyPastedText = accountId;

         // Do the search

         return this;
    }
}

这里我们想使用一个UITestControl作为容器,这样我们就可以在页面的特定区域内进行搜索。 getter 中的 FindHtmlEditById 扩展方法通过其 html id 查找元素,如下所示:

public static class Extensions 
{
    public static HtmlEdit FindHtmlEditById(this UITestControl control, string id)
    {
        return new HtmlEdit(control).FindById(id);
    }

    public static TUIControl FindById<TUIControl>(this TUIControl control, string id) 
         where TUIControl : HtmlControl 
    {
        control.SearchProperties.Add(HtmlControl.PropertyNames.Id, id, 
            PropertyExpressionOperator.Contains);

        return control;
    }
}

所以FindHtmlEditByIdContainer.

范围内搜索具有特定id的元素

当我们执行代码并且执行将文本粘贴到 MyTextBox 时,我们得到以下错误:

MyTextBox.CopyPastedText = 'MyTextBox.CopyPastedText' threw an exception of type 'System.NotSupportedException'

此外,MyTextBoxControlTypeWindow,如下所示:

PageContainer字段的类型改为BrowserWindow时如下:

private readonly BrowserWindow _container;

public BrowserWindow Container
{
    get { return _container; }
}

MyTextBox 被正确识别为 HtmlEdit:

BrowserWindow 继承自 UITestControl。那么为什么 Container 需要指定为 BrowserWindow 才能工作?为什么它不能用作 UITestControl

BrowserWindow 不继承自 UITestControl,而是 UITesting namespace 下的 class。因此,它将有自己的属性、方法等。将您的对象创建为 BrowserWindow 对象以解决您的异常。

但是,要回答您更一般的继承问题,即使 BrowserWindow 继承自 UITestControl,在处理继承时:虽然子项将从父项继承所有属性和方法,但父项不会有任何在其子项中创建或覆盖的方法。因此,BrowserWindow 可以有一个方法 .FindMyHtmlById(),但如果您的对象是 UITestControl 类型,则该方法不可用。

你能提供一个带有复制品的 zip 文件让我仔细看看吗?从屏幕截图中可以明显看出,在一种情况下,您得到的是 Window 控件,而不是您正在搜索的 HtmlEdit,但由于我无法给出结论性原因。您的 CurrentBrowser 代码中可能存在错误,因为这似乎是一个不正确的构造,但也可能只是粘贴代码中的一个缺陷。我复制了代码并尝试使用 bing 主页作为将文本传入的页面进行重现,这非常有效。所以我怀疑你的目标网站的搜索结果有所不同。可能导致这种情况的一件事是您在搜索中使用的 contains 运算符,因为这可能会导致多个匹配项,具体取决于您进行搜索的页面。当它 returns 多个控件时,你的调用也会失败,但是看看你穿的鞋,你没有得到多个控件,而是一个 window 和 windows class 编辑,这更像是 WinEdit 控件,然后是 HtmlEdit 控件。