Работа с таблицами — одна из наиболее частых задач при автоматизированном тестировании веб-приложений. В 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, чтобы избежать излишнего потребления памяти.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 требует сочетания корректного выбора элементов, асинхронной обработки данных и учёта динамики веб-страницы. Такой подход обеспечивает надёжный сбор информации и позволяет строить сложные проверки содержимого таблиц.