【问题标题】:select any element that has text in webdriver选择 webdriver 中包含文本的任何元素
【发布时间】:2021-10-03 01:14:16
【问题描述】:

我正在寻找使用 webdriver 实现通用本地化测试,我的想法是:

  1. 选择所有包含文本的元素
  2. 使用 java 语言识别库来验证文本是否为某种特定语言

我查找了使用文本选择元素的各种方法,但所有记录的内容似乎都显示了使用 contains() 或 text() 使用特定文本进行定位的方法

我认为以下方法会起作用:

//*[contains(text(), '')]

但这会选择所有内容,无论是否有文本。它还选择标题中的元素。我想选择页面上所有可见的文本,提取该文本并逐个元素地通过语言识别库。

【问题讨论】:

    标签: java text localization webdriver


    【解决方案1】:

    你可以使用这个 XPath

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

    这将为您提供所有带有非空文本的元素。
    这样

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

    将为您提供包含文本的页面上所有网络元素的列表。
    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);
    }
    

    最终的元素列表将在real 列表中。
    这个想法来自here。根据this语法从Python翻译成Java

    【讨论】:

    • 它比我的要好,但从检查来看,它仍然击中了标题、标题和标题中的所有样式元素。有没有办法限制身体?但是受到您的启发,我尝试了 //body//*[text() != ""] 并且成功了
    • 那么,现在您找到了您所寻找的或仍想改进它以仅获取包含文本本身的元素,而不在其子节点中包含文本?
    • 是的,我宁愿获得带有文本本身的元素
    • 我没有找到比这更好的解决方案。请查看更新后的答案
    • 我明白了,谢谢。我已经为你投票了,所以不能再这样做了?
    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多