2012-05-22 15 views
11

ho questo XPath: //*[@id="someId::button"]Selenio WebDriver: trovare tutti gli elementi con simili id ​​

Premendo mostra un elenco a discesa di valori.

Ora, so che tutti gli elementi della lista hanno un id in questo modo:

//*[@id="someId--popup::popupItemINDEX"] 

, dove l'indice è un numero compreso tra 1 e qualunque sia il numero di opzioni sono.

Conosco anche il valore su cui devo fare clic.

Una domanda potrebbe essere: poiché io sarò sempre conoscere l'ID del pulsante che genera la discesa, è possibile ottenere tutti gli elementi nel menu a discesa con un metodo riutilizzabile? (Ho bisogno di interagire con più di un menu a discesa)

Il modo in cui ho pensato è: ottenere la radice del ID iniziale, come in:

//*[@id="someId 

quindi aggiungere il resto: --popup::popupItem. Ho anche bisogno di aggiungere l'indice e ho pensato che avrei potuto utilizzare un blocco try (al fine di ottenere anche se le eccezioni quando do un indice più grande del previsto) come questo:

for(int index=1;index<someBiggerThanExpectedNumber;index++){ 
    try{ 
     WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]")); 
     if(aux.getText().equals(myDesiredValue)) 
      aux.click(); 
    }catch(Exception e){} 
} 

Si noti che sto usando la WebDriver api e java.

Mi piacerebbe sapere se questo funzionerebbe e se c'è un modo più semplice per farlo, date le informazioni iniziali che ho.

EDIT: Il mio modo suggerito opere, ma per una soluzione più semplice, la risposta accettata dovrebbe essere visto

risposta

12

Come regola generale, provare a selezionare più elementi in base a una query, se possibile. La ricerca di molti elementi uno ad uno sarà seriamente lenta.

Se ho capito bene le vostre esigenze, un buon modo per fare questo sarebbe utilizzando

driver.findElement(By.id("someId::button")).click(); 
driver.findElement(By.xpath("//*[contains(@id, 'someId--popup::popupItem') " + 
    "and text()='" + myDesiredValue + "']")) 
    .click(); 

Per ulteriori informazioni su XPath, vedere the spec. È sorprendentemente un'ottima lettura se puoi saltare la merda!

Che trova e fa clic su un elemento con testo uguale al valore desiderato che contiene "someId - popup :: popupItem" nel suo ID.

List<WebElement> list = driver.findElements(By.xpath("//*[contains(@id, 'someId--popup::popupItem')]")); 

Trova tutti gli elementi che contengono "someId-popup :: popupItem" nel loro ID.È quindi possibile attraversare l'elenco e cercare l'elemento desiderato.

Sapevi che puoi chiamare findElement() su un WebElement per cercare solo i bambini? - driver.findElement(By.id("someId")).findElements(By.className("clickable"))

Senza uno sguardo sull'HTML sottostante, credo di non poter offrire l'approccio migliore, ma ne ho alcuni nella mia testa.

+0

cercando di trovare tutti gli elementi non funzionerà, poiché l'elenco viene generato ad-hoc, oltre alla parte id, tutti gli altri attributi hanno valori diversi per tutto il tempo, anche se i valori sono gli stessi. Per prima cosa devo premere il pulsante a discesa per poter accedere/vedere gli elementi. Grazie per l'input sulla ricerca di figli di elementi! – CosminO

+0

Non riesco ancora a vedere il problema. Fare clic sul pulsante a discesa, quindi trovare tutti gli elementi visualizzati? –

+1

'// * [contiene (@id, 'someId - popup :: popupItem') e text() = 'myDesiredValue']' seleziona l'elemento che ID contiene "someId - popup :: popupItem" e quale testo il valore è uguale al valore desiderato. ... dopo aver fatto clic sul pulsante a discesa, ovviamente. –

3

Hai provato a usare JavascriptExecutor?

Se siete disposti a scrivere un po 'di Javascript allora questo sarebbe semplice rispetto a java (credo)

Tutto quello che dovrete fare è avere un po' di strisciare JavaScript tramite la sottostruttura DOM, e restituire una lista di Elementi DOM che corrispondono ai tuoi criteri. WebDriver quindi lo renderà felicemente come List<WebElement> nel mondo java.

+0

in questo momento, il progetto si basa molto su molte altre classi/metodi ausiliari. – CosminO

1

Il metodo più sicuro da usare qui è

int size=driver.findElements(By.xpath("//*[@id='someId::button']")).size(); 

Start using Index Now 

String builtString="//*[@id='someId::button']["; 

for(int index=1;index<=size();index++) 
{ 

try 
{ 

    WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]")); 

    if(aux.getText().equals(myDesiredValue)) 
      aux.click(); 

} 
catch(Exception e){} 

} 

per favore fatemelo sapere è quanto sopra Funda funziona o non.

+0

Non mi sembra che tu abbia capito la domanda. –

Problemi correlati