Прошу прощения за мой плохой английский. Я использую 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();
}