Selen 2 - Kann findElement (By.xpath) auf ein bestimmtes Element angewendet werden?

  • Alle Beispiele von findElement (By.xpath) haben die gesamte Seite durchsucht, z. B.

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

    Was ich erreichen möchte, ist folgendes:

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

    Ich habe es auch versucht Andere Varianten ohne Glück: "td [3]", "child :: td [3]"

    Mit "// td [3]" wird der erste übereinstimmende Knoten in der gefunden ganze Seite, dh nicht auf meine tr beschränkt. Es sieht also so aus, als würde findElement über xpath das WebElement, für das Sie findElement () aufrufen, für nichts zählen.

    Ist es möglich, findElement (By.xpath) auf einen bestimmten Bereich zu beschränken WebElement?

    (Ich verwende Chrome, falls es wichtig ist.)

    BITTE BEACHTEN SIE: By.xpath ("// td [3]") ist nur ein Beispiel. Ich suche nicht nach alternativen Wegen, um dasselbe zu erreichen. Bei der Frage geht es nur darum zu ermitteln, ob foo.findElement () foo zur Kenntnis nimmt, wenn es mit einem By.xpath-Selektor verwendet wird.

    13 September 2011
    David Easley
5 answers
  • Basierend auf der Antwort von ZzZ denke ich, das Problem ist, dass die Abfragen, die Sie versuchen, absolut und nicht relativ sind. Mit einem Start / erzwingen Sie die absolute Suche. Verwenden Sie stattdessen den Tag-Namen wie von ZzZ vorgeschlagen, ./ oder .//.

    Schauen Sie in XPath-Dokumente unter" Standortpfadausdruck "

    22 November 2011
    AdamCode Bug
  • Ich bin auch auf dieses Problem gestoßen und habe ziemlich viel Zeit damit verbracht, die Problemumgehung herauszufinden. Und das habe ich herausgefunden:

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

    Ich weiß nicht warum, aber das funktioniert für mich.

    12 October 2011
    ZzZ
  • Ich denke, dass dies ein Fehler in der Art ist, wie Selenium2 xpath verwendet. Ich glaube jedoch, dass ich den Bereich zuvor mit ":: ancestor" erfolgreich eingeschränkt habe.

    Haben Sie auf jeden Fall versucht, Css Selectors zu verwenden, um das Problem zu lösen? Ist das eine Option für dich? Versuchen Sie Folgendes:

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

    Dies sollte die Aufgabe erledigen und entspricht dem, was Sie anfangs versucht haben:

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

    09 September 2011
    SlimDavid
  • WebElement td = tr.findElement (By.xpath ("/ td ​​[3]"));

    Wenn Sie nur die untergeordneten Elemente des Befehls tr suchen möchten, verwenden Sie einen relativen Pfad, der nicht absolut ist.

    Das sollte funktionieren:

     int index = 3;
    List<WebElement> tds = tr.findElements(By.xpath(".//td"));
    System.out.println(tds[index].getText());
     
    05 September 2012
    hennrYoni Moses
  •  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..
     
    26 August 2011
    Jay Satwani