Рубрики
Uncategorized

Как Работать С Таблицами В Selenium PHP?

Веб-таблицы или таблицы данных являются обычным явлением во многих веб-приложениях. И эти таблицы являются предварительными… Помечено как php, селен, тестирование.

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

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

В этом руководстве по Selenium WebDriver PHP мы подробно рассмотрим использование веб-таблиц в Selenium PHP и то, как Selenium web automation можно использовать для автоматизации различных операций с веб-таблицами.

Что Такое Веб-Таблицы В Selenium?

Веб-таблица – это тип веб-элемента, который в основном используется для отображения информации в табличном формате. Популярные веб-элементы, такие как переключатели, выпадающие меню, флажки и т.д., Содержат данные, доступные в каждой ячейке веб-таблицы, доступ к которым можно получить с помощью функций WebElement.

Поскольку веб-таблицы в Selenium PHP состоят из строк и столбцов, функции WebElement используются вместе с локаторами, которые идентифицируют соответствующую строку (и/или столбец), для которой должна выполняться операция автоматизации тестирования Selenium.

Ниже показана веб-таблица с конфигурацией (8*3), т.е. количество и количество.

Вот некоторые из важных HTML-тегов, которые используются при создании таблиц в Selenium PHP:

Стол Определяет таблицу в HTML
th Содержит информацию, относящуюся к заголовку в таблице
tr Определяет строку в таблице
тд Определяет столбец в таблице

Как видно ниже, содержимое внутри th тег определяет заголовок. Следовательно, заголовками в таблице являются FEATURE, ДЖЕНКИНС и GITLAB CI/CD.

Вот пример использования, в котором мы выделили содержимое:

Первый ряд ? R1, C-0: С открытым исходным кодом или коммерческим, R1, C1: С открытым исходным кодом и R1, C2: С открытым исходным кодом.

Второй ряд ?R2, C-0: Тип продукта, R2, C1: Автономный/Локальный, и R2, C2: Автономный/Локальный.

Вот пример использования td , где мы выделили содержимое строки 1 и столбца 1, т.е. R – 1, C – 1? С открытым исходным кодом или коммерческим

Содержание строки 2 и столбца 1, т.е. R – 2, C – 0? Тип продукта.

Обработка Веб-Таблиц В Selenium PHP

В Selenium есть две широкие категории веб–таблиц – Статическая таблица и Динамическая таблица. Статическая Веб-таблица – это когда данные (или информация) в таблице являются статическими (т.е. Они не извлекаются динамически с помощью запросов или других механизмов). В предыдущем разделе мы продемонстрировали пример статической веб-таблицы.

С другой стороны, содержимое в Динамической веб-таблице не является фиксированным. Например, при покупке ноутбука на веб-сайте электронной коммерции содержимое таблицы (которая показывает конфигурацию) будет меняться в зависимости от конфигурации пользователя “настроено”.

Для демонстрации обработки веб-таблиц в Selenium PHP мы будем использовать эти веб-таблицы . При работе с веб-таблицами вы можете столкнуться с кроссбраузерными проблемами, особенно с версиями браузеров, в которых отсутствует поддержка API-интерфейсов HTML-таблиц.

В следующих разделах этого руководства по Selenium WebDriver PHP мы рассмотрим некоторые широко используемые операции с веб-таблицами в Selenium PHP. HTML-код веб-таблицы, используемой для демонстрации, доступен здесь .

Мы будем использовать фреймворк PHPUnit для выполнения тестов. Необходимые пакеты (или зависимости) должны быть загружены, прежде чем мы приступим к реализации. Для загрузки зависимостей мы создаем composer.json в корневой папке проекта.

{
   "require":{
      "php":">=7.1",
      "phpunit/phpunit":"^9",
      "phpunit/phpunit-selenium": "*",
      "php-webdriver/webdriver":"1.8.0",
      "symfony/symfony":"4.4",
      "brianium/paratest": "dev-master"
   }
}

Выполните следующую команду на терминале, чтобы загрузить зависимости.

composer require

Дважды нажмите кнопку “Ввод”, чтобы продолжить установку загруженных пакетов.

