Во множестве современных Web приложений используются таблицы в разном виде для отображения и работы с данными.
Хочу показать практический пример покрытия простой таблицы на сайте Wikipedia:

Автоматизируем следующий сценарий:
- Открываем браузер Google Chrome
- Переходим на главную страницу Wikipedia
- Выполняем поиск по слову Microsoft
- Получаем в результатах поиска (в нашем случае русскоязычную версию) описание компании Microsoft и находим в таблице Акционеров компанию “BlackRock Fund Advisors” и проверяем, что ее процент = 1.46
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Collections.Generic;
namespace Wiki
{
[TestFixture]
public class Tests
{
[Test]
public void WikiMicrosoftTableTest()
{
// Открываем браузер Google Chrome
IWebDriver driver = new ChromeDriver();
// Устанавливаем неявное ожидание
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
// Переходим на главную страницу Wikipedia
driver.Navigate().GoToUrl("https://www.wikipedia.org/");
// Выполняем поиск по запросу Microsoft
IWebElement searchField = driver.FindElement(By.Id("searchInput"));
searchField.SendKeys("Microsoft");
IWebElement searchButton = driver.FindElement(By.XPath("//i[text()='Search']"));
searchButton.Click();
// Находим все строки в таблице
var rows = driver.FindElements(By.XPath("//table[@class='wikitable']/tbody/tr"));
// Создаем пустой список с обьектом, где описаны наши колонки
List MicrosoftShareholdersTable = new List();
// Проходим по всем строкам с таблицы начиная со второй (поскольку первая это шапка)
for (int i = 1; i < rows.Count; i++)
{
// Создаем обьект одной строки и наполняем ее данными
MicrosoftShareholdersTableRow add = new MicrosoftShareholdersTableRow();
add.Name = rows[i].FindElement(By.XPath(".//td[1]/a"));
add.Count = rows[i].FindElement(By.XPath(".//td[2]"));
add.Percentage = rows[i].FindElement(By.XPath(".//td[3]"));
MicrosoftShareholdersTable.Add(add);
}
// Выполняем поиск компании в таблице Акционеров
var companyName = "BlackRock Fund Advisors";
var company = MicrosoftShareholdersTable.Find(c => c.Name.Text == companyName);
// Проверка на то, что компания существует в таблице
if (company == null)
{
throw new NotFoundException($"Can't find '{companyName}' company in the Microsoft shareholders table!");
}
//Проверяем процент для нашей компании
Assert.That(company.Percentage.Text, Is.EqualTo("1.46"), $"Unexpected '{companyName}' company percentage");
// Закрываем наш браузер
driver.Quit();
}
// Создаем класс с описанием колонок таблицы Акционеров
public class MicrosoftShareholdersTableRow
{
public IWebElement Name { get; set; }
public IWebElement Count { get; set; }
public IWebElement Percentage { get; set; }
}
}
}
Возможно для кого-то легче работать не с помощью объекта таблицы, а просто со списком ячеек по названию колонки (но в таком случае нету возможности построить запрос связанный с несколькими колонками). Для этого можно использовать универсальный XPath:
//table/tbody/tr/td[count(//table/thead/tr/th[.='Column name']/preceding-sibling::th)+1]
