2012-10-24 171 views
24

我試圖讀取例如字符串1000了一個隱藏的<div>這樣的:如何使用Selenium WebDriver從隱藏元素中讀取文本?

<div id="hidden_div" style="visibility:hidden">1000</div> 

我知道WebElement.getText()沒有在硒2(webdriver的)隱藏要素工作,所以我搜索解決方案(like this one),顯然下面的代碼應該工作:

WebElement hiddenDiv = seleniumDriver.findElement(By.id("hidden_div")); 
String n = hiddenDiv.getText(); // does not work (returns "" as expected) 
String script = "return arguments[0].innerText"; 
n = (String) ((JavascriptExecutor) driver).executeScript(script, hiddenDiv); 

但它不爲我工作,可變n最終總是爲null。我究竟做錯了什麼?

回答

19

編輯:哦,這個工程。

String script = "return document.getElementById('hidden_div').innerHTML"; 

在firefox中。

這樣做。

String script = "return arguments[0].innerHTML"; 

我也試過,但它似乎不能用純Javascript工作。如上所述,使用 Jquery啓動瀏覽器。 How to use JQuery in Selenium?並使用腳本的以下代碼。

String script = "return $('#hidden_div').text();"; 

This Works。

+6

根據硒webdriver的常見問題解答:「:爲什麼不可以隱藏元素交互 ?答:因爲用戶無法在一個隱藏的元素中讀取文本,webdriver的將不允許訪問它,以及 然而,有可能使用Javascript執行能力直接從元素調用getText ...「 我最終也使用jQuery,因爲我的應用程序構建在jQuery上。不知道我是否同意FAQ中表達的這一決定背後的推理,但至少有一種方法可以隱藏文本。 –

+1

在較舊的Selenium版本(至少2.25)中,可以獲取隱藏元素的文本。在新版本(至少2.39)中,如果元素不可見,'getText()'返回一個空字符串。這兩種情況都與隱藏元素交互時的行爲不同。如果你嘗試執行'click()'或'sendKeys(...)',你會得到一個ElementNotVisibleException異常。 –

+2

僅爲了完整:WebDriver FAQ可以在https://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions中閱讀。 – sleske

0

我遇到了閱讀不可見元素的相同問題,但我想要回WebElement對象做進一步的解析(不僅僅是它的文本)。

這段代碼滿足了我的要求。

(WebElement) ((JavascriptExecutor) driver).executeScript(
    "arguments[0].style[\"display\"] = \"block\";"+ 
    "arguments[0].style[\"visibility\"] = \"visible\";"+ 
    "return arguments[0];", 
element); 
6

基於已經給出的答案的工作,我創建了這個實用方法(Java)。也許這對別人有幫助。

public static String getText(WebDriver driver, WebElement element){ 
    return (String) ((JavascriptExecutor) driver).executeScript(
     "return jQuery(arguments[0]).text();", element); 
} 
  • 我用jQuery's text()只提取文本節點。 innerHTML也會給你HTML標籤。
  • 我在noConflict
  • 情況下使用jQuery而不是$不處理這個元素,或者它的知名度
37

可能是有用的:

在某些情況下,人們可能會發現它很有用獲取隱藏文本,通過調用element.attribute('attributeName')可以從元素的textContentinnerTextinnerHTML屬性中檢索到該文本。

element.getAttribute("textContent")爲我工作。

查看更多詳細信息那裏 - > http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-selenium-webdriver/

+3

有禍,這就是答案!我正要在上面接受的答案中做javascript,但試過這個,並且完美地工作。更乾淨。 –

+1

element.getAttribute(「textContent」)。trim()正好給了我需要的東西。 – Bjinse

+0

很好的答案! innerText比textContent更好,因爲innerText將多個換行符和空格合併到一個空格中,而textContent則沒有。 – frodo2975

0

我是比較新的硒(和編程作爲一個整體),但我只是分享,對我工作的解決方案。

硒2未設計用於處理與隱藏能見度直接元素。例如,您將無法找到它的ID或CSS選擇器。

我有一個機器人,我有一個HTML表格有很多itens的情況,並點擊它們時的時候,用隱藏的可視性下拉公開。甚至在另一個框架。

這是一個具體的情況,但我找不到任何解決方案,所以我選擇了這個(不好)之一,但是,該作品真的一致,儘管醜陋的代碼。

首先,你應該switchToDesiredFrame(); - 在這裏輸入您driver.switchTo.frame()邏輯。

比:

WebElement table = driver.findElements(By.tagName("table")).get(index_1); 

List<WebElement> dataCells= table .findElements(By.tagName("td")); 

WebElement spceificDataCellIWanted = dataCells.get(index_2); 

System.out.println(spceificDataCellIWanted.getText()); 

的dataCells字面上的<td>標籤,併成爲他們WebElements在列表中,就像<td>的是下<table>‘容器’列表中的元素。

它的工作在Chrome和Firefox給我,但不能在任何無頭的瀏覽器,不知道確切原因。如果你們遇到類似的情況,並有一個更優雅的解決方案(可能不難找到它),請分享!

0

試試這個

 WebElement hiddenElement = GET YOUR ELEMENT HERE; 
     String hiddenContent= hiddenElement.getAttribute("textContent"); 
-1
type='hidden' 

當我們遇到上述任何情況下,我們應該做的第一件事就是去嘗試任何行動不使該網頁上的任何變化,像拖等,然後做一個框架開關。

嘗試getText(),如果還是不行,請嘗試上面作爲第二選擇。

相關問題