下面的代码段工作正常,但我对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);
}
}
答案 0 :(得分:21)
我将PageFactory与AjaxElementLocatorFactory一起使用 - 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