selenium:选择页面上包含任何文本的所有元素

jdgnovmf  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(287)

我想选择页面上包含任何文本的所有元素。
只有实际包含文本本身的元素,而不是仅在子元素中包含文本的父元素。
此xpath匹配包含任何非空文本的元素

//*[text() != ""]

然而这

List<WebElement> list = driver.findElements(By.xpath("//*[text() != '']"));

提供包含文本本身或其子元素的所有元素的列表。
我可以重复这个 list 使用类似的方法将实际包含文本的元素放入 real 列表

List<WebElement> real = new ArrayList<>();
for(WebElement element : list){
    js = (JavascriptExecutor)driver;
    String text = js.executeScript("""
    return jQuery(arguments[0]).contents().filter(function() {
        return this.nodeType == Node.TEXT_NODE;
    }).text();
    """, element);
    if(text.length()>0){
        real.add(element);
}

但这是一种变通办法。
我想知道是否有一种方法可以直接或更优雅地获取包含任何文本的元素列表?

hfwmuf9z

hfwmuf9z1#

List<WebElement> elementsWithOwnText = new ArrayList<WebElement>();
    List<WebElement> allElements = driver.findElements(By.xpath("//*"));
    for (WebElement element: allElements) {
        List<WebElement> childElements = element.findElements(By.xpath(".//*"));
        String text = element.getText();
        if (childElements.size() == 0 && text.lenght() > 0) {
            elementsWithOwnText.add(element);
        }
    }

意识到 org.openqa.selenium.StaleElementReferenceException . 循环时 allElements 其中任何一个都不能再附加到页面文档(动态内容f.e.)。

j9per5c4

j9per5c42#

您可以尝试这样做:它选择带有文本的所有叶元素。

List<WebElement> list = driver.findElements(By.xpath("//*[not(child::*) and text()]"));
        for (WebElement webElement : list)
            System.out.println(webElement.getText());

相关问题