После процесса загрузки и установки платформа PHPUnit будет присутствовать в папке vendor\bin. После завершения базовой настройки мы приступаем к демонстрации работы с веб-таблицами в Selenium PHP.

Тесты выполняются на облачной сетке Selenium от Lambda Test. Эти веб-таблицы будут использоваться для всех демонстраций.

Как Вычислить Количество Строк и Столбцов В Веб-Таблице?

Тег tr в HTML указывает строки, а тег td указывает столбцы в веб-таблице. Тег строки, т.е. tr , используется для получения информации о количестве строк в таблице.

Мы использовали расширение POM Builder в Chrome вместо инструмента проверки для получения информации о требуемом веб-элементе (т.е. R-1, C- 1). Следовательно, XPath [//* [ @id ]/tbody/tr[2]/td] используется для вычисления количества столбцов в таблице.

Тег th можно использовать для вычисления количества столбцов в таблице. Путь к XPath//* [ @id ]/tbody/tr/th используется для вычисления количества столбцов в таблице.

В качестве альтернативы, XPath//таблица//th также может использоваться для вычисления столбцов, поскольку все заголовки столбцов помечены тегом th .

Реализация

 "[PHP-1] Counting number of rows and columns in WebTable",
      "name" => "[PHP-1] Counting number of rows and columns in WebTable",
      "platform" => "Windows 10",
      "browserName" => "Chrome",
      "version" => "85.0"
    );
    return $capabilities;
  }

  public function setUp(): void
  {
    $url = "https://". $GLOBALS['LT_USERNAME'] .":" . $GLOBALS['LT_APPKEY'] ."@hub.lambdatest.com/wd/hub";
    $capabilities = $this->build_browser_capabilities();
    /* $this->webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities); */
    $this->webDriver = RemoteWebDriver::create($url, $capabilities);
  }

  public function tearDown(): void
  {
    $this->webDriver->quit();
  }
  /*
  * @test
  */ 
  public function test_SwitchToNewWindow()
  {
    $test_url = "https://www.w3schools.com/html/html_tables.asp";
    $title = "HTML Tables";

    $this->webDriver->get($test_url);
    $this->webDriver->manage()->window()->maximize();
    sleep(5);

    $driver = $this->webDriver;
    $this->webDriver->wait()->until(
      function () use ($driver) {
      $elements = $this->webDriver->findElements(WebDriverBy::className('w3-example'));
          return count($elements) > 0;
      },
      'Error locating W3 example element'
    );

    $num_rows = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr")));
    echo ("\nRows in table are " . $num_rows);

    $num_cols = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr[2]/td")));
    print("\nColumns in table are " . $num_cols);

    $this->assertEquals($title, $this->webDriver->getTitle());
  }
}
?>

Пошаговое руководство по коду

Строки (4-7) : Импортируйте (или используйте) все необходимые классы (или пакеты), методы которых будут использоваться в коде.

use PHPUnit\Framework\TestCase;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;

Строки (9-11) : Для хранения имени пользователя и ключа доступа используются две глобальные переменные. Имя пользователя и ключ доступа доступны в разделе вашего профиля на Лямбда-тесте.

$GLOBALS['LT_USERNAME'] = "user-name";
# accessKey:  AccessKey can be generated from automation dashboard or profile section
$GLOBALS['LT_APPKEY'] = "access-key";

Строки (17-27) : Для тестирования используется массив возможностей браузера, созданный с помощью генератора возможностей лямбда-теста.

public function build_browser_capabilities(){
    /* $capabilities = DesiredCapabilities::chrome(); */
    $capabilities = array(
      "build" => "[PHP-1] Counting number of rows and columns in WebTable",
      "name" => "[PHP-1] Counting number of rows and columns in WebTable",
      "platform" => "Windows 10",
      "browserName" => "Chrome",
      "version" => "85.0"
    );
    return $capabilities;
  }

Строка (34) : Метод create класса RemoteWebDriver принимает два параметра – URL-адрес сетки LambdaTest, т.е. [@hub.lambdatest.com/wd/hub ] и возможности браузера.

$this->webDriver = RemoteWebDriver::create($url, $capabilities);

Строки (53-60) : Запускается явное ожидание для обеспечения загрузки веб-таблицы с-примером. Продолжительность ожидания по умолчанию составляет 30 секунд, после чего Selenium framework вызывает исключение ElementNotVisibleException.

