Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Как можно данные массива веб элементов с одной страницы использовать в другой?

ide
intellij
idea
java
webdriver
selenium
Теги: #<Tag:0x00007fedbbb587a8> #<Tag:0x00007fedbbb58410> #<Tag:0x00007fedbbb582a8> #<Tag:0x00007fedbbb58118> #<Tag:0x00007fedbbb5feb8> #<Tag:0x00007fedbbb5fd78>

(Matthew Prok) #1

Из-за неопытности программирования не могу решить один вопрос. Есть тест, который состоит из нескольких методов и юзает две страницы сайта.

Две страницы - это два разных класса.(Элементы одной страницы в одном классе, элементы второй в другом)

Нужно проверить, что первый инвент номер из списка на первой странице есть на второй странице в списке (он может быть не первым), и если он есть, нужно нажать кнопку напротив этого номера.

Сначала я делал так:

  1. Получаю список инвент номеров на первой странице, записываю их в стринговый массив
  2. перехожу на вторую страницу
  3. получаю список на второй странице
  4. проверяю, если второй список содержит первый элемент первого списка, то нажимаю кнопку с учетом порядка элемента в списке

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

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

В селениум ide все проще с этим, так как там можно один раз сохранить значение в переменную, которая будет на протяжении всех тестов с одним значением, если его не поменять, и можно где угодно это значение использовать.

Подскажите, как это реализовать в коде?


(Vasiliy Rakshin) #2

Так вы покажите свой код сначала.

Например так:

ВашТест {
   Стринг[] список = new МетодПолученияНомеровСПервойТаблицы();
   МетодПроверкиНомеровНаВторойСтраницы(список);
}

Стринг[] МетодПолученияНомеровСПервойТаблицы(){
   Получаю список инвент номеров на первой странице, записываю их в стринговый массив
  ретурн стринговый_массив;
}

МетодПроверкиНомеровНаВторойСтраницы(Стринг[] номера){
   перехожу на вторую страницу
   получаю список на второй странице
   проверяю, если второй список содержит первый элемент первого списка что мы получили в этот метод, то нажимаю кнопку с учетом порядка элемента в списке
}


(Matthew Prok) #3

//Тестовый класс
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 приходил не пустым, а с инвент номерами первой страницы.


(Matthew Prok) #4

Касательно вашего примера получится, что во время вызова второго метода, мы будем на второй странице, а так как второй метод вызывает первый через параметр, то и первый будет отрабатывать относительно второй страницы.


(Bohdan Harasym) #5

продебажте тест:

  1. перевірте розмір List listOfInventInOrder; - можливо немає ніякого списку вебелементів
  2. перевірте розмір ArrayList invent в циклі, чи додається текст. можливо getText() нічого не повертає.

(Andrey Bykov) #6

В методе 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 я бы добавил второй параметр (массив с которым надо сравнивать). А дальше согласно логике проверки