How to use selenium 2 PageFactory init Elements wi

2020-05-19 02:10发布

The code snippet below works fine, but I'm having a little trouble with the wait.until() line:

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

It works but I want to send my PageFactory WebElement homePageLink instead:

wait.until(new ElementPresent(homePageLink));

Is there any way to do that?

These new fangled Selenium 2 features have got my head in a bit of a spin and I can't find much documentation.

Thanks.

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条回答
地球回转人心会变
2楼-- · 2020-05-19 02:52

I use PageFactory with AjaxElementLocatorFactory - PageFactory is a support class for the Selenium 2 Page Objects pattern which you are using, and the AjaxElementLocatorFactory is the factory for the element locators. In your case the constructor will looks like:

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

This code will wait maximum of 15 seconds until the elements specified by annotations will appear on the page, in your case the homePageLink which will be located by xpath. You will not need to use ElementPresent class.

查看更多
smile是对你的礼貌
3楼-- · 2020-05-19 02:54

AjaxElementLocatorFactory uses SlowLoadableComponent internally. Check the source code here

查看更多
狗以群分
4楼-- · 2020-05-19 02:56

There was a request for implementation on C#.

Here it is:

IWebDriver driver = new ChromeDriver();
RetryingElementLocator retry = new RetryingElementLocator(driver, TimeSpan.FromSeconds(5));
IPageObjectMemberDecorator decor = new DefaultPageObjectMemberDecorator();
PageFactory.InitElements(retry.SearchContext, this, decor);
查看更多
登录 后发表回答