Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在HTML中获取嵌套元素的文本,以便使用Selenium或量角器实现自动化?_Javascript_Java_Selenium_Dom_Protractor - Fatal编程技术网

Javascript 如何在HTML中获取嵌套元素的文本,以便使用Selenium或量角器实现自动化?

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中:

我有下面的HTML代码。我只需要控制台记录或打印
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
    });
});