Как вернуть объект страницы из generic метода

page-factory
java
Теги: #<Tag:0x00007f7b69272860> #<Tag:0x00007f7b692726d0>

(Igor Vlasuyk) #1

Всем привет.
Давно хотел создать метод generic типа, так сказать освоить работу с дженериками.
В итоге, написал метод, открывающий страницу в новой вкладке и возвращающий объект этой страницы

@Step("Открываем новую страницу по ссылке {0} и возвращаем объект страницы {1}")
    public static <T extends PageBase> T openPageInNewTab(String url, Class<T> page) {

        Selenide.executeJavaScript("window.open('"+url+"','_blank');");

        switchTo().window(getWebDriver().getWindowHandles().size()-1);

        new WebDriverWait(getWebDriver(), 20)
            .until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));

        sleep(5000);//без этого слипа поля нового объекта page будут null

        try {
            return page.newInstance();
        } catch (InstantiationException | IllegalAccessException ex) {
            throw new RuntimeException("Не получилось создать объект страницы " + page.getSimpleName());
        }
    }

Проблема моя заключается в том, что без sleep(5000), все поля возвращаемого объекта page
будут null. Хотелось бы избавиться от слипа. Вероятно, такой конструктор, создаваемой страницы, проинициализирует элементы объекта

public SkillServicePage(WebDriver driver){
        PageFactory.initElements(driver, this);
        this.driver = driver;
    }

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


(asolntsev) #2

@Igor_Vlasuyk
Вот вы чудите :slight_smile:
Взяли селенид для простоты, а сами усложняете не по-детски.

Удалите:

  1. строку с new WebDriverWait
  2. строку с sleep
  3. вместо try-catch просто вызовите метод return Selenide.page(page);
  4. и PageFactory.initElements вызывать не нужно. Селенид всё это делает сам.

#3
Class.getDeclaredConstructor(WebDriver.class).newInstance(driver);

(Igor Vlasuyk) #4

Спасибо, как только будет возможность проверить, я обязательно это сделаю.
Сейчас что-то не могу залогиниться автоюзером))