Ошибка при реализации Pagefactory и явное ожидание - PullRequest
0 голосов
/ 23 сентября 2019

Я использую Pagefactory и хочу реализовать явное ожидание в некоторых методах на странице.Вот общая структура моего кода:

public class HomePage{ 

private String username;
private String password;
...

@FindBy(id= "username")
public static WebElement LoginUserName;
...

public LoginPage(RemoteWebDriver driver, ExtentTest test, Properties config) {
     this.driver = driver;
     this.test = test;
     this.config = config;
     PageFactory.initElements(driver,this);
}

public void enterUserName(String userName) throws Exception {
     WebDriverWait wait = new WebDriverWait(driver, 10);
     wait.until(ExpectedConditions.elementToBeClickable(LoginUserName));
     if (LoginUserName.isDisplayed()) {
            LoginUserName.sendKeys(userName);
     } else {
            test.log(LogStatus.ERROR, "Element Not found");
            throw new Exception("Element not found" + LoginUserName.toString());
     }
}
...

приведенный выше код работает нормально, но если я определю WebDriverWait wait = new WebDriverWait(driver, 10); вне enterUserName, я получу ошибку.Я хочу определить WebDriverWait wait снаружи, потому что я хочу использовать его и в других методах.Итак, как я могу определить WebDriverWait wait = new WebDriverWait(driver, 10); вне enterUserName без получения ошибки?

ошибка не показывает полезную информацию (Caught exception;>>>>>:null)

Спасибо за любую помощь :)

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Это правильно?Согласно вашему коду: Имя класса: HomePage

public class HomePage{

Конструктор: LoginPage

public LoginPage(RemoteWebDriver driver, ExtentTest test, Properties config) {

Я бы посоветовал хранить все служебные методы в отдельном файле, если вы создаетеframework.

    /**
 * Explicit Wait for Element To Be Clickable.
 * @param driver
 * @param seconds
 * @param element
 */
public static void explicitWaitElementToBeClickable(WebDriver driver, int seconds, WebElement element) {
    try {
        wait = new WebDriverWait(driver, seconds);
        wait.until(ExpectedConditions.elementToBeClickable(element));
    } catch (NoSuchElementException e) {
        e.printStackTrace();
    }
}

Тогда используйте что-то вроде:

WaitUtility.explicitWaitElementToBeClickable(driver, 10, loginUserName);
0 голосов
/ 23 сентября 2019

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

 public class HomePage{ 

private String username;
private String password;
private WebDriverWait wait;
...

@FindBy(id= "username")
public static WebElement LoginUserName;
...

public LoginPage(RemoteWebDriver driver, ExtentTest test, Properties config) {
     this.driver = driver;
     this.test = test;
     this.config = config;
     PageFactory.initElements(driver,this);
     this.wait = new WebDriverWait(this.driver, 10);
}

public void enterUserName(String userName) throws Exception {

     wait.until(ExpectedConditions.elementToBeClickable(LoginUserName));
     if (LoginUserName.isDisplayed()) {
            LoginUserName.sendKeys(userName);
     } else {
            test.log(LogStatus.ERROR, "Element Not found");
            throw new Exception("Element not found" + LoginUserName.toString());
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...