Из-за неопытности программирования не могу решить один вопрос. Есть тест, который состоит из нескольких методов и юзает две страницы сайта.
Две страницы - это два разных класса.(Элементы одной страницы в одном классе, элементы второй в другом)
Нужно проверить, что первый инвент номер из списка на первой странице есть на второй странице в списке (он может быть не первым), и если он есть, нужно нажать кнопку напротив этого номера.
Сначала я делал так:
Получаю список инвент номеров на первой странице, записываю их в стринговый массив
перехожу на вторую страницу
получаю список на второй странице
проверяю, если второй список содержит первый элемент первого списка, то нажимаю кнопку с учетом порядка элемента в списке
Естественно вылетает ошибка, потому что массив с первой страницы приходит нулевой, когда я пытаюсь вызвать его в методе второго класса, даже учитывая то, что я пересохранил его в новый стринговый массив, который напрямую не вызывает поиск элементов на странице.
Потому что если допустим напрямую вызывать массив элементов первой страницы в методе второго класса, то он уже не вернет список первой страницы, так как мы будем в данный момент находится на второй странице.
В селениум ide все проще с этим, так как там можно один раз сохранить значение в переменную, которая будет на протяжении всех тестов с одним значением, если его не поменять, и можно где угодно это значение использовать.
ВашТест {
Стринг[] список = new МетодПолученияНомеровСПервойТаблицы();
МетодПроверкиНомеровНаВторойСтраницы(список);
}
Стринг[] МетодПолученияНомеровСПервойТаблицы(){
Получаю список инвент номеров на первой странице, записываю их в стринговый массив
ретурн стринговый_массив;
}
МетодПроверкиНомеровНаВторойСтраницы(Стринг[] номера){
перехожу на вторую страницу
получаю список на второй странице
проверяю, если второй список содержит первый элемент первого списка что мы получили в этот метод, то нажимаю кнопку с учетом порядка элемента в списке
}
//Тестовый класс
public class OurDetailsInOrder extends TestBase {
private HomePage homepage;
private Login login;
private MainMenu mainMenu;
private SearchDetailsForSale searchDetailsForSale;
private Order order;
private TaskMenu taskMenu;
private ConfirmationPage confirmationPage;
/**
* Инициализация веб-объектов на страницах
*/
@BeforeTest
public void initPageObjectsAndTakeOrderForReviewAndTakeOrderToWork() throws InterruptedException, IOException {
homepage = PageFactory.initElements(driver, HomePage.class);
login = PageFactory.initElements(driver, Login.class);
mainMenu = PageFactory.initElements(driver, MainMenu.class);
searchDetailsForSale = PageFactory.initElements(driver, SearchDetailsForSale.class);
order = PageFactory.initElements(driver, Order.class);
taskMenu = PageFactory.initElements(driver, TaskMenu.class);
confirmationPage = PageFactory.initElements(driver, ConfirmationPage.class);
homepage.open();
}
/**
* Если подтверждают отсутствие детали, её статус должен измениться
*/
@Test(priority = 5)
public void checkThatIfDetailIsMissingItsStatusChange() throws InterruptedException {
//здесь происходит сохранение инвент номеров с первой страницы
order.getInventNumberOfDetailsInOrder();
taskMenu.openTaskMenu();
//переход на вторую страницу
taskMenu.clickOnATask(2);
//здесь происходит получение списка на второй странице и проверка
order.clickTheButtonOfDefinitePartPosition(1);
confirmationPage.confirmAbsence();
}
}
public class перваяСтраница {
/**
* Список инвент номеров деталей в заказе
*/
@FindBy(xpath = "//table[@class='table table-hover']/tbody/tr/td[4][@class='text']")
List<WebElement> listOfInventInOrder;
ArrayList<String> invent = new ArrayList<>();
/**
* Метод получает список инвентарных номеров деталей в заказе
*/
public void getInventNumberOfDetailsInOrder() {
for (WebElement list : listOfInventInOrder) {
// тут я сохраняю все в стринговый массив
invent.add(list.getText());
}
}
public class втораяСтраница {
@FindBy(xpath = "//tbody/tr/td[14][@class='collectionTable__popover-wrapper']/div/span/i")
List<WebElement> listOfButtons;
@FindBy(xpath = "//tbody/tr/td[13][@class='text']")
List<WebElement> listOfInventInConfirmationPage;
/**
* Метод находит на странице подтверждения деталей деталь, номер которой задаем в параметре, для последующей
* работы с ней
*
* @param numberOfDetailInOrder - номер детали в заказе
*/
public void clickTheButtonOfDefinitePartPosition(int numberOfDetailInOrder) {
try {
for (int i = 0; i <= listOfInventInConfirmationPage.size(); i++) {
if (listOfInventInConfirmationPage.get(i).getText()
.equals(new перваяСтраница(driver).invent().get(numberOfDetailInOrder - 1))) {
listOfButtons.get(i).click();
break;
}
}
} catch (Exception e) {
System.out.println("Нет такого инвент номера на странице подтверждения!!!");
}
}
Во втором классе пытаюсь вызвать список с первой страницы, чтобы сделать проверку.
Просто ответ на вопрос возможно очень прост, но я не понимаю. Суть только в том, как сделать так, чтобы invent приходил не пустым, а с инвент номерами первой страницы.
Касательно вашего примера получится, что во время вызова второго метода, мы будем на второй странице, а так как второй метод вызывает первый через параметр, то и первый будет отрабатывать относительно второй страницы.
В методе clickTheButtonOfDefinitePartPosition при проверке на каждой итерации создается новый экземпляр класса перваяСтраница. Соответственно у него поле invent - это пустой ArrayList.
for (int i = 0; i <= listOfInventInConfirmationPage.size(); i++) {
if (listOfInventInConfirmationPage.get(i).getText()
.equals(**new перваяСтраница(driver)**.invent().get(numberOfDetailInOrder - 1))) {
listOfButtons.get(i).click();
break;
}
}
В твоем случае, чтобы не менять код, можно в метод добавить параметр перваяСтраница (это вроде как Order в коде) и в тесте передать order.invent.
Но я бы сделал как-то так: в тесте объявил ArrayList, а метод getInventNumberOfDetailsInOrder сделал бы не public void, а public ArrayList и в тесте бы “запоминал” массив элементов. Соответственно, в методе clickTheButtonOfDefinitePartPosition я бы добавил второй параметр (массив с которым надо сравнивать). А дальше согласно логике проверки