2016-11-17 2 views
0

Also, ein WebElement in Selenium, versuche ich, alle seine direkten Kinder von XPath einschließlich Textknoten zu bekommen. Ich habe bereits den XPath "*" ausprobiert, der funktioniert, gibt mir aber keinen Textknoten (falls vorhanden). Laut XPaths Dokumentation habe ich dann viele Dinge ausprobiert:Selen: InvalidSelectorException mit XPath Kind :: node()

  • "child :: node()" gibt mir InvalidSelectorException.
  • Versucht, alle Knoten mit "*" zu erhalten und dann versuchen, alle Textknoten mit "text()" zu erhalten: gibt mir InvalidSelectorException für die Abfrage "text()".
  • Ich habe diese XPaths mit der XPathHelper-Erweiterung auf Chrome versucht und es funktioniert wie geplant, aber es scheint nicht mit Selenium zu funktionieren (Chrome WebDriver und PhantomJS).

    Dies ist meine Schleife, die ich sollte gedacht arbeiten:

    for(WebElement child : node.findElements(new By.ByXPath("child::node()"))) { 
        //Do something with child 
    } 
    

    Wo könnte das Problem sein?

    Antwort

    0

    Das ist was ich benutze.

    public String getHiddenText(WebDriver driver, WebElement aWebElement) { 
        return (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].textContent;", aWebElement); 
    } 
    

    Adressierung crawljax Kommentar,

    public String getHiddenText(EmbeddedBrowser browser, WebElement aWebElement) { 
        WebDriver driver = browser.getDriver(); 
        return (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].textContent;", aWebElement); 
    } 
    

    finde ich, dass der beste Weg, ein neues Instrument zu lernen, um seine github repository zu gehen und die automatisierten Tests für Beispiele suchen, wie es zu benutzen. Sag es einfach. :-)

    +0

    @Faterou Textknoten können ein Schmerz sein. Die Selenium getText() Methode versucht dich davon abzuschirmen, aber es funktioniert nicht in allen Fällen. Meine Methode heißt getHiddenText, weil die Methode selenium getText() keinen Text zurückgibt, wenn das Element ausgeblendet ist. Aber es wird komplexen Textknotentext zurückgeben, egal ob versteckt oder nicht. Ein Vorbehalt, es werden Nicht-ASCII-Zeichen zurückgegeben, falls vorhanden, daher füge ich oft .replaceAll hinzu ("[^ \\ x20 - \\ x7e]", ""); zum Anruf. – MikeJRamsey56

    +0

    Das funktioniert wahrscheinlich gut, danke dafür! Das einzige Problem ist, dass ich Selenium über Crawljax benutze und keinen direkten Zugriff auf den Treiber habe. Ich habe Zugriff über die Schnittstelle EmbeddedBrowser, die eine Funktion namens executeJavaScript (String) hat, so dass ich kein Argument setzen kann. Ich weiß, dass ich das in der Frage nicht angegeben habe, also denke ich, dass das aufgelöst wird ... – Faterou

    +0

    Außerdem gibt TextContent den Textwert aller Nachkommen zurück und ich will nur das direkte Kind. – Faterou