Как использовать селен 2 PageFactory init Элементы с Wait.until()?
Ниже приведен фрагмент кода ниже, но у меня небольшая проблема с линией wait.until()
:
wait.until(new ElementPresent(By.xpath("//a[@title='Go to Google Home']")));
Он работает, но я хочу отправить вместо этого PageFactory
WebElement
homePageLink
:
wait.until(new ElementPresent(homePageLink));
Есть ли способ сделать это?
Эти новые felled функции 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);
}
}
Ответы
Ответ 1
Я использую PageFactory с AjaxElementLocatorFactory - PageFactory - это класс поддержки для шаблона Selenium 2 Page Objects, который вы используете, а AjaxElementLocatorFactory - это factory для локаторов элементов. В вашем случае конструктор будет выглядеть так:
public GoogleResultsPage() {
PageFactory.initElements(new AjaxElementLocatorFactory(driver, 15), this);
}
Этот код будет ждать максимум 15 секунд, пока элементы, указанные аннотациями, не появятся на странице, в вашем случае homePageLink, который будет расположен по xpath. Вам не нужно будет использовать класс ElementPresent.
Ответ 2
Был запрос на реализацию на С#.
Вот он:
IWebDriver driver = new ChromeDriver();
RetryingElementLocator retry = new RetryingElementLocator(driver, TimeSpan.FromSeconds(5));
IPageObjectMemberDecorator decor = new DefaultPageObjectMemberDecorator();
PageFactory.InitElements(retry.SearchContext, this, decor);
Ответ 3
AjaxElementLocatorFactory использует SlowLoadableComponent внутри. Проверьте исходный код здесь