C # / ATATA / Selenium: использование ControlList для хранения нескольких таблиц - PullRequest
0 голосов
/ 09 июня 2018

Я создаю объект Page для своей компании, который представляет HTML-страницу, которая содержит много таблиц (и плохо структурирована).Меня интересуют только некоторые таблицы на этой странице, и я хотел бы иметь одну таблицу для ссылки на мой объект страницы для простоты.

Проблемы

  1. Эта страница является динамической и загружает различное количество таблиц.
  2. «Отображаемая таблица» одного рабочего процесса разделенана 3 таблицы в HTML.
    1. Таблица 1 содержит уникальный идентификатор.
    2. Таблица 2 содержит кнопки, которые меня не интересуют.
    3. Таблица 3 (обернутая в div) содержит фактические данные таблицы, которые мне нужныдля извлечения.
  3. Таблицы не организованы, сгруппированы или вложены каким-либо образом.
    1. Единственная организация - повторяющаяся плоская структура «отображаемой таблицы».Структура не изменяется (генерируется из ASP.Net)

Цели

  1. Имеет ControlList, который представляет каждый из«отображаемые таблицы».
  2. Придерживайтесь ATATA (для этого у меня есть решение Selenium, но большинство наших объектов Page используют ATATA и не хотят отклоняться)
  3. Сохраните имяРабочий процесс как переменная для каждого из объектов таблицы (переменная WorkflowName)

Вот абстракция HTML-кода, с которым я работаю.

<div>
  <table> <!-- Start of Displayed Table. Shows as a single row header -->
    <tbody>
      <tr>
        <td>
          <h2 id='WorkflowHeader'> Workflow Identifier </h2>
        </td>
      </tr>
    </tbody>
  </table>
  <table> 
    <!-- This table contains buttons that I am not concerned with -->
  </table>
  <div>
    <table> <!-- Start of multi row table that contains data to be retrieved -->
      <tr>
        <td>Value I want in a table</td>
        <td>Value I want in a table</td>
      </tr>
    </table>
  <br /> <!-- End of "Displayed Table" -->
  <!-- The above structure repeats for every Workflow type. basic structure below -->
  <table></table>
  <table></table>
  <div>
    <table></table>
  </div>
  <br />
  <!-- Basic repeating table structure above -->
</div>

В моем объекте страницы ATATA, У меня есть следующее:

using Atata;
using _ = ProjectNameSpace.WorkflowPageObject;

namespace ProjectNameSpace
{
    public class WorkflowPageObject : Page<_>
    {    
        public ControlList<WorkflowTable, _> WorkflowTables { get; private set; }

        [ControlDefinition("h2[contains(@id, 'WorkflowHeader')]/../../../../following-sibling::div/table", ComponentTypeName = "table")]
        public class WorkflowTable: Table<WorkflowRow, _>
        {
          [FindByXPath("h2[contains(@id, 'WorkflowHeader')]")]
          public H2<_> WorkflowName { get; private set; }
        }

        [ControlDefinition("h2[contains(@id, 'WorkflowHeader')]/../../../../following-sibling::div/table/tbody/tr"), ComponentTypeName = "row")]
        public class WorkflowRow: TableRow<_>
        {
            [FindByColumnHeader(HeaderName1)]
            public Content<string, _> TableData1 { get; private set; }

            [FindByColumnHeader(HeaderName2)]
            public Content<string, _> TableData2 { get; private set; }

            [FindByColumnHeader(HeaderName3)]
            public Content<string, _> TableData3 { get; private set; }

            [FindByColumnHeader(HeaderName4)]
            public Content<string, _> TableData4 { get; private set; }

            [FindByColumnHeader(HeaderName5)]
            public Content<string, _> TableData5 { get; private set; }

            [FindByColumnHeader(HeaderName6)]
            public Content<string, _> TableData { get; private set; }
        }
    }
}

Когда я попадаю на эту страницу и пытаюсь получить доступ к любому из TableData, я получаю следующую ошибку:

{"Unable to locate element: By.XPath: (.//h2[contains(@id, 
'WorkflowHeader')]/../../../../following-sibling::div/table/tbody/tr) 
[1]\r\nContext element:\r\nTag: table\r\nLocation: {X=X,Y=Y}\r\nSize: 
{Width=Width, Height=Height}\r\nText: HeaderName1 HeaderName2 HeaderName3 
HeaderName4 HeaderName5 HeaderName6\r\nTableData1 TableData2 TableData3 
TableData4 TableData5 TableData6"}

Я чувствую, что янеправильно использует ControlDefinitions.Мой XPath - это звук и возвращает несколько элементов.Если я извлекаю XPath, который используется для поиска элемента, и использую AtataContext.Current.Driver.FindElementsByXPath(".//h2[contains(@id, 'WorkflowHeader')]/../../../../following-sibling::div/table/tbody/tr")[1], возвращаются правильные строки.

Примечание. Этот код был запутан, и любые ошибки в написании переменных или опечаток наиболее вероятны из-за ручного вводачасти кода в этом посте.Код строится и запускается.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 09 июня 2018

Я предполагаю, что вам не нужно ControlDefinition в WorkflowRow классе.Просто удалите его и попробуйте.Когда вы находите строки таблицы, она уже ограничена соответствующим элементом <table> и ищет дочерние элементы (строки) внутри этого элемента, а не всю страницу.

Я также могу порекомендовать вам обновить ControlDefinitionот WorkflowTable до следующего:

[ControlDefinition("table[.//h2[contains(@id, 'WorkflowHeader')]]", ComponentTypeName = "table")]
...