如何在Wait.until()中使用selenium 2 PageFactory init元素?

时间:2010-07-17 19:07:28

标签: selenium webdriver

下面的代码段工作正常,但我对wait.until()行有点麻烦:

wait.until(new ElementPresent(By.xpath("//a[@title='Go to Google Home']")));

虽然有效,但我想发送PageFactory WebElement homePageLink代替:

wait.until(new ElementPresent(homePageLink));

有没有办法做到这一点?

这些新奇的Selenium 2功能让我头脑发热,我找不到太多文档。

感谢。

public class GoogleResultsPage extends TestBase {

    @FindBy(xpath = "//a[@title='Go to Google Home']")
    @CacheLookup
    private WebElement homePageLink;

    public GoogleResultsPage() {  
        wait.until(new ElementPresent(By.xpath("//a[@title='Go to Google Home']")));
        assertThat(driver.getTitle(), containsString("Google Search"));
    }  
}

public class ElementPresent implements ExpectedCondition<WebElement> {

    private final By locator;

    public ElementPresent(By locator) {
        this.locator = locator;
    }

    public WebElement apply(WebDriver driver) {
        return driver.findElement(locator);
    }
}

3 个答案:

答案 0 :(得分:21)

我将PageFactoryAjaxElementLocatorFactory一起使用 - PageFactory是您正在使用的Selenium 2 Page Objects模式的支持类,而AjaxElementLocatorFactory是元素定位器的工厂。在您的情况下,构造函数将如下所示:

public GoogleResultsPage() { 
    PageFactory.initElements(new AjaxElementLocatorFactory(driver, 15), this);
}

此代码将等待最多15秒,直到注释指定的元素出现在页面上,在您的情况下,将由xpath定位homePageLink。您不需要使用ElementPresent类。

答案 1 :(得分:2)

有关C#的实施请求。

这是:

IWebDriver driver = new ChromeDriver();
RetryingElementLocator retry = new RetryingElementLocator(driver, TimeSpan.FromSeconds(5));
IPageObjectMemberDecorator decor = new DefaultPageObjectMemberDecorator();
PageFactory.InitElements(retry.SearchContext, this, decor);

答案 2 :(得分:1)

AjaxElementLocatorFactory在内部使用SlowLoadableComponent。检查源代码here