0

我有以下 HTML

`<table id="tableRepeat44" class="scaledTableGroup">
 <tbody>
   <tr>
   <tr class="grpTableRegRow">
     <td class="borderCell" title="Strongly Disagree">
       <input id="QID16108TAG1" value="1" name="QID16108TAG" type="radio">
     <td class="borderCell" title="Disagree">
       <input id="QID16108TAG2" value="2" name="QID16108TAG" type="radio">
     <td class="borderCell" title="Somewhat Disagree">
       <input id="QID16108TAG3" value="3" name="QID16108TAG" type="radio">
     <td class="borderCell" title="Somewhat Agree">
       <input id="QID16108TAG4" value="4" name="QID16108TAG" type="radio">
     <td class="borderCell" title="Agree">
       <input id="QID16108TAG5" value="5" name="QID16108TAG" type="radio">
     <td class="borderCell" title="Strongly Agree">
       <input id="QID16108TAG6" value="6" name="QID16108TAG" type="radio">
     <td class="questionColumn">
       <span id="lblsubq16108_7" class="Answer">This is a question. </span>
     </td>
   </tr>
   <tr class="grpTableAltRow">
   <tr class="grpTableRegRow">
   <tr class="grpTableAltRow">
 </tbody>
</table>`

每行包含与展开的第一行相同的语法。我希望通过 CodedUI 做的是获取所有问题的文本(例如 td:nth-of-type(7) > span || class="Answer"),然后导航到父行,以便我可以访问同意/不同意单选按钮 tds 并根据传入的参数进行选择。

我已经尝试过

        HtmlCustom questionsTable = new HtmlCustom(browser);
        HtmlControl controls = new HtmlControl(questionsTable);
        if (howToAnswer.Trim().ToLower() == "correct")
        {
            questionsTable.SearchProperties[HtmlCustom.PropertyNames.TagName] = "Tbody";
            controls.SearchProperties.Add(HtmlControl.PropertyNames.Class, "Answer");
            UITestControlCollection collection = controls.FindMatchingControls();

            foreach (UITestControl answers in collection)
            {
                Debug.Write(answers);
            }                
        }

它导致ControlType [Pane] ClassName [HtmlPane] TagName [SPAN], UniqueIdentifier [154] Id [lblsubq16172_7] Name []表格中的每一行。所以我很接近,但我无法弄清楚如何获取.InnerText无法访问的文本answers

最后要解决的问题是如何在保持对特定行的引用的同时来回导航?

4

1 回答 1

1

这实际上是一个很酷的问题。请记住,Coded UI 中 DOM 中的所有元素都有一个父元素和一组子元素。

简而言之,您要做的是:

  • 创建表格控件
  • 遍历每一行
  • 在每一行中,找到第一个带有 class = "Answer" 的 HtmlSpan。将此添加到 HtmlSpans 的集合中。
  • 一旦你有了这个 Spans 集合,你就可以再次遍历这个集合。从那里我建议创建一个基于属性获取“兄弟控件”的辅助方法。该方法将查看父控件的子集合,然后从那里获取一个元素。

仅当您在遍历表中的每一行时不能只选择正确答案时,需要最后一步。在我的书中,我宁愿:

  • 遍历每一行
  • 查找 Answer 元素及其内部文本
  • 通过检查同一行中的正确单选按钮,使用内部文本选择正确答案(我假设这是数据驱动的)。

这有意义吗?让我知道这是否有帮助,或者您是否需要更多详细信息。我没有我的辅助方法代码,但它非常简单。就像是:

public static UiTestControl GetSiblingByClass (UiTestControl ctrl, string class) {
    var parent = ctrl.Parent;
    var controlToReturn = new UiTestControl(parent);
    controlToReturn.SearchProperties[HtmlControl.PropertyNames.Class] = class;
    return controlToReturn;
}
于 2017-02-01T23:06:54.137 回答