更新代码以包含wait.until条件

时间:2018-08-27 08:04:13

标签: java selenium

我一直在使用页面对象模型来查找元素并对其执行操作,例如

public class loginPage extends HelperClass
{

@FindBy(xpath = ("//button[@type='submit']"))
private WebElement loginButton;

public loginPage clickLogin()
{
    loginButton.click()
    return this;
}
}

在我的JUnit测试中,我将这样调用该函数:

WebDriver driver = setUpBrowser("FireFox", websiteURL);
loginPage LoginPage = new loginPage(driver);
delay(5000); //delay 5 seconds
LoginPage.clickLogin();

您会注意到明显的延迟是不理想的。所以我决定写一个这样的等待方法:

public void waitForElementAndClick(WebElement element, WebDriver driver)
{
    WebDriverWait wait = new WebDriverWait(driver, 30);
    //wait.until(ExpectedConditions.visibilityOf(element));
    wait.until(ExpectedConditions.or
            (
                ExpectedConditions.visibilityOf(element), ExpectedConditions.elementToBeClickable(element) 
            ));
    System.out.println(element);

    element.click();
}

一切正常,那么您要问什么问题?问题是,要更改我编写的所有代码以适应此等待功能需要花费大量的维护工作。我需要更改JUnit调用以包含驱动程序,例如

LoginPage.clickLogin(driver);

然后在页面对象模型中,我还必须更改所有方法,例如

public loginPage clickLogin(WebDriver driver)
{
    waitForElementAndClick(loginButton, driver);
    return this;
}

是否有一种更简便的方法,而无需遍历应用这些更改的所有代码?

2 个答案:

答案 0 :(得分:0)

public void waitForElementAndClick(WebElement元素,WebDriver驱动程序):为什么此函数需要显式要求WebDriver对象?

1)如果将等待函数编写在已经具有webdriver构造函数参数的loginPage类内部,则可以在等待函数内部传递相同的对象

public class loginPage extends HelperClass
{
WebDriver driver;
//Constructor : 
public loginPage(WebDriver driver) {
this.driver = driver;
 }
}

WebDriverWait等待=新的WebDriverWait(驱动程序,30); :在这里,驱动程序变量将被自动获取

2)如果用其他类编写了wait函数,则可以遵循相同的方法来避免为wait函数使用驱动程序变量

答案 1 :(得分:0)