如何使用Selenium或Protractor获取HTML中嵌套元素的文本以实现自动化?

我跟下面有HTML代码。 我需要控制日志或仅打印desc类文本 – “打印此”而不是量角器或selenium中的spell类文本。

  Print this  And not this   

我试着getText()但是它用下面的代码打印完整的语句 –

打印此而不是这个

在使用Javascript的Protractor中:

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

在Selenium中使用Java:

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

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

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

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' }); 

我使用Michael的解决方案并嵌入到我的测试规范中而不调用该函数。 如果需要重复使用它作为单独的function仍然会更好。 但是,如果您需要内联解决方案,请按以下步骤操作 –

 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 }); }); 

希望能帮助到你。