2017-01-31 13 views
0

У меня есть следующий HTMLПолучение всех элементов определенного класса плюс навигацию назад и вперед с CodedUI

`<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"), а затем перейти к родительской строке, чтобы я можете получить доступ к кнопке переключателя «Согласен/Не согласен» и сделать выбор, основанный на переданном параметре.

Я попытался вариации

 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.

И последний элемент для адреса будет состоять в том, как перемещаться вперед и назад, сохраняя ссылку на эту конкретную строку?

+0

Решил проблему с текстом, выполнив следующие ответы «HtmlSpan theAnswer = (HtmlSpan); Debug.WriteLine (theAnswer.InnerText); 'Но я все еще немного теряюсь в том, как перемещаться внутри элемента и из него, сохраняя его ссылку. –

ответ

1

Это на самом деле довольно крутой вопрос. Помните, что все элементы в DOM в кодированном пользовательском интерфейсе имеют один родительский элемент и набор дочерних элементов.

Короче говоря, что вы хотите сделать, это:

  • Создание таблицы управления
  • Итерация по каждой строке
  • В каждой строке, найти первый HtmlSpan с классом = «Ответ» , Добавьте это в коллекцию HtmlSpans.
  • После того, как вы создали эту коллекцию Spans, вы можете снова повторить эту коллекцию. Оттуда я предлагаю создать вспомогательный метод, который получает «Сиблинг-контроль» на основе атрибута. Метод будет рассматривать дочернюю коллекцию родительского элемента управления, а затем получить оттуда элемент.

Последний шаг только необходимо, если вы не можете просто выбрать правильный ответ во время прохода через каждую строку в таблице. В моей книге, я предпочел бы:

  • Итерация по каждой строке
  • Найти элемент ответа и его внутренний текст
  • Используйте внутренний текст, чтобы выбрать правильный ответ, проверив правильность кнопку радио в этом (я предполагаю, что это данные).

Имеет ли это смысл? Дайте мне знать, если это вообще поможет или вам нужно больше деталей. У меня нет моего кода метода помощника, но это очень просто. Что-то вроде:

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; 
} 
+0

Благодарим за отзыв. Я дам вам попытку и дам вам знать, что я придумал. –