【问题标题】:How to use own methods with non-static webdriver如何在非静态 webdriver 中使用自己的方法
【发布时间】:2019-01-24 23:36:25
【问题描述】:

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

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

和:

方法 clickIn(By) 没有为 LoginPage 类型定义

如何解决?也许继承?但是 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();
    }
}

包:测试,类: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);
    }
}

【问题讨论】:

    标签: java selenium selenium-webdriver


    【解决方案1】:

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

    【讨论】:

    • 与:java 8 默认方法方法将是接口驱动程序的问题:
    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多