Сравните две таблицы на экране, используя Selenium с Java

#java #selenium #selenium-webdriver

#java #селен #selenium-webdriver

Вопрос:

Я должен сравнить две таблицы в качестве QA. Я извлекаю значения из обеих таблиц, используя следующий код на Selenium.

К вашему сведению: я использовал два разных окна браузера и разные имена переменных для каждой из двух таблиц (т. е. по одному в каждой среде)

 String first_part = ".//*[@id='Matrix']/tbody/tr[";
    String second_part = "]/td[";
    String third_part = "]/a";


    //rows of the matrix table (Always 7)
    for (int i=4; i<=7; i  ){
        //Columns of the matrix table (Always 4)
        for (int j=1; j<=4; j  ){
            //Prepare final xpath for each cell value
            String matrix_cell_path =   first_part i second_part j third_part;
                //Retrieve cell-value
                String matrix_cell_data= driver.findElement(By.xpath(matrix_cell_path)).getText();
                System.out.print("matrix_cell_data[" i "][" j "]= " matrix_cell_data   " ");
        }
            System.out.println("");
            System.out.println("");  
    }


    String first_part_Prod = ".//*[@id='Matrix']/tbody/tr[";
    String second_part_Prod = "]/td[";
    String third_part_Prod = "]/a";

    //rows of the matrix table (Always 7)
    for (int k=4; k<=7; k  ){
        //Columns of the matrix table (Always 4)
        for (int l=1; l<=4; l  ){
            //Prepare final xpath for each cell value
            String matrix_cell_path_Prod = first_part_Prod k second_part_Prod l third_part_Prod;
                //Retrieve cell-value
                String matrix_cell_data_Prod = second_driver.findElement(By.xpath(matrix_cell_path_Prod)).getText();
                System.out.print("matrix_cell_data_Prod[" k "][" l "]= " matrix_cell_data_Prod   " ");
        }
            System.out.println("");
            System.out.println("");  
    }
  

Я хочу проверить, равны ли все ячейки в обеих таблицах. как это сделать?

Я использовал следующую проверку, но показывает ошибку:

matrix_cell_data не может быть преобразован в переменную.

    //Matrix Data - Content Check:
    try {
        matrix_cell_data = matrix_cell_data_Prod;
        System.out.println("Great");
    }catch (Exception ex2){
        System.out.println("Exception" ex2);
    }
  

Комментарии:

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

2. Простым способом было бы добавить каждую ячейку в String Builder. Затем сравните строки, чтобы получить различия.

Ответ №1:

Обычно я делаю это, сначала создавая класс, скажем, MyMatrixData, который реализует Comparable сам по себе

 public class MyMatrixData implements Comparable<MyMatrixData> {
   private String columnOneName;
   private String columnTwoName;
   private String columnNName;
   //With getters and setters (not shown)

   @Override
   public int compareTo(MyMatrixData actualData) {
      assertEquals("Some helpful text", this.getColumnOneName(), actualData.getColumnOneName());
      assertEquals("Some helpful text", this.getColumnTwoName(), actualData.getColumnTwoName());
      assertEquals("Some helpful text", this.getColumnNName(), actualData.getColumnNName());

      return 0;
   }
}
  

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

 Feature: Compare expected MatrixData to actual

Scenario: Some data driven or choice driven test
   Given user "me" logs in to the Matrix system
   When I navigate to the page that displays MatrixData
   Then the displayed MatrixData matches the expected
     | columnOneName | columnTwoName | columnNName |
     | Killroy       | was           | here        |
     | Betty Bop     | was           | too         |
  

Определение шага может выглядеть следующим образом

 @Then ("^the displayed MatrixData matches the expected$)
public void the_displayed_matrixdata_matches_expected(List<MyMatrixData> expectedData) throws Throwable {
    for (int i=1;i<expectedData.size(),i  ) {
      MyMatrixData actualMatrixRow = new MyMatrixData();
      actualMatrixRow.setColumnOneName(aPageObject.getColumnOneName(i));
      actualMatrixRow.setColumnTwoName(aPageObject.getColumnTwoName(i));
      actualMatrixRow.setColumnNName(aPageObject.getColumnNName(i));

      assertEquals("helpful msg", 0, expectedData.get(i).compareTo(actualMatrixRow));
    }
}
  

Я оставил методы объекта страницы для получения данных из HTML в качестве упражнения. Обычно я также создаю метод объекта страницы, чтобы получить фактическое количество строк, чтобы я мог сравнить это с ожидаемым количеством строк. Также оставлено в качестве упражнения. 🙂 Вы можете заметить, что 0 возвращается, только если все утверждения в compareTo проходят. Утверждение в step def — это больше документации, чем что-либо еще.

Я использую этот шаблон снова и снова. Я надеюсь, вы найдете это полезным.

Комментарии:

1. Если у вас нет заранее определенных ожидаемых результатов, вы можете выбрать одну из ожидаемых фактических отображаемых данных и сравнить с ней другую фактическую. Логика во многом та же.