最近,我一直在深入研究Microsoft.VisualStudio.TestTools.UITesting.HtmlControls,并且一直很开心地扩展了这个库,将其他的HTML元素(不管是什么原因)排除在了CodedUI命名空间之外。
我注意到我可以做这样的事情:
var divs = new HtmlDiv(window).FindMatchingControls().OfType<HtmlDiv>();这将返回您期望的结果:一个具有与FindMatchingControls()调用相同的元素的FindMatchingControls()调用(只键入HtmlDiv而不是UITestControl)。
而且,我可以这样做:
public class HtmlHeader : HtmlCustom
{
public static readonly string HeaderTag = "header";
public HtmlHeader() : base() {
this.SearchProperties.Add(HtmlControl.PropertyNames.TagName, HeaderTag, PropertyExpressionOperator.EqualTo);
}
public HtmlHeader(UITestControl parent) : base(parent) {
this.SearchProperties.Add(HtmlControl.PropertyNames.TagName, HeaderTag, PropertyExpressionOperator.EqualTo);
}
}就算是这样也行:
var headerTag = new HeaderTag(window);它将在屏幕上找到标题标签,并为您获取第一个标签。
var headerTags = new HeaderTag(window).FindMatchingControls();很好,但是
var headerTags = new HeaderTag(window).FindMatchingControls().OfType<HeaderTag>();是空的。
为什么上面命名空间中的HtmlControls正确地解析类型?
我是否能够利用隐式转换运算符/其他一些技巧来获得OfType()来返回HtmlTags的集合?
我开始写一个转换,比如:
protected HeaderTag ConvertControl(HtmlControl toConvert)
{
if (StringComparer.OrdinalIgnoreCase(toConvert.TagName, "header"))
{
var ret = new HeaderTag();
ret.SearchProperties.AddRange(toConvert.SearchProperties);
ret.SearchConfigurations = toConvert.SearchConfigurations;
ret.FilterProperties.AddRange(toConvert.FilterProperties);
// screen element
// technology is already set - web
// cached queryid
// cached parent
// boundary screen element
return ret;
}
throw new InvalidOperationException("Control cannot be converted.");
}但是,在解压缩HtmlControl类型本身之后,我看到了一个无法访问的CopyFromControl方法;而且,它设置的字段是不可访问的(上面的注释)。
我不确定复制这些字段是否真的很重要,以及它们是否过于重要,但我希望找到一个更好的解决方案。如果没有什么更好的事情发生,我可能会求助于反思,但如果可以避免的话,我宁愿不走那条路。
发布于 2015-03-26 09:04:45
UITestControl只是一个访问本机UI控件的包装器。一旦找到UI控件,UITestControl就会保留对该对象的引用。然后可以使用它的CopyFrom函数复制该引用(以及搜索属性)。
因此,与转换或转换不同,您可以(而且可能应该)只对您自己类的一个实例调用CopyFrom函数,将FindMatchingControls返回的UITestControl传递给它。
我对Linq不够精巧,所以代码不太漂亮,但是这样的代码会起作用的:
List<HeaderTag> list = new List<HeaderTag>();
foreach (var item in new HeaderTag(window).FindMatchingControls())
{
HeaderTag temp = new HeaderTag();
temp.CopyFrom(item);
list.Add(temp);
}我不知道为什么强制转换没有,因为您的类是从UITestControl派生的。但如果转换失败,则应使用CopyFrom。
https://stackoverflow.com/questions/29269294
复制相似问题