使用 codedUI 在网页中选择隐藏的单选按钮

Selecting a hidden radio button in a webpage using codedUI

我正在尝试 select 编码 UI 中隐藏的单选按钮。我正在手工编码并使用 Visual Studio Professional 2015。

这是我的单选按钮 属性:

<span id="AddExtraDataWidget_un10_NoorgSportInd_WRAPPER">
<input id="AddExtraDataWidget_un10_No_GROUP" class="Radio" type="radio" value="AddExtraDataWidget_un10_No" onfocus="null" onblur="null" onclick="null;showHideCntrldByCaption(this.checked,'','No','false')" name="AddExtraDataWidget_un10_orgSportInd" tabindex="21"/></span>

我得到以下异常: “'Microsoft.VisualStudio.TestTools.UITest.Extension.FailedToPerformActionOnHiddenControlException' 发生在 Microsoft.VisualStudio.TestTools.UITesting.dll 但未在用户代码中处理”

我的代码是:

HtmlRadioButton radioButtonObject = new HtmlRadioButton(browserWindow);
            radioButtonObject.SearchProperties.Add(HtmlRadioButton.PropertyNames.Id, radioButtonObjectIDVal, PropertyExpressionOperator.Contains);
            radioButtonObject.SearchProperties.Add(HtmlRadioButton.PropertyNames.Name, radioButtonObjectNameVal, PropertyExpressionOperator.Contains);
            radioButtonObject.SearchProperties.Add(HtmlRadioButton.PropertyNames.Value, "AddExtraDataWidget_un10_No", PropertyExpressionOperator.Contains);
            radioButtonObject.SearchProperties.Add(HtmlRadioButton.PropertyNames.ControlType, "RadioButton", PropertyExpressionOperator.EqualTo);
            radioButtonObject.SearchProperties.Add(HtmlRadioButton.PropertyNames.Class, "Radio", PropertyExpressionOperator.EqualTo);
            radioButtonObject.SearchProperties.Add(HtmlRadioButton.PropertyNames.Type, "radio", PropertyExpressionOperator.EqualTo);
            radioButtonObject.SearchProperties.Add(HtmlRadioButton.PropertyNames.ClassName, "HtmlRadioButton", PropertyExpressionOperator.EqualTo);
            radioButtonObject.SearchProperties.Add(HtmlRadioButton.PropertyNames.TagName, "INPUT", PropertyExpressionOperator.EqualTo);

radioButtonObject.FindMatchingControls();
radioButtonObject.GetClickablePoint();
radioButtonObject.DrawHighlight();
radioButtonObject.Find();
radioButtonObject.EnsureClickable();
Mouse.Click(radioButtonObject);
radioButtonObject.Selected = fieldVal;

我几乎尝试了这些论坛和 MSDN 中建议的所有内容,但没有成功。

有人可以帮我解决这个问题吗?非常感谢您的帮助。

谢谢

搜索时越少越好。如果你知道id,你只需要设置id(假设id在页面中实际上是唯一的)。

HtmlRadioButton radioButtonObject = new HtmlRadioButton(browserWindow);
radioButtonObject.SearchProperties.Add(HtmlRadioButton.PropertyNames.Id, "AddExtraDataWidget_un10_No_GROUP", PropertyExpressionOperator.Equals);

拥有额外的搜索属性只会让测试变得比它需要的更难:)

如果有多个具有此部分 ID 的容器,则执行包含操作可能很危险。如果您需要部分匹配并且知道可能会找到多个匹配项,请使用 FindMatchingControls() 并使用 LINQ 或其他工具过滤到您想要的那个。

我这里有一个找到隐藏控件的例子http://codeduiexamples.com/examples/example1

您的控件是如何被隐藏的?例如,显示:none,可见性:隐藏,从 DOM 移除,...?

对于发现此问题的其他人 post,还有另一种方法可以解决此问题。本质上,OP 的搜索和过滤属性不正确。其他前端 UI 框架(KendoUI、Angular)将创建 "hidden" 的单选按钮,您将无法通过 Coded[=20 与它们交互=] 即使你的属性是正确的。这也可能会影响其他控件。

我的手动编码测试解决方案是编写一个如下所示的共享方法:

/// <summary>
/// Clicks any control on a page for the given area.
/// </summary>
/// <param name="controlObject">Control Object to Click</param>
public static void ClickControl(UITestControl controlObject, int offset = 5)
{
    Rectangle clickArea = controlObject.BoundingRectangle;
    Point clickPoint = new Point(clickArea.X + offset, clickArea.Y + offset);
    Mouse.Click(clickPoint);
}

用简单的英语来说,这使用控件的边界框单击其中的一个点(X 和 Y 值从左上角开始)。 ID 正确的控件可能会被隐藏,但您仍然可以单击它。