getText () элемента вне любого тега без использования text () в xpath - PullRequest
0 голосов
/ 05 апреля 2019

Поэтому мне нужно получить определенный текст на веб-странице, которая содержит 200+ строк текста вне тега или после тега span.

Мне удалось получить точный xpath,

By outputVersion = By.xpath("//*[@class='output']/text()[contains(.,'TEXT THAT I NEED')]");
By outputVersion = By.xpath("//*[@class='timestamp']/following-sibling::text()[contains(.,'TEXT THAT I NEED')]");

Хотя у него есть text() на xpath, который я придумал и использую это, у меня есть org.openqa.selenium.InvalidSelectorException, когда я использую getText (), getAttribute ("value") и getAttribute ("innerText)").

Фактические элементы страницы выглядят так:

<code><pre class="output">
    <span class="timestamp">time</span>
    "TEXT"

    <span class="timestamp">time</span>
    "TEXT"
    .
    .
    .
    .
    .
    <span class="timestamp">time</span>
    "TEXT THAT I NEED"  
    .
    .
    .
    .
    .

С этим мне нужно придумать xpath, исключая text ().

Обратите внимание, что <span class="timestamp">time</span> - это более 200+ строк с разными текстами, которые время от времени меняются.Кроме того, текст, который мне нужен, не находится в фиксированной строке, поэтому я зависим от contains

Ответы [ 3 ]

1 голос
/ 05 апреля 2019

Вот способ получить только родительский текст.

Реализация Java:

public String get_text_from_parent_by_postion(WebDriver driver, WebElement element, int textPosition) {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    return (String) js.executeScript("var parent = arguments[0];var textPosition = arguments[1]; var txtPosition = 0; var child = parent.firstChild; var textValue=''; while(child) { if (child.nodeType === 3){ if (txtPosition===(textPosition-1)){ textValue = child.textContent; break;}}else{txtPosition+=1;}child = child.nextSibling; } return textValue;", element, textPosition);
}

Это способ вызова этого метода в вашем случае -

WebElement element = driver.findElement(By.xpath("//p[@class='output']"));
get_text_from_parent_by_postion(driver, element,3)

Реализация Python:

        def get_text_from_parent_by_postion(element, textPosition=1):
    return driver.execute_script(
        """ var parent = arguments[0];
            var textPosition = arguments[1];
            var txtPosition = 0;
            var child = parent.firstChild;
            var textValue="";
            while(child) {
              if (child.nodeType === 3){                        
                if (txtPosition===(textPosition-1)){
                  textValue = child.textContent;                
                  break;
                }}else{txtPosition+=1;}
              child = child.nextSibling;
            }
        return textValue;""",
        element, textPosition).strip()
0 голосов
/ 09 апреля 2019

Вы можете оценить xpath, используя выполнение JavaScript, см. Код ниже:

JavascriptExecutor js = (JavascriptExecutor)driver;
Object textYouWant= js.executeScript("var value = document.evaluate(\"//*[@class='timestamp']/following-sibling::text()[contains(.,'TEXT THAT I NEED')]\",document, null, XPathResult.STRING_TYPE, null ); return value.stringValue;");
System.out.println(textYouWant.toString().trim());

Для получения более подробной информации относительно evaluate() см. this

0 голосов
/ 09 апреля 2019
"return document.evaluate(\"//*[@class='timestamp']/following-sibling::text()[contains(.,'TEXT THAT I NEED')]\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);"

Вы можете использовать свой Xpath, попробуйте передать его JavascriptExecutor, он будет выглядеть так:

public String yourMethodName(WebDriver webDriver, String yourText) {
        String script = String.format("return document.evaluate(\"//*[@class='timestamp']/following-sibling::text()[contains(.,'%s')]\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);", yourText);
        JavascriptExecutor js = (JavascriptExecutor) webDriver;
        return (String) js.executeScript(script);
}
...