Если элемент загружен в течение указанного периода времени, операция подсчета вернет ненулевое значение.

$driver = $this->webDriver;
$this->webDriver->wait()->until(
function () use ($driver) {
      $elements = $this->webDriver->findElements(WebDriverBy::className('w3-example'));
          return count($elements) > 0;
},
'Error locating W3 example element'
);

Строки (62-63) : Путь XPath [//* [ @id ]/tbody/tr] используется для получения подробной информации о количестве строк в таблице. Вместо XPath, используемого в коде, XPath [//таблица//tr] также можно использовать для получения всех элементов tr в таблице.

$num_rows = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr")));
echo ("\nRows in table are " . $num_rows);

Строки (65 – 66) : Путь к XPath [//* [ @id ]/tbody/tr[2]/td] используется для получения подробной информации о количестве столбцов в таблице. В качестве альтернативы,//таблица//th XPATH также может быть использована для получения количества столбцов.

$num_cols = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr[2]/td")));
echo("\nColumns in table are " . $num_cols);

Исполнение

Для подсчета количества строк и столбцов в Selenium PHP выполните следующую команду в терминале:

vendor\bin\phpunit WebTable_Get_Rows_ColsTest.php

Вот снимок выполнения, который выводит количество строк (т.е. 7) и столбцов (т.е. 3), присутствующих в таблице :

Как Распечатать Содержимое Веб-Таблиц В Selenium PHP?

Мы перебираем строки (т.е. tr ) в таблице для доступа к содержимому в каждой строке и столбце веб-таблицы. После этого теги под соответствующей строкой ( tr ) также повторяются.

Поскольку количество строк и столбцов является динамическим, они вычисляются динамически. Следующие пути XPath используются для доступа к данным, доступным в определенной комбинации (строка + столбец):

  • XPath для доступа к R:2, C:1 –//* [ @id ]/tbody/tr[2]/td[1]
  • XPath для доступа к R:3, C:2 –//* [ @id ]/tbody/tr[3]/td[1]

Реализация

 "[PHP-2] Print the data available in rows and columns",
      "name" => "[PHP-2] Print the data available in rows and columns",
      "platform" => "Windows 10",
      "browserName" => "Chrome",
      "version" => "85.0"
    );
    return $capabilities;
  }

  public function setUp(): void
  {
    $url = "https://". $GLOBALS['LT_USERNAME'] .":" . $GLOBALS['LT_APPKEY'] ."@hub.lambdatest.com/wd/hub";
    $capabilities = $this->build_browser_capabilities();
    $this->webDriver = RemoteWebDriver::create($url, $capabilities);
  }

  public function tearDown(): void
  {
    $this->webDriver->quit();
  }
  /*
  * @test
  */ 
  public function test_SwitchToNewWindow()
  {
    $test_url = "https://www.w3schools.com/html/html_tables.asp";
    $title = "HTML Tables";
    $before_XPath = "//*[@id='customers']/tbody/tr[";
    $aftertd_XPath = "]/td[";
    $aftertr_XPath = "]";

    $this->webDriver->get($test_url);
    $this->webDriver->manage()->window()->maximize();
    sleep(5);

    $driver = $this->webDriver;
    $this->webDriver->wait()->until(
    function () use ($driver) {
        $elements = $this->webDriver->findElements(WebDriverBy::className('w3-example'));
        return count($elements) > 0;
    },
    'Error locating W3 example element'
    );

    $rows = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr")));
    echo ("\nRows in table are " . $rows);

    $columns = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr[2]/td")));
    echo("\nColumns in table are " . $columns);
    echo("\n");
    echo("\n");

    for($t_row = 2; $t_row <= $rows; $t_row++)
    {
        for($t_column = 1; $t_column <= $columns; $t_column++)
        {
            $FinalXPath = $before_XPath .$t_row. $aftertd_XPath .$t_column. $aftertr_XPath;
            $cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath));
            $cell_text = $cell->getText();
            echo($cell_text);
            echo("\n");
        }
        echo("\n");
    }
    $this->assertEquals($title, $this->webDriver->getTitle());
  }
}
?>

Пошаговое руководство по коду

