如何为非静态实例制作静态工厂方法?

时间:2014-06-11 11:17:00

标签: java selenium

我很少有明确等待硒测试的测试。

我用得太多了。我想将它移动到基类并每次创建新对象时剪切:

  

新的WebDriverWait(...)

现在 下一步

public void logOutUser() {
    new WebDriverWait(driver, 30).until(presenceOfElementLocated(By.xpath("//span[@class='gb_W gbii']")));
    userOptionsMenu.click();
    new WebDriverWait(driver, 30).until(presenceOfElementLocated(By.xpath("//div/a[@id='gb_71']")));
    signOutLink.click();
} 

我想将它移到Base类,并绕过冗余对象创建。

基类

public class AndroidBasePage implements IPage {

    protected WebDriver driver = null;

    private WebDriverWait driverWait;

    public AndroidBasePage() {
        driver = SeleniumManager.activeBrowser();
    }

    @Override
    public WebDriver getDriver() {
        return driver;
    }

    public WebDriverWait getWait() {
        if (driverWait == null) {
            driverWait = new WebDriverWait(driver, 30);
        }
        return driverWait;
    }
    protected void driverWaitPresenceOfElement(String xpath) {
        getWait().until(presenceOfElementLocated(By.xpath(xpath)));
    }
}

现在可以使用

public void logOutUser() {
    driverWaitPresenceOfElement("//span[@class='gb_W gbii']");
    userOptionsMenu.click();
    driverWaitPresenceOfElement("//div/a[@id='gb_71']");
    signOutLink.click();
}

但我不确定它的效率。任何建议。

是否存在使getWait()静态的某种方式?

2 个答案:

答案 0 :(得分:0)

我们在Selenium webdriver项目(非Android)中做了类似的事情。使用抽象超类。其中一个功能是getElement(String id/Xpath/name etc),它会隐式提供等待。

对于您的情况我想知道您为什么需要工厂方法?而是让它成为对象实例化的一部分(等待需要你的确切驱动程序实例)。略微修改你的课程:

public class AndroidBasePage implements IPage {

    protected WebDriver driver;

    private WebDriverWait driverWait;

    public AndroidBasePage() {
        driver = SeleniumManager.activeBrowser();
         //only one driverwait for a page instance
        driverWait = new WebDriverWait(driver, 30);//time should be configurable
    }

    @Override
    public WebDriver getDriver() {
        return driver;
    }


    protected void driverWaitPresenceOfElement(String xpath) {
       driverWait.until(presenceOfElementLocated(By.xpath(xpath)));
    }
}

答案 1 :(得分:0)

我发现你有30秒的固定等待时间。在调用Web驱动程序初始化后使用隐式等待是否更好?

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);