Как использовать селен 2 PageFactory init Elements с Wait.until ()? - PullRequest
14 голосов
/ 17 июля 2010

Фрагмент кода ниже работает нормально, но у меня небольшие проблемы со строкой 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 ]

21 голосов
/ 19 июля 2010

Я использую PageFactory с AjaxElementLocatorFactory - PageFactory - это класс поддержки для шаблона объектов страницы Selenium, который вы используете, а AjaxElementLocatorFactory - фабрика для локаторов элементов.В вашем случае конструктор будет выглядеть следующим образом:

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

Этот код будет ожидать максимум 15 секунд, пока элементы, указанные в аннотациях, не появятся на странице, в вашем случае homePageLink, который будет расположен xpath.Вам не нужно использовать класс ElementPresent.

2 голосов
/ 26 апреля 2016

Был запрос на реализацию на C #.

Вот оно:

IWebDriver driver = new ChromeDriver();
RetryingElementLocator retry = new RetryingElementLocator(driver, TimeSpan.FromSeconds(5));
IPageObjectMemberDecorator decor = new DefaultPageObjectMemberDecorator();
PageFactory.InitElements(retry.SearchContext, this, decor);
1 голос
/ 04 февраля 2013

AjaxElementLocatorFactory внутренне использует SlowLoadableComponent. Проверьте исходный код здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...