7

1)我正在做一个教程来展示 findElements By xpath 是如何工作的。我想知道为什么它会返回<div>带有属性的元素后面的所有文本id=container

xpath的代码:By.xpath("//div[@id='container']

2)我应该如何修改代码,使其只返回父注释之后的第一个或前几个节点,例如第一个节点如“Home”,前几个节点如 Home、手动测试和自动化测试。

感谢您的建议和帮助!

这是本教程的代码片段:

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
 }
4

3 回答 3

6

你的问题:

Q 1.) 我想知道为什么它会返回 div 后面的所有文本?
它不应该,我认为不会。它返回所有 'id' 属性值等于 'container' 的 div(以及它的所有子级)。但是您使用ele.getText() Where getText 打印结果将返回结果的所有子项的所有文本内容。

获取此元素的可见(即未被 CSS 隐藏)innerText,包括子元素,没有任何前导或尾随空格。
返回:
此元素的 innerText。

Q 2.) 我应该如何修改代码以便它只返回父注释后面的第一个或前几个节点
这并不是很清楚你在寻找什么。例子:

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

div的父级以下是p2。这将是:

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

或更短

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

如果您只寻找第一个范围,则表达式带有“谓词”(例如[1]- 对于第一个。或[position() &lt; 4]前三个)

如果您正在寻找第一个 div 的第一个孩子:

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

如果只有一个 id 为 an 的 div,则您正在寻找第一个孩子:

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

等等。

于 2013-05-03T15:43:45.153 回答
3

XPath 变成这样:

获取所有id等于containerdiv元素。

至于获得第一个等,您有两个选择。

把它变成一个.findElement()- 无论如何这只会为你返回第一个。

或者

要在 XPath 中显式执行此操作,您需要查看:

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

对于第一个,对于第二个等:

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

然后 XPath 有一个特殊的索引器,称为last,它会(你猜对了)让你找到最后一个元素:

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

值得一提的是,XPath 索引器将从1而不是0开始,就像它们在大多数编程语言中所做的那样。

至于获取父“节点”,您可以使用parent

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

这将获得div的直接父级。

然后你可以更进一步说我想要第一个* div * 的 id 为container,我想要他的父母:

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

希望有帮助!

于 2013-05-03T14:47:53.863 回答
0

代替

css=#container

利用

css=div.container:nth-of-type(1),css=div.container:nth-of-type(2)
于 2014-04-03T08:24:50.243 回答