Получение всех строк таблицы

Работа с таблицами — одна из наиболее частых задач при автоматизированном тестировании веб-приложений. В Protractor для взаимодействия с таблицами используются элементы и коллекции элементов, что позволяет гибко получать данные и проводить проверки.

Поиск таблицы и её строк

Для начала необходимо определить саму таблицу. Обычно таблицы на веб-страницах представлены тегом <table> с вложенными <tr> для строк и <td> для ячеек.

Простейший способ получить все строки таблицы в Protractor:

const table = element(by.css('table#myTable'));
const rows = table.all(by.css('tr'));
  • element(by.css(...)) — находит конкретный элемент.
  • all(by.css(...)) — возвращает коллекцию элементов, соответствующих селектору.
  • В данном случае rows — это объект типа ElementArrayFinder, содержащий все строки таблицы.

Доступ к данным строк

Каждая строка может содержать несколько ячеек (<td>). Для получения текста всех ячеек строки используется метод all и getText():

rows.each(async (row) => {
    const cells = row.all(by.css('td'));
    const cellTexts = await cells.getText();
    console.log(cellTexts);
});

Ключевые моменты:

  • row.all(by.css('td')) создаёт коллекцию ячеек для конкретной строки.
  • getText() асинхронно возвращает массив текста всех ячеек.
  • each перебирает все строки таблицы.

Получение всех данных таблицы в массив

Для более структурированной работы полезно получить двумерный массив, где каждая внутренняя строка соответствует строке таблицы:

const tableData = [];

const rows = element.all(by.css('table#myTable tr'));

for (let i = 0; i < await rows.count(); i++) {
    const row = rows.get(i);
    const cells = row.all(by.css('td'));
    const cellTexts = await cells.getText();
    tableData.push(cellTexts);
}

console.log(tableData);
  • rows.count() возвращает количество строк таблицы.
  • rows.get(i) получает конкретный элемент строки.
  • В итоге tableData содержит все данные таблицы в удобной для анализа форме.

Фильтрация и работа с определёнными строками

Часто необходимо получить не все строки, а только те, которые соответствуют определённым условиям:

const filteredRows = rows.filter(async (row) => {
    const firstCellText = await row.element(by.css('td:first-child')).getText();
    return firstCellText.includes('Active');
});

const filteredData = [];
for (let i = 0; i < await filteredRows.count(); i++) {
    const cells = filteredRows.get(i).all(by.css('td'));
    const cellTexts = await cells.getText();
    filteredData.push(cellTexts);
}

console.log(filteredData);
  • filter позволяет оставить только строки, удовлетворяющие условию.
  • В примере фильтруются строки, у которых первый столбец содержит слово "Active".

Работа с динамическими таблицами

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

const EC = protractor.ExpectedConditions;
const table = element(by.css('table#myTable'));
browser.wait(EC.presenceOf(table), 5000);

const rows = table.all(by.css('tr'));
browser.wait(async () => (await rows.count()) > 0, 5000);
  • ExpectedConditions позволяет синхронизироваться с динамическим контентом.
  • browser.wait ждёт, пока таблица и её строки станут доступными.

Советы по оптимизации

  • Использовать all(by.css('tr')) вместо all(by.tagName('tr')) для конкретизации поиска.
  • Для больших таблиц применять ленивую обработку с each или map, чтобы избежать излишнего потребления памяти.
  • Всегда учитывать асинхронность методов Protractor (getText(), count(), filter) и использовать await.

Пример полного кода получения всех строк и ячеек

const table = element(by.css('table#myTable'));
await browser.wait(protractor.ExpectedConditions.presenceOf(table), 5000);

const rows = table.all(by.css('tr'));
const tableData = await rows.map(async (row) => {
    const cells = row.all(by.css('td'));
    return await cells.getText();
});

console.log(tableData);
  • map возвращает массив значений, соответствующих каждой строке.
  • Код полностью асинхронный и подходит для таблиц любого размера.

Получение всех строк таблицы в Protractor требует сочетания корректного выбора элементов, асинхронной обработки данных и учёта динамики веб-страницы. Такой подход обеспечивает надёжный сбор информации и позволяет строить сложные проверки содержимого таблиц.