Как использовать собственные методы с нестатическим webdriver - PullRequest
0 голосов
/ 25 января 2019

Я слышал, что не рекомендуется устанавливать экземпляр и методы WebDriver как статические.Я удалил его из своего кода, но теперь у меня проблема: я получил ошибку в классе: «LoginPage.java» в методе: «setLoginAndPassword ()»:

Метод setValueInField (By, String) не определено для типа LoginPage

и:

Метод clickIn (By) не определен для типа LoginPage

Какрешить это?Может наследство?Но Java не поддерживает множественное наследование (класс LoginPage.java должен был бы расширять ClickFunctions и InputFunctions

Мой код: package: utils, класс: Initialize.java:

public class Initialize {
    protected WebDriver driver;

    @BeforeClass
    public void setUp(){
        System.setProperty("webdriver.gecko.driver", "c:\\tests\\geckodriver.exe");
        driver = new FirefoxDriver();
    }
}

package:test, класс: MainTests.java

  public class MainTests extends Initialize{
        @Test
        public void test(){
            LoginPage loginPage = new LoginPage(driver);
            loginPage.getLoginPage();
            HomePage homePage = loginPage.setLoginAndPassword();
        }
    }

пакет: объекты страницы, класс: LoginPage.java:

public class LoginPage{
    public LoginPage(WebDriver driver){
        this.driver = driver;
    }

    private WebDriver driver;
    private By login = By.cssSelector("#Login");
    private By password = By.cssSelector("#Password");
    private By submit = By.cssSelector("#submit");

    public LoginPage getLoginPage(){
        driver.get("https://verytest.pl");
        return this;
    }

    public HomePage setLoginAndPassword(){
        setValueInField(login,"anylogin");
        setValueInField(password,"anypass");
        clickIn(submit);
        return new HomePage(driver);
    }

}

пакет: функции, класс: ClickFunctions.java:

public class ClickFunctions extends Initialize{
    public void clickIn(By locator){
        new WebDriverWait(driver,120).until(ExpectedConditions.elementToBeClickable(locator));
        driver.findElement(locator).click();
    }
}

пакет: функции, класс: InputFunctions.java:

public class InputFuntions extends Initialize{
    public void setValueInField(By locator, String fieldValue){
        new WebDriverWait(driver,120).until(ExpectedConditions.visibilityOfElementLocated(locator));
        driver.findElement(locator).sendKeys(fieldValue);
    }
}

1 Ответ

0 голосов
/ 25 января 2019

Вы можете реорганизовать InputFunctions или ClickFunctions как служебный класс (тогда не нужно расширять Initialize).

Пример

public class InputFuntions {
    public static void setValueInField(WebDriver driver, By locator, String fieldValue){
        new WebDriverWait(driver,120).until(ExpectedConditions.visibilityOfElementLocated(locator));
        driver.findElement(locator).sendKeys(fieldValue);
    }
}

Затем вы можете статически импортировать его и использовать

import static my.package.InputFuntions.*

   public class LoginPage{
    public LoginPage(WebDriver driver){
        this.driver = driver;
    }

    private WebDriver driver;
    private By login = By.cssSelector("#Login");
    private By password = By.cssSelector("#Password");
    private By submit = By.cssSelector("#submit");

    public LoginPage getLoginPage(){
        driver.get("https://verytest.pl");
        return this;
    }

    public HomePage setLoginAndPassword(){
        setValueInField(driver, login,"anylogin");
        setValueInField(driver, password,"anypass");
        clickIn(driver,submit);
        return new HomePage(driver);
    }

}

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

Пример

 public class Page {

 protected Webdriver driver;
 public void setValueInField(By locator, String fieldValue){
        new WebDriverWait(driver,120).until(ExpectedConditions.visibilityOfElementLocated(locator));
        driver.findElement(locator).sendKeys(fieldValue);
    }
// add other method here
}

Пример использования

public class LoginPage extends Page{
    public LoginPage(WebDriver driver){
        this.driver = driver;
    }

    private WebDriver driver;
    private By login = By.cssSelector("#Login");
    private By password = By.cssSelector("#Password");
    private By submit = By.cssSelector("#submit");

    public LoginPage getLoginPage(){
        driver.get("https://verytest.pl");
        return this;
    }

    public HomePage setLoginAndPassword(){
        setValueInField(login,"anylogin");
        setValueInField(password,"anypass");
        clickIn(submit);
        return new HomePage(driver);
    }

}

И, наконец, вы также можете использовать метод java 8 по умолчанию. Определяя каждый класс утилит как интерфейс с методами по умолчанию (такими как clickIn) и getDriver (), которые могут быть реализованы на странице с помощью этих утилит. (Это разновидность множественного наследования).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...