#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. Если у вас нет заранее определенных ожидаемых результатов, вы можете выбрать одну из ожидаемых фактических отображаемых данных и сравнить с ней другую фактическую. Логика во многом та же.