2015-09-09 142 views
3

我有以下HTML代碼與我。我需要控制檯日誌或打印desc類文本 - 「打印此」,而不是量角器或硒中的spell類文本。如何在HTML中使用Selenium或量角器獲取嵌套元素的文本?

<span class="desc"> 
Print this 
    <a class="new-link" href="#"> 
     <span class="spell">And not this</span> 
    </a> 
</span> 

我試圖getText()但它打印與下面的代碼的完整的陳述 -

打印而不是這個

在量角器使用Javascript:

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

在使用Java的Selenium中:

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

如何僅打印文本的第一部分(即「打印此」)?

任何建議或幫助將不勝感激?謝謝。

回答

3

ElementFinder.getText()在元素上調用innerHTML並刪除前導和尾隨空格,但innerHTML還包括任何級別的嵌套的所有子元素。 DOM中沒有特殊屬性只能獲得第一級文本,但可以自行實施。 DOM中的文本也是一個節點,存儲在DOM樹中,就像任何標籤元素一樣,它只是具有不同的類型和屬性集合。我們可以得到屬性爲Element.childNodes的所有類型元素的第一級子元素,然後迭代它們並僅保留文本節點,然後連接它們的內容並返回結果。

在量角器中,我決定添加一個自定義方法到ElementFinder的原型,使其易於使用,所以任何量角器元素都可以擁有它。這取決於你在哪裏放置這個擴展代碼,但我建議將它包括在測試前的某個位置,也許在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 
}; 

該方法將返回一個無極,其與text變量的值中來解決。如何使用它:

var el = $('.desc'); 

expect(el.getTextContent()).toContain('Print this'); 

// or 

el.getTextContent().then(function (textContent) { 
    console.log(textContent); // 'Print this' 
}); 
+0

很酷!這解決了這個問題。謝謝@邁克爾。 –

1

我用邁克爾的解決方案,並嵌入到我的測試規範,而無需調用該函數。如果需要重複使用,將它作爲單獨的函數使用仍然會更好。但是,如果您想要內聯解決方案,請按以下步驟操作 -

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

希望它有幫助。

+0

期望在'executeScript'裏面工作嗎?我不確定它,但它是一個完全不同的環境 - executeScript內部發生的事情在瀏覽器中執行,而不是在測試文件中執行。 –

+0

右邁克爾。更新了代碼以糾正此問題。謝謝 :) –

相關問題