我想选择页面上包含任何文本的所有元素。
只有实际包含文本本身的元素,而不是仅在子元素中包含文本的父元素。
此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);
}
但这是一种变通办法。
我想知道是否有一种方法可以直接或更优雅地获取包含任何文本的元素列表?
2条答案
按热度按时间hfwmuf9z1#
意识到
org.openqa.selenium.StaleElementReferenceException
. 循环时allElements
其中任何一个都不能再附加到页面文档(动态内容f.e.)。j9per5c42#
您可以尝试这样做:它选择带有文本的所有叶元素。