Skip to content

Работа со списками / таблицами

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

Хочу показать практический пример покрытия простой таблицы на сайте Wikipedia:

Автоматизируем следующий сценарий:

  1. Открываем браузер Google Chrome
  2. Переходим на главную страницу Wikipedia
  3. Выполняем поиск по слову Microsoft
  4. Получаем в результатах поиска (в нашем случае русскоязычную версию) описание компании 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]

Leave a Reply

Your email address will not be published. Required fields are marked *