2012-07-24 58 views
1

我的頁面中有以下HTML。Selenium Webdriver gettext()返回空字符串

<div dojoattachpoint="rowNode" class="dijitTreeRow dijitTreeRowSelected" wairole="presentation" dojoattachevent="onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick" role="presentation" title="" style="padding-left: 19px; "> 
    <img src="/runtime/explorer.sharedresources/javascript-1.7.22.268034/release/dojo/resources/blank.gif" alt="" dojoattachpoint="expandoNode" class="dijitTreeExpando dijitTreeExpandoLeaf" wairole="presentation" role="presentation"/> 
    <span dojoattachpoint="expandoNodeText" class="dijitExpandoText" wairole="presentation" role="presentation">*</span> 
    <span dojoattachpoint="contentNode" class="dijitTreeContent" wairole="presentation" role="presentation"> 
    <img src="/runtime/explorer.sharedresources/javascript-1.7.22.268034/release/dojo/resources/blank.gif" alt="" dojoattachpoint="iconNode" class="dijitIcon dijitTreeIcon criterionFolder" wairole="presentation" role="presentation"/> 
    <span dojoattachpoint="labelNode" class="dijitTreeLabel" wairole="treeitem" tabindex="-1" waistate="selected-false" dojoattachevent="onfocus:_onLabelFocus" role="treeitem" aria-selected="true">**My TEXT**</span> 
    </span> 
</div> 

這是正確標識元素的代碼。

List<WebElement> RowNodesList = elementPopup.findElements(By.xpath("//div[@dojoattachpoint =\"rowNode\"]"));  
    for(WebElement RowNode:RowNodesList) 
     { 
      System.out.println("Left Padding: " + RowNode.getAttribute("style"));     

      System.out.println("Is Row Node Displayed: " + RowNode.isDisplayed()); 

      WebElement labelNode = RowNode.findElement(By.xpath("//span[@dojoattachpoint=\"labelNode\"]")); 

      boolean IsNodeDisplayed = labelNode.isDisplayed(); 

      System.out.println("Is Label Node Displayed: " + IsNodeDisplayed); 

      String NodeLabel = (String) ((JavascriptExecutor) _driver).executeScript("return arguments[0].firstChild.nodeValue",labelNode); 
      System.out.println("Row label From javaScript: " + NodeLabel); 
      System.out.println("Row label: " + labelNode.getText()); 
      System.out.println("Row Class: " + labelNode.getAttribute("class")); 

     } 

這是從代碼生成的輸出。

Left Padding: PADDING-LEFT: 19px 
Is Row Node Displayed: true 
Is Label Node Displayed: false 
Row label From javaScript: undefined 
Row label: 
Row Class: dijitTreeLabel 

出於某種原因,由.getText()返回一個空字符串。有任何想法嗎? 在此先感謝。

編輯: 奇怪的是,labelNode.isdisplayed()返回false,即使它在頁面上可見。

編輯2:我已經編輯我的OP到上面,使問題更清楚。所以,我想要的文本駐留在標籤節點的SPAN標籤中,該標籤節點是RowNode的子節點。據說RowNode顯示,但標籤節點不是。我認爲這就是爲什麼LabelNode的.getText()返回空字符串的原因。

有沒有其他辦法可以讓我的文字?

編輯3:我想出了問題。這是xpath搜索字符串。 而不是

WebElement labelNode = RowNode.findElement(By.xpath("//span[@dojoattachpoint=\"labelNode\"]")); 

中的XPath需要改變,以

WebElement labelNode = RowNode.findElement(By.xpath(".//span[@dojoattachpoint=\"labelNode\"]")); 

我曾以爲,「//」會指示webdriver的當前上下文中的樣子。但顯然,它在整個身體內搜索(這不直觀),並返回找到的第一個被隱藏的元素。 添加「.//」指示它在當前上下文(RowNode)內進行搜索。

感謝大家的幫助。

+0

我試着用JavaScript來返回文本,但是如果有空字符串,它會返回「undefined」。 String NodeLabel = (String) ((JavascriptExecutor) _driver).executeScript("return arguments[0].firstChild.nodeValue",contentNode); \t \t \t System.out.println("Row label From javaScript: " + NodeLabel); Vic11 2012-07-24 19:46:30

+0

如果它返回undefined,那麼它找不到你的元素,並且可以肯定地說你的選擇器是錯誤的。 – 2012-07-24 20:42:14

+0

@RoddyoftheFrozenPeas,你是對的。 OP已更新。 – Vic11 2012-07-25 17:05:14

回答

-1

在你的System.out.println語句中,你使用'contentNode'而不是'labelNode'。這是一個錯誤,還是在代碼中的其他地方聲明?

在C#中,我用下面的正確抓取文字:

IWebElement labelNode = driver.FindElement(By.XPath("//span[@dojoattachpoint=\"labelNode\"]")); 
string labelNodeText = labelNode.Text; 
+0

對不起,這是一個錯字。我已更正了OP – Vic11 2012-07-24 17:31:43

-1

我想澄清一下,如果RowNode變量類型的webdriver的,你也必須調用正確的WebElement獲取文本。

嘗試使用以下代碼 -

WebElement labelNode = driver.findElement(By.xpath("//span[@dojoattachpoint='labelNode']")); 
    System.out.println("Row label: " + labelNode.getText()); 
    System.out.println("Row label: " + labelNode.getAttribute("class")); 

如果此變化後正在返回空字符串的getText()方法。這意味着此WebElement的文本不可見。您也可以使用implicitWait語句確保在嘗試訪問WebElement之前正確加載頁面。

WebDriver driver = new FirefoxDriver(); 
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

希望這可以幫助你。

您可以告訴我,當您在瀏覽器上打開頁面時,「我的文本」是否顯示在頁面上。如果它可見,則可以使用getText()方法獲取該值。如果沒有,那麼試試這個 -

String labelNodeText = (String) ((JavascriptExecutor) _driver).executeScript("return arguments[0].innerHTML",labelNode); 
+0

中的代碼。對不起,這是一個錯字。我已更正OP中的代碼。我正在等待頁面在完成此調用之前完全加載,並且該元素是可見的。 RowNode變量是父級webelement。 – Vic11 2012-07-24 17:29:23

+0

如果RowNode變量是父級WebElement,則使用我在答案中編輯的代碼。如上所述定義驅動程序並讓我知道會發生什麼? – 2012-07-25 01:03:28

+0

是的,我試過了。同樣的問題。我不認爲同步是一個問題。請參閱更新的OP。 – Vic11 2012-07-25 13:10:59

1

好,我能得到這個工作的唯一辦法就是用這個:

var textstring = driver.findElement(global[type](elements)).getAttribute('innerHTML').then(
    function(textstring) { 
     console.log(textstring); 
}) 

哪裏globaltype可以webdriver.By.id(),XPath或名稱。

webdriver.By.css也有效。