Большая часть реализации такая же, как и в предыдущем примере.

Метод тестирования test_Switch В новое окно содержит реализацию для печати данных, доступных в каждой ячейке таблицы.

Строки (46-48) : Путь XPath для доступа к определенной строке и столбцу содержит две переменные (т.е. номер строки и номер столбца).

Путь к XPath (//* [ @id ]/tbody/tr[номер строки]/td[номер столбца]) подразделяется на несколько строк для размещения статических (т.е. неизменных) и динамических (т.е. комбинации строк и столбцов) свойств в XPath.

$before_XPath = "//*[@id='customers']/tbody/tr[";
$aftertd_XPath = "]/td[";
$aftertr_XPath = "]";

Строки (71 – 83) : Пример таблицы состоит из 7 строк и 3 столбцов. Следовательно, вложенный цикл for выполняется со строками в диапазоне от 2..7 и столбцами в диапазоне от 1..3

Окончательный XPath, используемый для извлечения данных, доступных в определенной ячейке (т.Е. Комбинации строки и столбца), создается с использованием комбинации фиксированного пути и переменных факторов, таких как строка и столбец, данные которых должны быть прочитаны.

for($t_row = 2; $t_row <= $rows; $t_row++)
{
  for($t_column = 1; $t_column <= $columns; $t_column++) { $FinalXPath = $before_XPath .$t_row. $aftertd_XPath .$t_column. $aftertr_XPath; $cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath));
    $cell_text = $cell->getText();
    echo($cell_text);
    echo(" ");
  }
  echo("\n");
}

Путь XPath для считывания данных в любой ячейке формируется с использованием следующей комбинации:

"//*[@id='customers']/tbody/tr[" .$t_row. "]/td[" .$t_column. "]"

Вот как генерируются пути для разных ячеек:

  • XPath для (2 , 1) ?//*[ @id ]/tbody/tr[2]/td[1]
  • XPath для (2, 3) ?//*[ @id ]/tbody/tr[2]/td[3]
  • XPath для (7 , 2) ?//*[ @id ]/tbody/tr[7]/td[2] и так далее…

Мы начинаем чтение со 2-й строки, так как первая строка содержит заголовок и пропускается при операции чтения.

Исполнение

Как видно на моментальном снимке выполнения, данные в каждой ячейке считываются и печатаются на терминале:

Как Считывать Данные Из Строк Веб-Таблиц В Selenium PHP?

В этом разделе учебника Selenium WebDriver по PHP мы демонстрируем, как считывать данные по строкам из веб-таблиц. Поскольку мы читаем по строкам, строки () будут переменными, тогда как столбцы () останутся постоянными.

Вот пример Xpath для доступа к информации, доступной в (R2, C1), (R2, C2) и (R2, C3).

  • XPath для доступа к R:2, C:1 –//* [ @id ]/tbody/tr[2]/td[1]
  • XPath для доступа к R:2, C:2 –//* [ @id ]/tbody/tr[2]/td[2]
  • XPath для доступа к R:3, C:2 –//* [ @id ]/tbody/tr[3]/td[2]

Поскольку первая строка – это заголовок, мы начинаем чтение со строки – 2. Цикл for выполняется со значениями в диапазоне от 2..7, где 7 означает количество строк в таблице. Соответствующие номера столбцов добавляются к номерам строк, образуя комбинацию строка-столбец (RC).

Вот путь XPath, который используется для чтения данных из определенной строки:

"//*[@id='customers']/tbody/tr[" .$t_row. "]/td[column_number]"

Для чтения полных данных из строки-2 значение $t_row будет равно 2, а номер столбца будет варьироваться от 1..3. Вот XPath для чтения данных из строки-2:

//*[@id]/tbody/tr[2]/td[1] R – 2, C – 1
//*[@идентификатор]/tbody/tr[2]/td[2] R – 2, C – 2
//*[@id]/tbody/tr[2]/td[3] R – 2, C – 3

