web-dev-qa-db-ja.com

xpathによるWebdriver findElements

1)xPathでfindElementsがどのように機能するかを示すチュートリアルを行っています。属性<div>を含むid=container要素に続くすべてのテキストを返す理由を知りたいのですが。

xpathのコード:By.xpath("//div[@id='container']

2)親ノートに続く最初または最初のいくつかのノードを返すようにコードを変更するにはどうすればよいですか。 「ホーム」のような最初のノード、ホーム、手動テスト、自動化テストのような最初のいくつかのノード。

あなたのアドバイスと助けをありがとう!

このチュートリアルのコードフラグメントは次のとおりです。

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

あなたの質問:

Q 1.)divに続くすべてのテキストを返す理由を知りたいのですが?
それはすべきではなく、私はそうは思わないでしょう。 'id'属性値が 'containter'(およびこの子)と等しいすべてのdivを返します。しかし、ele.getText()を使用して結果を出力しています。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つのエクステントのみを検索する場合は、「述語」を含む式(たとえば、最初の1つは_[1]_-または最初の3つは[position() &lt; 4]

最初のdivの最初の子を探している場合:

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

Idを持つdivが1つしかない場合、最初の子を探します。

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

等々。

6
hr_117

XPathは次のようになります。

id(= /// =)equaltocontainerを持つすべてのdiv要素を取得する。

最初のものなどを取得するには、2つのオプションがあります。

それを.findElement()に変えます-これはとにかく最初のものを返すだけです。

または

XPathでこれを明示的に行うには、次のようにします。

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

最初のもの、2番目のものなど:

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

次に、XPathにはlastと呼ばれる特別なインデクサーがあり、これにより(予想通り)last要素が見つかります。

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

XPathインデクサーは、ではなく1から始まることは、ほとんどのプログラミング言語の場合と同様です。

親の「ノード」の取得に関しては、parentを使用できます。

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

divの直接の親を取得します。

次に、さらに進んで、first*div*のIDがcontainer、そして私はhis親が欲しい:

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

お役に立てば幸いです。

3
Arran

の代わりに

css=#container

使用する

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