web-dev-qa-db-fra.com

WebDriver findElements By xpath

1) Je fais un tutoriel pour montrer comment fonctionne findElements By xpath. Je voudrais savoir pourquoi il retourne tous les textes qui suite au <div> élément avec attribut id=container.

code pour xpath: By.xpath("//div[@id='container']

2) Comment dois-je modifier le code pour qu'il retourne simplement le premier ou les premiers nœuds qui suivent la note parent, par exemple premier nœud comme "Home", premiers nœuds comme, Home, Manual Testing et Automation Testing.

Merci pour vos conseils et votre aide!

Voici le fragment de code pour ce tutoriel:

import Java.util.List;

import org.junit.Test;
import org.junit.Before;
import org.junit.After;

import org.openqa.Selenium.By;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.WebElement;
import org.openqa.Selenium.firefox.FirefoxDriver;

public class WD_findElements 
{
    @Test
    public void test_byxpath(){

        WebDriver driver = new FirefoxDriver();

        try{
            driver.get("http://www.hexbytes.com");

        List<WebElement> elements = driver.findElements(By.xpath("//div[@id='container']"));    
            System.out.println("Test7 number of elements: " + elements.size());

            for(WebElement ele : elements){
                //ele.sendKeys("hexbyes");
                System.out.println(ele.getText());
                //System.out.println(ele.getAttribute("id"));
                //System.out.println(ele.getTagName());
            } 
        }
        finally {
            driver.close();
        }

    }//end of test_byxpath

 public void xpathDemo2() {
           WebDriver driver = new FirefoxDriver();
           try{
               driver.get("http://www.hexbytes.com");
               WebElement webelement = driver.findElement(By.id("container"));
               //matching single element with attribute value=container
               System.out.println("The id value is: " + webelement.getAttribute("id"));
               System.out.println("The tag name is: " + webelement.getTagName());
           }
           finally {
               driver.close();
           }
       }//end of xpathDemo2 

public void xpathDemo3() {
       WebDriver driver = new FirefoxDriver();
       try{
           driver.get("http://www.hexbytes.com");
          //find first child node of div element with attribute=container
          List<WebElement> elements = driver.findElements(By.xpath("//div[@id='container']/*[1]"));
          System.out.println("Test1 number of elements: " + elements.size()); 

          for(WebElement ele : elements){
              System.out.println(ele.getTagName());
              System.out.println(ele.getAttribute("id"));
              System.out.println("");
              System.out.println("");
          }
   }
   finally {
       driver.close();
   }
 }//end of xpathDemo3
 }
6
user2061466

Vos questions:

Q 1.) Je voudrais savoir pourquoi il retourne tous les textes qui suivent la div?
Cela ne devrait pas et je pense que non. Il retourne tous les div avec une valeur d'attribut 'id' égale à 'containter' (et tous les enfants de ceci). Mais vous imprimez les résultats avec ele.getText() où getText renverra tout le contenu texte de tous les enfants de votre résultat.

Obtenez le visible (c'est-à-dire non masqué par CSS) innerText de cet élément, y compris les sous-éléments, sans espace de début ou de fin.
Retour:
Le texte interne de cet élément.

Q 2.) comment dois-je modifier le code pour qu'il retourne simplement le premier ou les premiers nœuds qui suivent la note parent
Ce n'est pas vraiment clair ce que vous recherchez. Exemple:

<p1> <div/> </p1 <p2/> 

Le parent suivant du div est p2. Ce serait:

 //div[@id='container'][1]/parent::*/following-sibling::* 

ou plus court

 //div[@id='container'][1]/../following-sibling::* 

Si vous ne recherchez que la première extension, l'expression avec un "prédicat" (par exemple [1] - pour la première. Ou [position() &lt; 4] pour les trois premières)

Si vous cherchez le premier enfant du premier div:

//div[@id='container'][1]/*[1]

S'il n'y a qu'un seul div avec id et que vous recherchez le premier enfant:

   //div[@id='container']/*[1]

etc.

6
hr_117

Le XPath se transforme en ceci:

Obtenez-moi tous les éléments div qui ont un id égal à conteneur.

Quant à obtenir le premier etc, vous avez deux options.

Transformez-le en .findElement() - cela ne fera que renvoyer le premier pour vous de toute façon.

o

Pour le faire explicitement dans XPath, vous devriez regarder:

(//div[@id='container'])[1]

pour le premier, pour le second etc:

(//div[@id='container'])[2]

XPath a alors un indexeur spécial, appelé last, qui (vous l'aurez deviné) vous obtiendrait l'élément last trouvé:

(//div[@id='container'])[last()]

Il convient de mentionner que les indexeurs XPath partiront de 1 et non comme ils le font dans la plupart des langages de programmation.

Quant à l'obtention du "nœud" parent, eh bien, vous pouvez utiliser parent:

//div[@id='container']/parent::*

Cela obtiendrait le parent direct de div.

Vous pourriez alors aller plus loin et dire que je veux le premier * div * avec un id de container =, et je veux son parent:

(//div[@id='container'])[1]/parent::*

J'espère que cela pourra aider!

3
Arran

Au lieu de

css=#container

utilisation

css=div.container:nth-of-type(1),css=div.container:nth-of-type(2)
0
user3487861