Реализация

 "[PHP-3] Read data in the rows of a web table",
      "name" => "[PHP-3] Read data in the rows of a web table",
      "platform" => "Windows 10",
      "browserName" => "Chrome",
      "version" => "85.0"
    );
    return $capabilities;
  }

  public function setUp(): void
  {
    $url = "https://". $GLOBALS['LT_USERNAME'] .":" . $GLOBALS['LT_APPKEY'] ."@hub.lambdatest.com/wd/hub";
    $capabilities = $this->build_browser_capabilities();
    $this->webDriver = RemoteWebDriver::create($url, $capabilities);
  }

  public function tearDown(): void
  {
    $this->webDriver->quit();
  }
  /*
  * @test
  */ 
  public function test_SwitchToNewWindow()
  {
    $test_url = "https://www.w3schools.com/html/html_tables.asp";
    $title = "HTML Tables";
    $before_XPath = "//*[@id='customers']/tbody/tr[";
    $aftertd_XPath_1 = "]/td[1]";
    $aftertd_XPath_2 = "]/td[2]";
    $aftertd_XPath_3 = "]/td[3]";

    $this->webDriver->get($test_url);
    $this->webDriver->manage()->window()->maximize();
    sleep(5);

    $driver = $this->webDriver;
    $this->webDriver->wait()->until(
    function () use ($driver) {
        $elements = $this->webDriver->findElements(WebDriverBy::className('w3-example'));
        return count($elements) > 0;
    },
    'Error locating W3 example element'
    );

    $rows = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr")));
    echo ("\nRows in table are " . $rows);
    echo("\n");

    $cols = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr[2]/td")));
    print("\nColumns in table are " . $cols);
    echo("\n\n");

    $this->assertEquals($title, $this->webDriver->getTitle());

    echo("Data present in Rows, Col - 1\n");
    echo("-----------------------------\n");
    echo("\n");

    for($t_row = 2; $t_row <= ($rows); $t_row++)
    {
        $FinalXPath = $before_XPath .$t_row. $aftertd_XPath_1;
        $cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath));
        $cell_text = $cell->getText();
        echo($cell_text);
        echo("\n");
    }
    echo("\n\n");
    echo("Data present in Rows, Col - 2\n");
    echo("-----------------------------\n");
    echo("\n");

    for($t_row = 2; $t_row <= ($rows); $t_row++)
    {
       $FinalXPath = $before_XPath .$t_row. $aftertd_XPath_2;
        $cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath));
        $cell_text = $cell->getText();
        echo($cell_text);
        echo("\n");
    }

    echo("\n\n");
    echo("Data present in Rows, Col - 3\n");
    echo("-----------------------------\n");
    echo("\n");

    for($t_row = 2; $t_row <= ($rows); $t_row++)
    {
        $FinalXPath = $before_XPath .$t_row. $aftertd_XPath_3;
        $cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath));
        $cell_text = $cell->getText();
        echo($cell_text);
        echo("\n");
    }
    echo("\n\n");
    echo("Fetched all the records from the table\n");   
  }
}
?>

Пошаговое руководство по коду

Строки (47-50) : $before_XPath содержит статическую часть пути XPath. Как упоминалось ранее, к $before_XPath будет добавлен номер строки (который в нашем случае колеблется от 2..7).

Вновь сформированная строка будет добавлена к XPath соответствующего номера столбца (т.е. “]/td[1]” для столбца-1, “]/td[2]” для столбца-2 и так далее).

$before_XPath = "//*[@id='customers']/tbody/tr[";
$aftertd_XPath_1 = "]/td[1]";
$aftertd_XPath_2 = "]/td[2]";
$aftertd_XPath_3 = "]/td[3]";

Линии (79 – 86) : Вот реализация для печати значений, доступных в строках (2..7) и столбце (1), т.е. (R2, C1), (R3, C1), (R3, C1) и так далее.…

В коде, показанном ниже, XPath для столбца – 1 (т.е. td[1]) добавляется к вычисленному XPath.

for($t_row = 2; $t_row <= ($rows); $t_row++) { $FinalXPath = $before_XPath .$t_row. $aftertd_XPath_1; $cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath));
    $cell_text = $cell->getText();
    echo($cell_text);
    echo("\n");
}

Цикл for будет выполняться со строками в диапазоне от 2..7. Соответствующие значения столбцов (td[1]/td[2]/td[3]) добавляются в зависимости от столбца, к которому необходимо получить доступ.

Исполнение

