2010-07-17 21 views
14

El siguiente fragmento de código funciona bien, pero estoy teniendo un pequeño problema con la línea wait.until():Cómo usar selenium 2 PageFactory init Elements con Wait.until()?

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

Funciona pero quiero enviar mi PageFactoryWebElementhomePageLink lugar:

wait.until(new ElementPresent(homePageLink)); 

Es Hay alguna manera de hacer eso?

Estas nuevas características de Selenium 2 me han dado un vuelco y no encuentro mucha documentación.

Gracias.

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

utilizo SlowLoadableComponent lugar. Me permite poner un retraso entre isLoaded() y load() para que la página siga reintentando hasta que se cargue la página. – djangofan

Respuesta

19

utilizo PageFactory con AjaxElementLocatorFactory - PageFactory es una clase de apoyo para el Selenio 2 Page modelo que está utilizando objetos y la AjaxElementLocatorFactory es la fábrica de los centradores del elemento. En su caso la voluntad del constructor se ve así:

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

Este código esperará máximo de 15 segundos hasta que los elementos especificados por anotaciones van a aparecer en la página, en su caso, el homePageLink que se ubicará por XPath. No necesitarás usar la clase ElementPresent.

+1

Esto funciona pero también lo haría SlowLoadableComponent. Entonces, la pregunta es, ¿qué método funciona mejor y para qué situaciones? – djangofan

+0

Aunque ha pasado un tiempo ¿puedes aclararme algo? La API de Selenium debe haber cambiado un poco, pero ahora la AjaxElementLocatorFactory tiene 3 parámetros en lugar de 2. ¿Podría darnos una idea de cuál debería ser el 2º parámetro? –

+0

¿Hay alguna manera de hacer esto en C#? No puedo encontrar AjaxElementLocatorFactory. – chill182

1

AjaxElementLocatorFactory utiliza SlowLoadableComponent internamente. Compruebe el código fuente here

2

Hubo una solicitud de implementación en C#.

aquí está:

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