2011-08-24 7 views
12

Tutti gli esempi di findElement (By.xpath) ho visto effettuare ricerche nell'intera pagina, ad es.Selenio 2 - Può trovare Element (By.xpath) essere circoscritto ad un particolare elemento?

WebElement td = driver.findElement(By.xpath("//td[3]")); 

Quello che voglio ottenere è questo:

WebElement tr = ... // find a particular table row (no problem here) 
WebElement td = tr.findElement(By.xpath("/td[3]")); // Doesn't work! 

ho provato anche altre varianti senza fortuna: "td [3]", "bambino :: td [3]"

Utilizzando "// td [3]" trova il primo nodo corrispondente nell'intera pagina, cioè non limitato al mio tr. Quindi assomiglia a quando si trova Elemento per xpath, il WebElement su cui si chiama findElement() non conta nulla.

E 'possibile scope findElement (By.xpath) a un particolare WebElement?

(sto usando Chrome, nel caso in cui conta.)

NOTA: By.xpath ("// td [3]") è solo un esempio. Non sto cercando modi alternativi per ottenere la stessa cosa. La domanda è solo per cercare di accertare se foo.findElement() prenda nota di foo quando viene usato con un selettore By.xpath.

risposta

0
what i m understanding that u want to retrieve a particular td from a tr, so here's a snippet you can try it with your code to find 3rd td... 



WebElement tr=//...find a particular table row 
    List<WebElement> columns = tr.findElements(By.tagName("td")); 
    Iterator<WebElement> j = columns.iterator(); 
    int count=0; 
    while(j.hasNext()) 
      { 
       WebElement column = j.next(); 
       if(count==2) 
       { 
        System.out.print(column.getText()); 
       } 
       count++; 
      } 

You can change count value in if condition to retrieve another td.. 
Hope this will help you.. 
+0

Grazie per andare a tutti questi problemi, Jay, ma il "/ td ​​[3]" era solo un esempio. Voglio sapere se è possibile eseguire questo tipo di query con scope usando xpath, perché la possibilità di farlo sarebbe molto comoda in determinate situazioni. –

2

Penso che questo potrebbe essere un bug nel modo in cui Selenium2 utilizza xpath. Tuttavia, credo di aver limitato con successo l'ambito usando ":: ancestor" prima.

In ogni caso, hai provato a utilizzare selettori Css per risolvere questo? È un'opzione per te? Prova questo:

tr.findElement (By.cssSelectors ("td: nth-of-type (3)"));

Questo dovrebbe fare il lavoro ed è l'equivalente di ciò che si è tentato inizialmente:

tr.findElement (By.xpath ("// td [3]"));

+0

Grazie per il suggerimento 'antenato ::' - ci proverò. Come ho commentato nell'ultima risposta, "/ td ​​[3]" era solo un esempio. Preferisco i selettori non-xpath ove possibile (non ultimo perché sono così inaffidabili in IE). Ma questa domanda era puramente per cercare di accertare se è possibile eseguire una query con scope usando xpath. –

4

Mi sono anche imbattuto in questo problema e ho speso un sacco di tempo cercando di capire la soluzione alternativa. E questo è quello che ho capito:

WebElement td = tr.findElement(By.xpath("td[3]")); 

Non so perché, ma questo funziona per me.

+2

Non avendo una barra iniziale (o due) la query è relativa anziché assoluta. Vedi la mia risposta per un link ai documenti. – Adam

+0

WebDriver mi ha bloccato/aspettato fino a quando non ho modificato il tempo di attesa implicito su 0 (predefinito). http://seleniumhq.org/docs/04_webdriver_advanced.html#implicit-waits – Jayen

10

Sulla base della risposta di ZzZ, penso che il problema sia che le query che stai cercando sono assolute anziché relative. Utilizzando uno / iniziale si forza la ricerca assoluta. Utilizzare invece il nome del tag come suggerito da ZzZ, ./ o .//.

Guardate nel XPath docs sotto "Location Path Expression"

+1

Questo è vero e spiegato anche in [Selenium docs] (http://selenium.googlecode.com/svn/trunk/docs/api/java /org/openqa/selenium/WebElement.html) per l'interfaccia WebElement, nel metodo "findElements". – gamliela

0

WebElement TD = tr.findElement (By.xpath ("/ td ​​[3]"));

Se si desidera solo trovare gli elementi figlio del tr, utilizzare un percorso relativo non assoluto.

questo dovrebbe funzionare:

int index = 3; 
List<WebElement> tds = tr.findElements(By.xpath(".//td")); 
System.out.println(tds[index].getText()); 
Problemi correlati