Как видно из моментального снимка выполнения, чтение “по строкам” выполняется для каждой ячейки таблицы.

Как считывать данные из столбцов веб-таблиц в Selenium PHP?

В предыдущем разделе мы выполнили чтение веб-таблицы “по строкам”. В этом разделе учебника Selenium WebDriver по PHP мы будем выполнять операцию чтения по столбцам. При чтении по столбцам строки будут оставаться постоянными, тогда как номер столбца является переменным фактором (т.е. Номер столбца вычисляется динамически).

Вот пути XPath, используемые для доступа к информации с помощью “постоянных” строк и “переменных” столбцов:

  • XPath для доступа к R:2, C:2 –//* [ @id ]/tbody/tr[2]/td[2]
  • XPath для доступа к R:2, C:3 –//* [ @id ]/tbody/tr[2]/td[3]
  • XPath для доступа к R:2, C:4 –//* [ @id ]/tbody/tr[2]/td[4]

Ниже показан пример XPath, используемый для считывания данных из строки 2 и всех столбцов [т.е. (2,1), (2,2), (2,3)… (2,7)].

"//*[@id='customers']/tbody/tr[2]/th[".$t_column. "]"

Для чтения полных данных из столбца-1 значение $t_column будет равно 1, а номер строки будет варьироваться от 1..3. Вот XPath для чтения данных из строки-2:

//*[@id]/tbody/tr[2]/td[1] R – 2, C – 1
//*[@id]/tbody/tr[3]/td[1] R – 3, C – 1
//*[@id]/tbody/tr[4]/td[1] R – 4, C – 1

Реализация

 "[PHP-4] Read data in the columns of a web table",
      "name" => "[PHP-4] Read data in the columns of a web table",
      "platform" => "Windows 10",
      "browserName" => "Chrome",
      "version" => "85.0"
    );
    return $capabilities;
  }

  public function setUp(): void
  {
    $url = "https://". $GLOBALS['LT_USERNAME'] .":" . $GLOBALS['LT_APPKEY'] ."@hub.lambdatest.com/wd/hub";
    $capabilities = $this->build_browser_capabilities();
    /* $this->webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities); */
    $this->webDriver = RemoteWebDriver::create($url, $capabilities);
  }

  public function tearDown(): void
  {
    $this->webDriver->quit();
  }
  /*
  * @test
  */ 
  public function test_SwitchToNewWindow()
  {
    $test_url = "https://www.w3schools.com/html/html_tables.asp";
    $title = "HTML Tables";
    $before_XPath_1 = "//*[@id='customers']/tbody/tr[1]/th[";
    $before_XPath_2 = "//*[@id='customers']/tbody/tr[2]/td[";
    $after_XPath = "]";

    $this->webDriver->get($test_url);
    $this->webDriver->manage()->window()->maximize();
    sleep(5);

    $driver = $this->webDriver;
    $this->webDriver->wait()->until(
    function () use ($driver) {
        $elements = $this->webDriver->findElements(WebDriverBy::className('w3-example'));
        return count($elements) > 0;
    },
    'Error locating W3 example element'
    );

    $rows = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr")));
    echo ("Rows in table are " . $rows);

    $columns = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr[2]/td")));
    echo("\nColumns in table are " . $columns);
    echo("\n");
    echo("\n");

    $this->assertEquals($title, $this->webDriver->getTitle());

    echo("\n\n");
    echo("Data present in Col - 1 i.e. Title\n");
    echo("-----------------------------\n");
    echo("\n");

    for($t_col = 1; $t_col <= $columns; $t_col++)
    {
        $FinalXPath = $before_XPath_1 .$t_col. $after_XPath;
        $cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath));
        $cell_text = $cell->getText();
        echo($cell_text);
        echo("\n");
    }

    echo("\n\n");
    echo("Data present in Col - 2\n");
    echo("-----------------------\n");
    echo("\n");

    for($t_col = 1; $t_col <= $columns; $t_col++)
    {
        $FinalXPath = $before_XPath_2 .$t_col. $after_XPath;
        $cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath));
        $cell_text = $cell->getText();
        echo($cell_text);
        echo("\n");
    }   
    echo("\n\n");
    echo("Fetched all the records from the table\n");
  }
}
?>

