在 UITestControl 而不是 BrowserWindow 的范围内搜索时,CodedUI 无法识别 HtmlControl
CodedUI not recognizing HtmlControl when searched within scope of UITestControl instead of BrowserWindow
在 Page
的页面对象模型中,我们在构造函数中初始化一个 Container
并定义一个名为 MyTextBox
的 HtmlEdit
和一个使用此文本框的方法搜索。
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;
}
}
所以FindHtmlEditById
在Container
.
范围内搜索具有特定id的元素
当我们执行代码并且执行将文本粘贴到 MyTextBox
时,我们得到以下错误:
MyTextBox.CopyPastedText = 'MyTextBox.CopyPastedText' threw an exception of type 'System.NotSupportedException'
此外,MyTextBox
的ControlType
是Window
,如下所示:
当Page
中Container
字段的类型改为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 控件。
在 Page
的页面对象模型中,我们在构造函数中初始化一个 Container
并定义一个名为 MyTextBox
的 HtmlEdit
和一个使用此文本框的方法搜索。
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;
}
}
所以FindHtmlEditById
在Container
.
当我们执行代码并且执行将文本粘贴到 MyTextBox
时,我们得到以下错误:
MyTextBox.CopyPastedText = 'MyTextBox.CopyPastedText' threw an exception of type 'System.NotSupportedException'
此外,MyTextBox
的ControlType
是Window
,如下所示:
当Page
中Container
字段的类型改为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 控件。