Javascript 如何在HTML中获取嵌套元素的文本,以便使用Selenium或量角器实现自动化?
我有下面的HTML代码。我只需要控制台记录或打印Javascript 如何在HTML中获取嵌套元素的文本,以便使用Selenium或量角器实现自动化?,javascript,java,selenium,dom,protractor,Javascript,Java,Selenium,Dom,Protractor,我有下面的HTML代码。我只需要控制台记录或打印desc类文本-“打印此”,而不需要在量角器或selenium中打印拼写类文本 <span class="desc"> Print this <a class="new-link" href="#"> <span class="spell">And not this</span> </a> </span> 在使用Java的Selenium中:
desc
类文本-“打印此”,而不需要在量角器或selenium中打印拼写
类文本
<span class="desc">
Print this
<a class="new-link" href="#">
<span class="spell">And not this</span>
</a>
</span>
在使用Java的Selenium中:
System.out.println(driver.findElement(by.xpath('//*[@class=".desc"]')).getText());
如何仅打印文本的第一部分(即“打印此文件”)
如有任何建议或帮助,将不胜感激?谢谢。
ElementFinder.getText()
调用元素上的innerHTML
,并删除前导和尾随空格,但innerHTML
还包括任何嵌套级别的所有子元素。DOM中没有只获取一级文本的特殊属性,但可以自己实现。DOM中的文本也是一个节点,存储在DOM树中,与任何标记元素的方式相同,它只是具有不同的类型和属性集。我们可以使用属性element.childNodes
获取所有类型的元素的第一级子元素,然后迭代它们并仅保留文本节点,然后连接它们的内容并返回结果
在“量角器”中,我决定在ElementFinder
的原型中添加一个自定义方法,使其易于使用,这样任何量角器元素都可以使用它。由您决定将此扩展代码放在何处,但我建议您在测试之前将其包含在某个地方,可能是在dragrator.conf.js中
我使用了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
});
});
it(“获取文本的第一部分”,函数(){
browser.executeScript(函数(){
var el=参数[0],text='';
for(var i=0,l=el.childNodes.length;i
希望有帮助。期望值在
executeScript
中起作用吗?我不确定,但这是一个完全不同的环境-在executeScript
中发生的事情在浏览器中执行,而不是在测试文件中。对,Michael。已更新代码以更正此问题。谢谢:)
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
};
var el = $('.desc');
expect(el.getTextContent()).toContain('Print this');
// or
el.getTextContent().then(function (textContent) {
console.log(textContent); // 'Print this'
});
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
});
});