如何通过非静态Webdriver使用自己的方法

时间:2019-01-24 23:36:26

标签: java selenium selenium-webdriver

我听说将WebDriver实例和方法设置为静态是不好的做法。 我从代码中删除了它,但是现在出现了问题: 我在方法:“ setLoginAndPassword()”的类“ LoginPage.java”中遇到错误:

  

该类型的方法setValueInField(By,String)未定义   登录页面

和:

  

对于LoginPage类型,方法clickIn(By)未定义

如何解决?也许继承?但是Java不支持多重继承(类LoginPage.java必须扩展ClickFunctions和InputFunctions

我的代码: 包: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();
    }
}

包:test,类:MainTests.java

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

包:pageobjects,类: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 :(得分:0)

您可以将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()的接口,可以使用这些实用程序通过页面来实现。 (这是一种多重继承)。