Пошаговое руководство по коду

Строки (47-49) : $before_XPath_1 содержит статическую часть XPath для строки 1 (т.е. строки с заголовком). Переменная $before_XPath_2 содержит статическую часть пути XPath для строки 2.

Как упоминалось ранее, номер столбца будет добавлен к путям XPath для формирования результирующего пути XPath, который будет использоваться для навигации по соответствующей ячейке.

$before_XPath_1 = "//*[@id='customers']/tbody/tr[1]/th["; 
$before_XPath_2 = "//*[@id='customers']/tbody/tr[2]/td["; 
$after_XPath = "]";

Линии (79 – 86) : Вот реализация для печати значений, доступных в столбцах (1..3), с постоянным номером строки (т.Е. строки).

В коде, показанном ниже, XPath для строки – 1 (т.е. tr[1]) добавляется к вычисленному XPath.

for($t_col = 1; $t_col <= ($columns); $t_col++) 
{ 
$FinalXPath = $before_XPath_1 .$t_col. $after_XPath; 
$cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath)); $cell_text = $cell->getText(); 
echo($cell_text); 
echo("\n"); }

Цикл for будет выполняться со столбцами в диапазоне от 1..3. Соответствующие значения строк (tr[1]/tr[2]/tr[3]… tr[7]) добавляются в зависимости от строки, к которой необходимо получить доступ.

Исполнение

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

Как Найти Элемент В Веб-Таблицах В Selenium PHP?

В этом тесте мы ищем элемент в таблице и сообщаем, присутствует этот элемент или нет. Содержимое каждой ячейки считывается, и для проверки наличия элемента выполняется поиск без учета регистра.

Реализация

 "[PHP-5] Perform a search for an element in the web table",
      "name" => "[PHP-5] Perform a search for an element in the web table",
      "platform" => "Windows 10",
      "browserName" => "Chrome",
      "version" => "85.0"
    );
    return $capabilities;
  }

  public function setUp(): void
  {
    $url = "https://". $GLOBALS['LT_USERNAME'] .":" . $GLOBALS['LT_APPKEY'] ."@hub.lambdatest.com/wd/hub";
    $capabilities = $this->build_browser_capabilities();
    /* $this->webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities); */
    $this->webDriver = RemoteWebDriver::create($url, $capabilities);
  }

  public function tearDown(): void
  {
    $this->webDriver->quit();
  }
  /*
  * @test
  */ 
  public function test_SwitchToNewWindow()
  {
    $test_url = "https://www.w3schools.com/html/html_tables.asp";
    $title = "HTML Tables";
    $before_XPath = "//*[@id='customers']/tbody/tr[";
    $aftertd_XPath = "]/td[";
    $aftertr_XPath = "]";
    $search_text = " Magazzini Alimentari Riuniti";

    $this->webDriver->get($test_url);
    $this->assertEquals($title, $this->webDriver->getTitle());
    $this->webDriver->manage()->window()->maximize();
    sleep(5);

    $driver = $this->webDriver;
    $this->webDriver->wait()->until(
    function () use ($driver) {
        $elements = $this->webDriver->findElements(WebDriverBy::className('w3-example'));
        return count($elements) > 0;
    },
    'Error locating W3 example element'
    );

    $rows = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr")));
    echo ("\nRows in table are " . $rows);

    $columns = count ($this->webDriver->findElements(WebDriverBy::xpath("//*[@id='customers']/tbody/tr[2]/td")));
    echo("\nColumns in table are " . $columns);
    echo("\n");
    echo("\n");

    $elem_found = False;

    for($t_row = 2; $t_row <= $rows; $t_row++)
    {
        for($t_column = 1; $t_column <= $columns; $t_column++)
        {
            $FinalXPath = $before_XPath . $t_row . $aftertd_XPath . $t_column . $aftertr_XPath;
            $cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath));
            $cell_text = $cell->getText();
            if ((strcasecmp($cell_text, $search_text)) == 0)
            {
                $concat_str = "Search Text " . $search_text . " is present at row " . $t_row . " and column " . $t_column . " in the table";
                echo($concat_str);
                $elem_found = True;
                break;
            }
        }
    }

    if ($elem_found == False)
    {
        echo("Search Text " . $search_text ." not found");
    }
  }
}
?>

