首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展CodedUI HtmlControls并保留类型

如何扩展CodedUI HtmlControls并保留类型
EN

Stack Overflow用户
提问于 2015-03-26 00:57:38
回答 1查看 618关注 0票数 1

最近,我一直在深入研究Microsoft.VisualStudio.TestTools.UITesting.HtmlControls,并且一直很开心地扩展了这个库,将其他的HTML元素(不管是什么原因)排除在了CodedUI命名空间之外。

我注意到我可以做这样的事情:

代码语言:javascript
复制
var divs = new HtmlDiv(window).FindMatchingControls().OfType<HtmlDiv>();

这将返回您期望的结果:一个具有与FindMatchingControls()调用相同的元素的FindMatchingControls()调用(只键入HtmlDiv而不是UITestControl)。

而且,我可以这样做:

代码语言:javascript
复制
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);
    }
}

就算是这样也行:

代码语言:javascript
复制
var headerTag = new HeaderTag(window);

它将在屏幕上找到标题标签,并为您获取第一个标签。

代码语言:javascript
复制
var headerTags = new HeaderTag(window).FindMatchingControls();

很好,但是

代码语言:javascript
复制
var headerTags = new HeaderTag(window).FindMatchingControls().OfType<HeaderTag>();

是空的。

为什么上面命名空间中的HtmlControls正确地解析类型?

我是否能够利用隐式转换运算符/其他一些技巧来获得OfType()来返回HtmlTags的集合?

我开始写一个转换,比如:

代码语言:javascript
复制
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方法;而且,它设置的字段是不可访问的(上面的注释)。

我不确定复制这些字段是否真的很重要,以及它们是否过于重要,但我希望找到一个更好的解决方案。如果没有什么更好的事情发生,我可能会求助于反思,但如果可以避免的话,我宁愿不走那条路。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-26 09:04:45

UITestControl只是一个访问本机UI控件的包装器。一旦找到UI控件,UITestControl就会保留对该对象的引用。然后可以使用它的CopyFrom函数复制该引用(以及搜索属性)。

因此,与转换或转换不同,您可以(而且可能应该)只对您自己类的一个实例调用CopyFrom函数,将FindMatchingControls返回的UITestControl传递给它。

我对Linq不够精巧,所以代码不太漂亮,但是这样的代码会起作用的:

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29269294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档