我下面有HTML代码。我需要控制台日志或仅打印desc类文本-“打印此内容”,而不打印spell量角器或selenium中的类文本。
desc
spell
<span class="desc"> Print this <a class="new-link" href="#"> <span class="spell">And not this</span> </a> </span>
我试图这样做,getText()但是它使用以下代码打印了完整的语句-
getText()
打印此而不是此
在使用Java的量角器中:
element(by.css('.desc')).getText().then(function(text){ console.log(text); });
在使用Java的Selenium中:
System.out.println(driver.findElement(by.xpath('//*[@class=".desc"]')).getText());
如何仅打印文本的第一部分(即“打印此”)?
任何建议或帮助将不胜感激?谢谢。
ElementFinder.getText()调用innerHTML元素并删除前导和尾随空格,但innerHTML还包括任何嵌套级别的所有子元素。DOM中没有特殊属性只能获取第一级文本,但是可以自己实现。DOM中的文本也是一个节点,并且以与任何标记元素相同的方式存储在DOM树中,只是具有不同的类型和属性集。我们可以使用属性获得所有类型元素的一级子级Element.childNodes,然后对其进行迭代并仅保留文本节点,然后连接其内容并返回结果。
ElementFinder.getText()
innerHTML
Element.childNodes
在Protractor中,我决定向的原型中添加自定义方法,ElementFinder以使其易于使用,因此任何Protractor元素都可以使用它。由您决定放置此扩展代码的位置,但是我建议您在测试之前将其包括在 protractor.conf.js中 。
ElementFinder
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变量value进行解析。如何使用它:
text
var el = $('.desc'); expect(el.getTextContent()).toContain('Print this'); // or el.getTextContent().then(function (textContent) { console.log(textContent); // 'Print this' });