Пошаговое руководство по коду

Строки (47 – 50) : Поскольку поиск должен выполняться в каждой ячейке веб-таблицы, номера строк и столбцов будут переменными. Мы разбиваем полученный XPath на три разные части, как показано ниже:

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

$before_XPath = "//*[@id='customers']/tbody/tr[";
$aftertd_XPath = "]/td[";
$aftertr_XPath = "]";
$search_text = " Magazzini Alimentari Riuniti";

Строки (76 – 80) : Вложенный цикл for используется для перехода к каждой ячейке веб-таблицы. Внешний цикл основан на количестве строк (т.е. выполняется с 2..7), тогда как внутренний цикл for основан на количестве столбцов (т.е. выполняется с 1..3).

Как показано на предыдущем шаге, соответствующие строка и столбец добавляются к переменным, используемым для определения XPath.

Например, путь XPath для следующих комбинаций RC будет:

  • R2, C1://* [ @id ]/tbody/tr[2]/td[1]
  • R6, C2://* [ @id ]/tbody/tr[6]/td[2]
for($t_row = 2; $t_row <= $rows; $t_row++) 
{ 
for($t_column = 1; $t_column <= $columns; $t_column++) { $FinalXPath = $before_XPath . $t_row . $aftertd_XPath . $t_column . $aftertr_XPath; ................................ ................................ } }

Строки (81 – 82) : Используя метод getText, предоставляемый Selenium в PHP, мы считываем текст (или данные), присутствующий в текущей ячейке.

$cell = $this->webDriver->findElement(WebDriverBy::xpath($FinalXPath)); $cell_text = $cell->getText();

Строки (83 – 89) : Сравнение без учета регистра выполняется со строкой поиска, и сведения о ячейке печатаются, если строка, присутствующая в текущей ячейке, совпадает со строкой поиска. Логической переменной elem_found присваивается значение True, и цикл завершается.

if ((strcasecmp($cell_text, $search_text)) == 0) 
{ 
$concat_str = "Search Text " . $search_text . " is present at row " . $t_row . " and column " . $t_column . " in the table"; 
echo($concat_str); 
$elem_found = True; 
break; }

Строки (93 – 96) : Если поисковый запрос не найден, логическая переменная elem_found имеет значение False, и мы выводим, что строка поиска отсутствует в веб-таблице.

if ($elem_found == False) { echo("Search Text " . $search_text ." not found"); }

Исполнение

Мы выполнили код с двумя строками поиска – 1. Лямбда-тест и 2. Йоши танНамури. Как видно из снимка выполнения, строка поиска “Лямбда-тест” отсутствует в таблице:

Ниже показан снимок выполнения, в котором строка поиска – Magazzini Alimentari Riuniti. Строка присутствует в ячейке (7,1) в таблице.

Хотя в Selenium PHP возможно гораздо больше операций с веб-таблицами, мы рассмотрели широко используемые операции в этом руководстве по Selenium PHP. Ознакомьтесь с наиболее подробным руководством по Selenium PHP (с примерами)

Вывод

Веб-таблицы обычно используются, когда информация должна отображаться в табличном формате. Данные в ячейках могут быть статическими или динамическими. Будь то Selenium PHP или Selenium Python, или любая другая комбинация языков фреймворка, основы веб-таблиц остаются неизменными.

Вы можете столкнуться с кроссбраузерными проблемами (особенно со старыми версиями браузеров и устаревшими браузерами, такими как Internet Explorer) с веб-таблицами в Selenium PHP. Следовательно, рекомендуется проверять функциональность таблиц на кроссбраузерных платформах, таких как лямбда-тест, который позволяет тестировать таблицы в Selenium PHP в нескольких комбинациях браузеров, устройств (или эмуляторов) и платформ.

Использовали ли вы веб-таблицы для веб-автоматизации Selenium? Если да, то каков ваш опыт общения с ними? Узнали ли вы что-нибудь из того, что я пропустил в этом посте? Я бы тоже хотел воспользоваться вашим опытом!

Оригинал: “https://dev.to/himanshusheth004/how-to-work-with-tables-in-selenium-php-4jge”