2010-07-17 2 views
14

Il frammento di codice di seguito funziona bene, ma sto avendo un po 'di problemi con la linea wait.until():Come utilizzare il selenio 2 PageFactory init Elements con Wait.until()?

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

Funziona ma voglio inviare il mio PageFactoryWebElementhomePageLink invece:

wait.until(new ElementPresent(homePageLink)); 

Is c'è un modo per farlo?

Queste nuove funzionalità del Selenio 2 sono state messe alla prova e non riesco a trovare molta documentazione.

Grazie.

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

io uso SlowLoadableComponent invece. Mi consente di inserire un ritardo tra isLoaded() e load() in modo che la pagina continui a riprovare fino a quando la pagina non viene caricata. – djangofan

risposta

19

Io uso PageFactory con AjaxElementLocatorFactory - PageFactory è una classe di supporto per il Selenio 2 Page Oggetti modello che si sta utilizzando, e l'AjaxElementLocatorFactory è la fabbrica per i locatori degli elementi. Nel tuo caso la volontà del costruttore si presenta come:

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

Questo codice attenderà massimo di 15 secondi fino a quando appariranno gli elementi specificati da annotazioni sulla pagina, nel tuo caso la homePageLink che sarà situato vicino XPath. Non è necessario utilizzare la classe ElementPresent.

+1

Questo funziona, ma lo sarebbe SlowLoadableComponent. Quindi, la domanda è: quale metodo funziona meglio e per quali situazioni? – djangofan

+0

Anche se è passato un po 'di tempo, puoi chiarire qualcosa per me? L'API Selenium deve essere cambiata un po ', ma ora AjaxElementLocatorFactory ha 3 parametri invece di 2. Potresti dare una mano su quale dovrebbe essere il secondo parametro? –

+0

C'è un modo per farlo in C#? Non riesco a trovare AjaxElementLocatorFactory. – chill182

1

AjaxElementLocatorFactory utilizza SlowLoadableComponent internamente. Verifica il codice sorgente here

2

C'è stata una richiesta di implementazione su C#.

Eccolo:

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