0

我在托管 Silverlight xap 的 asp.net 页面上有一个对象(在我的特殊情况下,它位于 IFrame 中,但我也对常规对象感到好奇)。我可以在 UI Spy 中找到该元素,但名称只是说“Silverlight Control”。试图在我的自动化测试中发现 AutomationElement 不成功(每次都控制为空)。Silverlight 代码或 html 中的设置是否有帮助?如果同一页面上有多个 Silverlight 控件,如何区分?

<object id="silverlightClient" style="display:none;" data="data:application/x-silverlight-2," type="application/x-silverlight-2">
    <param name="source" value="../../ClientBin/SilverlightApplication.xap"/>
    <param name="onerror" value="onSilverlightError" />
    <param name="background" value="#00000000" /> 
    <param name="minRuntimeVersion" value="4.0.41019.0" />
    <param name="autoUpgrade" value="true" />
    <param name="windowless" value="false" />
</object>

   TreeWalker tw = new TreeWalker(new System.Windows.Automation.PropertyCondition(AutomationElement.NameProperty, "Silverlight Control));
   AutomationElement control = tw.GetFirstChild(ancestor);

用户界面间谍

Identification
    ClassName: "MicrosoftSilverlight"
    ControlType: "ControlType.Window"
    Culture: "(null)"
    AutomationId: "71857844"
    LocalizedControlType: "window"
    Name: "Silverlight Control"
    ProcessId: "7636 (iexplore)"
    RuntimeId: "42 2163886"
    IsPassword: "False"
    IsControlElement: "True"
    IsContentElement: "True"

编辑:添加图像,我还意识到该对象位于 IFrame 内。 UISpyImage - 标题名称已删除

4

1 回答 1

0

我创建了一些扩展方法来使使用 AutomationElement 更容易一些。我在下面粘贴了相关的内容,但您可以在此处阅读有关它们的更多信息。

我假设您已经引用了根 IE 窗口。如果不是,但你知道它是进程 ID,你可以像这样找到它:

var ieWindow = AutomationElement.RootElement.FindChildByCondition(new PropertyCondition(AutomationElement.ProcessIdProperty, ieProcessId));

假设在 IE 中只打开了一个 Frame,并且上面有一个 Silverlight 控件,那么您可以执行以下操作:

var silverlightControl = ieWindow.FindDescendentByClassPath(
                         new[]{
                               "Frame Tab",
                                 "TabWindowClass",
                                   "Shell DocObject View",
                                     "Internet Explorer_Server",
                                       "MicrosoftSilverlight",
                               });

如果您有多个 Silverlight 控件,我不知道通过 UIAutomation 区分它们的方法。我会尝试从上面的类路径中删除“MicrosoftSilverlight”条目,以便您获得对资源管理器页面的引用。然后使用

AutomationElement.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "MicrosoftSilverlight"))

找到所有 SilverlightControls,然后依次探测它们,并在其中找到一些元素,以便您区分它们。

以下是扩展方法:

public static class AutomationExtensions
{
    public static AutomationElement FindDescendentByClassPath(this AutomationElement element, IEnumerable<string> classNames)
    {
        var conditionPath = CreateClassNameConditionPath(classNames);

        return element.FindDescendentByConditionPath(conditionPath);
    }

    public static AutomationElement FindDescendentByConditionPath(this AutomationElement element, IEnumerable<Condition> conditionPath)
    {
        if (!conditionPath.Any())
        {
            return element;
        }

        var result = conditionPath.Aggregate(
            element,
            (parentElement, nextCondition) => parentElement == null
                                                  ? null
                                                  : parentElement.FindChildByCondition(nextCondition));

        return result;
    }

    public static AutomationElement FindChildByCondition(this AutomationElement element, Condition condition)
    {
        var result = element.FindFirst(
            TreeScope.Children,
            condition);

        return result;
    }

    public static IEnumerable<Condition> CreateClassNameConditionPath(IEnumerable<string> classNames)
    {
        return classNames.Select(name => new PropertyCondition(AutomationElement.ClassNameProperty, name, PropertyConditionFlags.IgnoreCase)).ToArray();
    }
}
于 2010-08-05T09:51:33.757 回答