Atata - медленная обработка строк таблицы

Еще один вопрос, касающийся структуры Atata. Я обнаружил, что загрузка из таблиц идет медленно. Там есть стол с ок. 1000 строк, и всякий раз, когда я выполняю какую-либо операцию с найденной строкой, кажется, что движок загружает таблицу еще раз.

Пример кода, который работает медленно:

var row = _page.Inventory.Rows[x => x.Text == "some inventory"];
row.Should.Exist(); // that statement takes the same time as the above one and is slow...

Код, который я использую для таблицы:

[FindByCss(".invGrid")]
public Table<GroupsRow, Page> Inventory { get; set; }

Я пытался найти любой удобный способ загрузить данные с нетерпением, но не нашел ни одного.

Мои вопросы:

  1. Есть ли способ загрузить строку с нетерпением?
  2. Есть ли способ заставить таблицу загружаться быстрее?

1 ответ

Решение

В настоящее время Table.Rows[predicate] работает медленно для больших таблиц, так как проверяет каждую строку. Это хорошо работает для небольших столов. Возможно, я обновлю его, чтобы он работал быстрее в будущем, но это не так просто, поэтому он отложен на время. Есть еще один быстрый подход, который выполняет одну команду XPath, которую вы можете использовать:

  1. Используйте индексатор: public TItem this[params string[] cellValues]

    _page.Inventory.Rows["some inventory"]
    

    Он найдет первую строку с ячейкой, содержащей переданное значение. Но это может быть неточно, так как он использует предикат "содержит" и если у вас есть подобные строковые значения в таблице.

  2. Используйте метод: public TItem GetByXPathCondition(string itemName, string xPathCondition)

    string itemName = "some inventory";
    
    _page.Inventory.Rows.GetByXPathCondition(
        itemName,
        $".//span[contains(concat(' ', normalize-space(@class), ' '), ' item-name ')][normalize-space(.) = '{itemName}']")
    

    Пример выглядит для <tr> который содержит <span class="item-name"> с обязательным текстом.

    Этот подход точен, но синтаксис более сложный.

  3. Вы можете сделать приведенный выше пример более простым в использовании, распаковав метод extension:

    public static class TableRowListExtensions
    {
        public static SomePage.GroupsRow GetByName(this TableRowList<SomePage.GroupsRow, SomePage> rowList, string name)
        {
            return rowList.GetByXPathCondition(name, $".//span[contains(concat(' ', normalize-space(@class), ' '), ' item-name ')][normalize-space(.) = '{name}']");
        }
    }
    

    А затем используйте его в тесте:

    _page.Inventory.Rows.GetByName("some inventory")
    

    Это должно быть быстро и точно.

Я также рекомендую вам использовать [FindByClass("invGrid")] атрибут вместо [FindByCss(".invGrid")] когда у вас есть селектор CSS по одному классу. FindByCssAttribute работает немного медленнее в Atata, так как выполняет 1 дополнительную команду WebDriver по сравнению с большинством других атрибутов поиска.

Другие вопросы по тегам