java - 选择 webdriver 中包含文本的任何元素
问题描述
我正在寻找使用 webdriver 实现一般本地化测试,我的想法是:
- 选择所有包含文本的元素
- 使用 java 语言识别库来验证文本是否为某种特定语言
我查找了使用文本选择元素的各种方法,但记录的所有内容似乎都显示了使用 contains() 或 text() 使用特定文本进行定位的方法
我认为以下方法会起作用:
//*[contains(text(), '')]
但这会选择所有内容,无论是否有文本。它还选择标题中的元素。我想选择页面上的所有可见文本,提取该文本并将其逐个元素地传递给语言识别库。
解决方案
你可以使用这个 XPath
//*[text() != ""]
这将为您提供所有具有非空文本的元素。
以便
List<WebElement> list = driver.findElements(By.xpath("//*[text() != '']"));
将为您提供包含文本的页面上所有 Web 元素的列表。
UPD
如果您希望仅获取包含文本本身的元素,则可以仅通过以下代码排除在其子项中包含文本的元素:
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);
}
推荐阅读
- angular - Angular 6 视图未更新,即使使用 ChangeDetectorRef、ngZone 和 requestAnimationFrame
- variables - Lua:检查局部或全局变量
- runtime-error - 无法获取管理权限。运行时错误:无法执行命令 chcp
- ruby-on-rails - 下划线在 ruby on rails 中的 axlsx 中不起作用
- python - 如何将 MultiIndex 数据框列与简单数据框匹配并相乘?
- javascript - NodeJS res.on() 没有被触发。res.on() 不是函数
- android - 如何从 SQLite 存储和检索最近 30 天的数据?
- modeling - 中国古典政治秩序愿景的程序建模
- javascript - 使用 ecmascript 6 将 javascript 文件导入另一个文件的语法是什么?
- javascript - typescript 文件在哪里以及如何成为我项目中的 JS 文件?