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 ответ
В настоящее время Table.Rows[predicate]
работает медленно для больших таблиц, так как проверяет каждую строку. Это хорошо работает для небольших столов. Возможно, я обновлю его, чтобы он работал быстрее в будущем, но это не так просто, поэтому он отложен на время. Есть еще один быстрый подход, который выполняет одну команду XPath, которую вы можете использовать:
Используйте индексатор:
public TItem this[params string[] cellValues]
_page.Inventory.Rows["some inventory"]
Он найдет первую строку с ячейкой, содержащей переданное значение. Но это может быть неточно, так как он использует предикат "содержит" и если у вас есть подобные строковые значения в таблице.
Используйте метод:
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">
с обязательным текстом.Этот подход точен, но синтаксис более сложный.
Вы можете сделать приведенный выше пример более простым в использовании, распаковав метод 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 по сравнению с большинством других атрибутов поиска.