2013-02-12 3 views
6

Desidero utilizzare wait.until(ExpectedConditions) con DUE elementi. Sto eseguendo un test e ho bisogno di WebDriver per attendere fino a quando viene visualizzato uno dei due elementi Elemento1 O Elemento2. Poi ho bisogno di scegliere chi si presenta per primo. Ho provato:wait.until (ExpectedConditions.visibilityOf Element1 OR Element2)

WebDriverWait wait = new WebDriverWait(driver, 60); 
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//h2[@class='....']"))) || wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//h3[@class='... ']"))); 

     // Then I would need: 

String result = driver.findElement(By.xpath("...")).getText() || driver.findElement(By.xpath("...")).getText(); 

Per riassumere, ho bisogno di aspettare fino a quando uno dei due elementi si presenta. Quindi selezionare chi si presenta (non possono essere visualizzati contemporaneamente) Please Help.

+2

Raschiando, siamo noi :-) –

+0

Tak tochno !!!!! –

+0

попробуй [Watir] (http://watirwebdriver.com/)^_^ –

risposta

1

Sfortunatamente, non esiste un comando del genere. Puoi superare questo tentativo e riprovare, oppure ti consiglio di utilizzare Watij.

+0

Grazie, proverò –

7

Questo è il metodo che ho dichiarato nella mia classe Helper, funziona come un incantesimo. Basta creare il proprio ExpectedCondition e renderlo restituire qualsiasi degli elementi trovati dai localizzatori:

public static ExpectedCondition<WebElement> oneOfElementsLocatedVisible(By... args) 
{ 
    final List<By> byes = Arrays.asList(args); 
    return new ExpectedCondition<WebElement>() 
    { 
     @Override 
     public Boolean apply(WebDriver driver) 
     { 
      for (By by : byes) 
      { 
       WebElement el; 
       try {el = driver.findElement(by);} catch (Exception r) {continue;} 
       if (el.isDisplayed()) return el; 
      } 
      return false; 
     } 
    }; 
} 

E quindi è possibile utilizzare in questo modo:

Wait wait = new WebDriverWait(driver, Timeouts.WAIT_FOR_PAGE_TO_LOAD_TIMEOUT); 
WebElement webElement = (WebElement) wait.until(
     Helper.oneOfElementsLocatedVisible(
       By.xpath(SERVICE_TITLE_LOCATOR), 
       By.xpath(ATTENTION_REQUEST_ALREADY_PRESENTS_WINDOW_LOCATOR) 
     ) 
); 

Qui SERVICE_TITLE_LOCATOR e ATTENTION_REQUEST_ALREADY_PRESENTS_WINDOW_LOCATOR sono due indicatori statici per pagina.

2

Penso che il tuo problema abbia una soluzione semplice se inserisci "OR" in xpath.

WebDriverWait wait = new WebDriverWait(driver, 60); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//h2[@class='....'] | //h3[@class='... ']"))); 

Poi, per stampare l'uso risultato, ad esempio:

if(driver.findElements(By.xpath("//h2[@class='....']")).size()>0){ 
     driver.findElement(By.xpath("//h2[@class='....']")).getText(); 
}else{ 
     driver.findElement(By.xpath("//h3[@class='....']")).getText(); 
} 
0

C'è un modo alternativo per aspettare, ma si mangia con le condizioni previste e utilizza un'espressione lambda invece ..

wait.Until(x => driver.FindElements(By.Xpath("//h3[@class='... ']")).Count > 0 || driver.FindElements(By.Xpath("//h2[@class='... ']")).Count > 0); 
0

È possibile anche usare un CssSelector come questo:

wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("h2.someClass, h3.otherClass"))); 

Sostituisci someClass e otherClass con quello che avevi in ​​[...] in xpath.

11

Ora esiste una soluzione nativa per questo, il metodo or, check the doc.

Si utilizza in questo modo:

driverWait.until(ExpectedConditions.or(
    ExpectedConditions.presenceOfElementLocated(By.cssSelector("div.something")), 
    ExpectedConditions.presenceOfElementLocated(By.cssSelector("div.anything")))); 
+1

come faccio a garantire per quale elemento la condizione è vera? – Mak13

-1

C'è una soluzione semplice per questo, utilizzando un Wait esplicito:

wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='FirstElement' or @id='SecondElement']"))); 

Prima di questo ho cercato di usare wait.until(ExpectedConditions.or(..., che non era compatibile con versioni di selenio prima di 2.53.0.

Problemi correlati