2010-07-17 2 views
14

фрагмент кода ниже работает отлично, но у меня немного проблемы с wait.until() линии:Как использовать селен 2 PageFactory init Элементы с Wait.until()?

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

Это работает, но я хочу, чтобы отправить мой PageFactoryWebElementhomePageLink вместо:

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); 
    } 
} 
+0

Я использую SlowLoadableComponent вместо этого. Это позволяет мне задерживать между isLoaded() и load(), чтобы страница продолжала повторять попытку до загрузки страницы. – djangofan

ответ

19

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

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

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

+1

Это работает, но это будет SlowLoadableComponent. Итак, вопрос в том, какой метод работает лучше и для каких ситуаций? – djangofan

+0

Даже если это было какое-то время, вы можете мне кое-что уточнить? API Selenium, должно быть, немного изменился, но теперь AjaxElementLocatorFactory имеет 3 параметра вместо 2. Не могли бы вы дать понять, что должен сделать второй параметр? –

+0

Есть ли способ сделать это в C#? Я не могу найти AjaxElementLocatorFactory. – chill182

1

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

2

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

Здесь:

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