2

テキストが含まれているすべてのノードを選択したいと思います。

この例では、外側のshouldBeIgnoredタグを選択しないでください。

<shouldBeIgnored>
    <span>
        the outer Span should be selected
    </span>
</shouldBeIgnored>

他のいくつかの投稿は、次のようなことを示唆しています//*/text()
ただし、これはFirefoxでは機能しません。

これは、問題を再現するための小さな単体テストです。

 public class XpathTest {
    final WebDriver webDriver   = new FirefoxDriver();

    @Test
    public void shouldNotSelectIgnoredTag() {

        this.webDriver.get("http://www.s2server.de/stackoverflow/11773593.html");

        System.out.println(this.webDriver.getPageSource());

        final List<WebElement> elements = this.webDriver.findElements(By.xpath("//*/text()"));

        for (final WebElement webElement : elements) {
            assertEquals("span", webElement.getTagName());
        }
    }

    @After
    public void tearDown() {
        this.webDriver.quit();
    }
 }
4

5 に答える 5

7

テキストを含むすべてのノードを選択する場合は、次を使用できます。

//*[text()]

上記のxpathは、テキストを含む要素を検索します。text()現在のノードにテキストがあるかどうかを判断するために使用される関数に注意してください。

あなたの場合、<span>テキストが含まれているのでタグを選択します。

于 2012-08-02T09:36:41.213 に答える
1

これが機能しない理由はわかりません(Javaによる)

text = driver.findElement(By.xpath("//span")).getText()

奇妙な場合に機能しない場合:

text = driver.findElement(By.xpath("//span")).getAttribute("innerHTML")
于 2012-08-02T09:05:40.480 に答える
1

最後に、xpathでそれを行う方法がないことを発見しました(XPathstext()はノードのinnerTextも選択するため)。回避策として、XPathによって選択された、テキストを含むすべての要素を返すJavaスクリプトを挿入する必要があります。

このような:

public class XpathTest
{
    //@formatter:off
    final static String JS_SCRIPT_GET_TEXT  =  "function trim(str) {                                                       " +                                                                                                                                             
                                               "    return str.replace(/^\s+|\s+$/g,'');            " +                                                                                                                                             
                                               "}                                                                          " +                                                                                                                                             
                                               "                                                                           " +                                                                                                                                             
                                               "function extractText(element) {                                            " +                                                                                                                                             
                                               "    var text = '';                                                         " +                                                                                                                                             
                                               "    for ( var i = 0; i < element.childNodes.length; i++) {                 " +                                                                                                                                             
                                               "        if (element.childNodes[i].nodeType === Node.TEXT_NODE) {           " +                                                                                                                                             
                                               "            nodeText = trim(element.childNodes[i].textContent);            " +                                                                                                                                             
                                               "                                                                           " +                                                                                                                                             
                                               "            if (nodeText) {                                                " +                                                                                                                                             
                                               "                text += element.childNodes[i].textContent + ' ';           " +                                                                                                                                             
                                               "            }                                                              " +                                                                                                                                             
                                               "        }                                                                  " +                                                                                                                                             
                                               "    }                                                                      " +                                                                                                                                             
                                               "                                                                           " +                                                                                                                                             
                                               "    return trim(text);                                                     " +                                                                                                                                             
                                               "}                                                                          " +                                                                                                                                             
                                               "                                                                           " +                                                                                                                                             
                                               "function selectElementsHavingTextByXPath(expression) {                     " +                                                                                                                                             
                                               "                                                                           " +                                                                                                                                             
                                               "    result = document.evaluate(\".\" + expression, document.body, null,    " +                                                                                                                                             
                                               "            XPathResult.ANY_TYPE, null);                                   " +                                                                                                                                             
                                               "                                                                           " +                                                                                                                                             
                                               "    var nodesWithText = new Array();                                       " +                                                                                                                                             
                                               "                                                                           " +                                                                                                                                             
                                               "    var node = result.iterateNext();                                       " +                                                                                                                                             
                                               "    while (node) {                                                         " +                                                                                                                                             
                                               "        if (extractText(node)) {                                           " +                                                                                                                                             
                                               "            nodesWithText.push(node)                                       " +                                                                                                                                             
                                               "        }                                                                  " +                                                                                                                                             
                                               "                                                                           " +                                                                                                                                             
                                               "        node = result.iterateNext();                                       " +                                                                                                                                             
                                               "    }                                                                      " +                                                                                                                                             
                                               "                                                                           " +                                                                                                                                             
                                               "    return nodesWithText;                                                  " +                                                                                                                                             
                                               "}                                                                          " +                                                                                                                                             
                                               "return selectElementsHavingTextByXPath(arguments[0]);";                                                                                                                                                                                    
    //@formatter:on

    final WebDriver     webDriver           = new FirefoxDriver();

    @Test
    public void shouldNotSelectIgnoredTag()
    {
        this.webDriver.get("http://www.s2server.de/stackoverflow/11773593.html");

        final List<WebElement> elements = (List<WebElement>) ((JavascriptExecutor) this.webDriver).executeScript(JS_SCRIPT_GET_TEXT, "//*");

        assertFalse(elements.isEmpty());

        for (final WebElement webElement : elements)
        {
            assertEquals("span", webElement.getTagName());
        }
    }

    @After
    public void tearDown()
    {
        this.webDriver.quit();
    }

}

例がテスト可能なUnitTestを変更しました。

于 2012-08-02T14:06:28.717 に答える
1

javascript関数を呼び出すことができます。これにより、テキストノードが返されます。

function GetTextNodes(){    
var lastNodes = new Array();
    $("*").each(function(){
      if($(this).children().length == 0)
        lastNodes.push($(this));
    });
    return lastNodes;
}

Selenium WebDriverコード:

IJavaScriptExecutor jscript = driver as IJavaScriptExecutor;
List<IWebElement> listTextNodes = jscript.ExecuteScript("return GetTextNodes();");

参考までに:何かのようなものがあなたのために働くかもしれません。

于 2012-08-02T09:02:10.500 に答える
1

テキストノードの検索に関する問題の1つは、空の文字列でさえ有効なテキストノードと見なされることです(例:

<tag1><tag2/></tag1>

テキストノードはありませんが

<tag1>  <tag2/>    </tag1> 

2つのテキストノードがあり、1つは2つのスペース、もう1つは4つのスペース)

空でないテキストを持つテキストノードのみが必要な場合は、次の1つの方法があります。

//text()[string-length(normalize-space(.))>0]

または、親要素を取得します

//*[text()[string-length(normalize-space(.))>0]]
于 2015-01-09T13:58:43.640 に答える