【问题标题】:How do i get the text of a nested element in HTML for automation using Selenium or Protractor?如何使用 Selenium 或 Protractor 获取 HTML 中嵌套元素的文本以实现自动化?
【发布时间】:2015-12-05 09:57:40
【问题描述】:

我有以下 HTML 代码。我需要控制台日志或仅打印 desc 类文本 - “打印此”,而不是量角器或硒中的 spell 类文本。

<span class="desc">
Print this
    <a class="new-link" href="#">
        <span class="spell">And not this</span>
    </a>
</span>

我尝试getText(),但它使用以下代码打印了完整的语句 -

打印这个而不是这个

在 Protractor 中使用 Javascript:

element(by.css('.desc')).getText().then(function(text){
    console.log(text);
});

在 Selenium 中使用 Java:

System.out.println(driver.findElement(by.xpath('//*[@class=".desc"]')).getText());

如何仅打印文本的第一部分(即“打印此”)?

任何建议或帮助将不胜感激?谢谢。

【问题讨论】:

    标签: javascript java selenium dom protractor


    【解决方案1】:

    ElementFinder.getText() 在元素上调用innerHTML 并删除前导和尾随空格,但innerHTML 还包括任何嵌套级别的所有子元素。 DOM 中没有特殊属性只能获取第一级文本,但可以自己实现。 DOM 中的文本也是一个节点,存储在 DOM 树中,与任何标签元素一样,只是具有不同的类型和属性集。我们可以通过Element.childNodes属性获取所有类型元素的第一级子元素,然后遍历它们并只保留文本节点,然后连接它们的内容并返回结果。

    在 Protractor 中,我决定在 ElementFinder 的原型中添加一个自定义方法以使其易于使用,因此任何 Protractor 元素都可以使用它。将此扩展代码放置在哪里取决于您,但我建议您在测试之前将其包含在某个地方,也许在 protractor.conf.js 中。

    protractor.ElementFinder.prototype.getTextContent = function () {
        // inject script on the page
        return this.ptor_.executeScript(function () {
            // note: this is not a Protractor scope
    
            // current element
            var el = arguments[0];
            var text = '';
    
            for (var i = 0, l = el.childNodes.length; i < l; i++) {
                // get text only from text nodes
                if (el.childNodes[i].nodeType === Node.TEXT_NODE) {
                    text += el.childNodes[i].nodeValue;
                }
            }
    
            // if you want to exclude leading and trailing whitespace
            text = text.trim();
    
            return text; // the final result, Promise resolves with this value
    
        }, this.getWebElement()); // pass current element to script
    };
    

    此方法将返回一个 Promise,它使用 text 变量的值解析。使用方法:

    var el = $('.desc');
    
    expect(el.getTextContent()).toContain('Print this');
    
    // or 
    
    el.getTextContent().then(function (textContent) {
        console.log(textContent); // 'Print this'
    });
    

    【讨论】:

      【解决方案2】:

      我使用 Michael 的解决方案并嵌入到我的测试规范中而不调用该函数。如果需要重复使用,最好将其用作单独的功能。但是,如果您想要内联解决方案,请按照以下方法操作 -

      it("Get First part of text", function(){
          browser.executeScript(function () {
              var el = arguments[0], text = '';
              for (var i = 0, l = el.childNodes.length; i < l; i++)
                  if (el.childNodes[i].nodeType === Element.TEXT_NODE)
                      text += el.childNodes[i].nodeValue;
              return text.trim();
          },$('.desc').getWebElement()).then(function(text){
              //use expect statements with "text" here as needed
          });
      });
      

      希望对你有帮助。

      【讨论】:

      • 期望在executeScript 内部有效吗?我不确定,但这是一个完全不同的环境——executeScript 内部发生的事情在浏览器中执行,而不是在测试文件中。
      • 对,迈克尔。更新了代码以更正此问题。谢谢:)
      猜你喜欢
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 2019-07-06
      • 2022-12-12
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多