How do i get the text of a nested element in HTML for automation using Selenium or Protractor?(如何使用 Selenium 或 Protractor 获取 HTML 中嵌套元素的文本以实现自动化?)
问题描述
我有以下 HTML 代码.我需要控制台日志或仅打印 desc
类文本 - 打印此"而不是量角器或 selenium 中的 spell
类文本.
I have below HTML code with me. I need to console log or print only the desc
class text - "Print this" and not the spell
class text in protractor or selenium.
<span class="desc">
Print this
<a class="new-link" href="#">
<span class="spell">And not this</span>
</a>
</span>
我尝试 getText()
但它使用以下代码打印完整的语句 -
I tried to getText()
but it prints the complete statement with below code -
打印这个而不是这个
在 Protractor 中使用 Javascript:
In Protractor using Javascript:
element(by.css('.desc')).getText().then(function(text){
console.log(text);
});
在 Selenium 中使用 Java:
In Selenium using Java:
System.out.println(driver.findElement(by.xpath('//*[@class=".desc"]')).getText());
如何只打印文本的第一部分(即打印此")?
How do i print the first part of the text only(i.e., "Print this")?
任何建议或帮助将不胜感激?谢谢.
Any suggestions or help will be appreciated? Thanks.
推荐答案
ElementFinder.getText()
在元素上调用 innerHTML
并删除前导和尾随空格,但是 innerHTML
还包括任何嵌套级别的所有子元素.DOM 中没有特殊属性只能获取第一级文本,但可以自己实现.DOM 中的文本也是一个节点,存储在 DOM 树中,与任何标签元素一样,只是具有不同的类型和属性集.我们可以通过 Element.childNodes
属性获取所有类型元素的第一级子元素,然后遍历它们并只保留文本节点,然后连接它们的内容并返回结果.
ElementFinder.getText()
calls innerHTML
on the element and removes leading and trailing whitespaces, but innerHTML
also includes all child elements of any level of nesting. There is no special property in DOM to get only first level text, but it is possible to implement by yourself. Text in DOM is also a node and is stored in DOM tree, the same way as any tag element, it just has different type and set of properties. We can get first level children of the element of all the types with the property Element.childNodes
, then iterate over them and keep only the text nodes, then concatenate their content and return the result.
在 Protractor 中,我决定在 ElementFinder
的原型中添加一个自定义方法以使其易于使用,因此任何 Protractor 元素都可以使用它.将此扩展代码放置在何处取决于您,但我建议您在测试之前将其包含在某处,也许在 protractor.conf.js 中.
In Protractor I've decided to add a custom method to the prototype of ElementFinder
to make it easy to use, so any Protractor element would have it. It's up to you where to place this extension code, but I'd suggest to include it somewhere before your tests, maybe in 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
变量的值进行解析.使用方法:
This method will return a Promise, which resolves with a value of text
variable. How to use it:
var el = $('.desc');
expect(el.getTextContent()).toContain('Print this');
// or
el.getTextContent().then(function (textContent) {
console.log(textContent); // 'Print this'
});
这篇关于如何使用 Selenium 或 Protractor 获取 HTML 中嵌套元素的文本以实现自动化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何使用 Selenium 或 Protractor 获取 HTML 中嵌套元素的文本以实现自动化?
基础教程推荐
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- 降序排序:Java Map 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01