Как я могу продолжить выполнение других шагов в случае сбоя при использовании Serenity?

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

Моя проблема заключается в следующем:
У меня есть файл Excel, который позволяет мануалу импортировать данные. Каждую строку в этом файле Excel я использую для создания новых данных (например, это похоже на учетную запись). Это не сложно. Поскольку каждая строка соответствует разным данным для создания новых данных, обязательно используйте цикл для получения данных внутри файла. Например, следующим образом:

<сильный>| Имя | Электронная почта | Тел | .... | Результат |
| А | абв@электронная почта | 123456 | .... | акА |
| Б | абв@электронная почта | 123456 | .... | акб |

Столбец результатов создается на основе данных других столбцов.
Я не использую шаблон сценария, потому что в нем много полей. И использование Excel, чтобы упростить редактирование и чтение руководства.
Итак, я использую цикл, чтобы повторить шаг, чтобы получить количество строк данных из файлов Excel.

Мой код:

public class TestClass {

    @Before
    public void set_the_stage() {
        OnStage.setTheStage(new OnlineCast());
    }

    @Given("{word} access Google")
    public void accessGoogle(String actor) {
        theActorCalled(actor).attemptsTo(Open.url("https://google.com"));
    }

    @When("Input {word}")
    public void inputSearch(String value) {
        Target input_search = Target.the("Input Search").locatedBy("//input[@title='Tìm kiếm']");
        Target click_search = Target.the("Click Search").locatedBy("//*[@class='FPdoLc tfB0Bf']//*[ @value='Tìm với Google'] ");

        theActorInTheSpotlight().attemptsTo(WaitUntil.the(input_search, WebElementStateMatchers.isVisible()));
        theActorInTheSpotlight().attemptsTo(Enter.theValue(value).into(input_search));
        // Failure step
        theActorInTheSpotlight().attemptsTo(WaitUntil.the(click_search, WebElementStateMatchers.isVisible()), Click.on(click_search));
    }

    @Then("Search successfully")
    public void searchSucess() {
        Target stackOverflow = Target.the("Stack Overflow").locatedBy("//*[contains(text(),'Stack Overflow')]");
        theActorInTheSpotlight().attemptsTo(Ensure.that(stackOverflow).isDisplayed());
    }

    @When("Read excel")
    public void readExcel() {
        int number = 5; // the number of records in the excel file

        for (int i = 0; i < number; i++) {
            try {
                System.out.println("Start Try: " + i);
                accessGoogle("Minato");
                inputSearch("stackoverflow.com");
                searchSucess();
                System.out.println("End Try: " + i);
            } catch (Exception e) {
                System.out.println("Catch: " + i);
                ThucydidesWebDriverSupport.getDriver().quit();
                ThucydidesWebDriverSupport.initialize();
                set_the_stage();
                e.getStackTrace();
            }
        }
    }
}

файл функции

@feature=searchGoogle
Feature: A description

  @testSearch
  Scenario: A scenario
    When Read excel

В автоматизации каждый раз, когда происходит сбой, выдается исключение, почему происходит сбой, и программа останавливается. С оригинальным селеном, чтобы продолжить выполнение кода ниже, я использую try catch.
Но при использовании Serenity при сбое происходит переход к отлову и продолжение цикла, но следующие шаги пропускаются. Я пока не понимаю, как работает этот фреймворк. Я попытался снова вызвать ThucydidesWebDriverSupport.initialize();; Но он все еще не выполняет шаги. (не открывает браузер).

Может кто-нибудь помочь мне? Я хочу, чтобы при сбое в какой-либо строке кода он должен продолжать работать с первого шага, пока цикл не закончится. Дело не в том, что он пропускает все шаги.
Всем спасибо!!!
Результат:

Start Try: 0

Catch: 0
Start Try: 1
End Try: 1
Start Try: 2
End Try: 2
Start Try: 3
End Try: 3
Start Try: 4
End Try: 4
18:07:20.542 [main] ERROR n.t.c.steps.ConsoleLoggingListener 

Отчет об изображении:
Отчет

Изменить
Спустя 2 дня я так и не смог найти способ инициализировать новый драйвер. Но у меня есть способ решить мою проблему.
Это сочетание схемы сценария, например:

Функция

Scenario Outline: A scenario
    When Read excel "test.xlsx" by <index>
    Examples:
      | index |
      | 1     |
      | 2     |
      | 3     |
      |...    |

Изменить код:

@When("Read excel {string} by {word}")
    public void readExcel(String fileName, String index) {
        Iterator<Row> iterator = getSheetExcel(fileName);
        List<Row> listRow = new ArrayList<>();
        int colName = 0;
        int colEmail = 1;
        // ....
        while (iterator.hasNext()) {
            listRow.add(iterator.next());
        }
        // example
        String name = listRow.get(Integer.parseInt(index)).getCell(colName).getStringCellValue();
        String email = listRow.get(Integer.parseInt(index)).getCell(colEmail).getStringCellValue();

        accessGoogle(name);
        inputSearch(email);
        inputSearch("stackoverflow.com");
        searchSucess();
    }

    public Iterator<Row> getSheetExcel(String fileName) {
        String path = System.getProperty("user.dir") + "/src/test/resources/data/excel/" + fileName;
        File file = new File(path);   //creating a new file instance
        FileInputStream fis;          //obtaining bytes from the file
        XSSFWorkbook wb;              //creating Workbook instance that refers to .xlsx file
        XSSFSheet sheet = null;

        try {
            fis = new FileInputStream(file);
            wb = new XSSFWorkbook(fis);
            sheet = wb.getSheetAt(0);   //creating a Sheet object to retrieve object
        } catch (IOException e) {
            e.printStackTrace();
        }

        assert sheet != null;
        return sheet.iterator();
    }

Результат:
введите здесь описание изображения


person Minato    schedule 12.09.2020    source источник


Ответы (1)


Чтение данных из таблиц обычно используется для параметризованных тестов. С огурцом вам нужно поместить таблицу данных в файл функций https://webkul.com/blog/parametrization-in-cucumber/

Scenario Outline: Test user Login with different credentials
    Given Open Firefox and navigate to Login page
    When valid "<username>" and "<password>" is entered
    Then User should be logged in successfully
 
Examples:
    | username   | password |
    | [email protected] | Test@123 |
    | [email protected]| Testtest |

см. Cucumber: как читать примеры из внешний файл excel для схемы сценариев как получить данные из excel в файл функций.

Мне кажется, вы не очень разбираетесь в используемых вами фреймворках, они вам действительно нужны? Может быть, я могу порекомендовать начать с простого параметризованного теста JUnit? Пример: https://www.lambdatest.com/blog/junit-parameterized-test-selenium/

person globalworming    schedule 12.09.2020
comment
Спасибо за поддержку. Я знаю, как использовать таблицу данных. Не могли бы вы сказать мне, как интегрировать QAF в мой проект Serenity? Я хочу иметь возможность читать несколько записей в Excel. Каждая запись является повторением сценария времени. Это похоже на функцию Scenario Outline. Не просто чтение 1 записи. - person Minato; 14.09.2020