2015-07-03 68 views
1

今天我問this問題,但錯誤地,我沒有指定它的範圍,這是用於Selenium Webdriver。硒WebDriver - Xpath選擇跨度和排除子節點

所以我有這個TD:

<td> 
<span id="PartComment"> 
REMAN WATER PUMP 
<i>w/2.05" DIAMETER THERMOSTAT OUTLET - SUPPLIED w/PULLEY 
</i> 
</span> 
</td> 

而且我想一個XPath找到只有文本再製造水泵後,它轉換爲字符串。

driver.findElement(By.xpath("//span[@id='lblPartComment']/text()")); 

但問題是,因爲我只定位文本,而不是一個DOM對象,webdriver的將不能夠把它當作這樣的:

Exception in thread "main" org.openqa.selenium.InvalidSelectorException: The given selector //span[@id='lblPartComment']/text() is either invalid or does not result in a WebElement. The following error occurred: InvalidSelectorError: The result of the xpath expression "//span[@id='lblPartComment']/text()" is: [object Text]. It should be an element. 

能否請您提供該xpath的替代方案?一個定位我上面提到的文字,並排除i內的文字?

另外,related

感謝

+0

我可以提供給你定位器,但你能告訴我:文本「REMAN WATER PUMP」正在改變嗎?我的意思是,你是否想要針對不同的測試案例進行驗證?由於XPath語法僅用於通過此部分文本查找範圍。 –

+0

我想定位跨度並在跨度內提取文本,並排除可能出現的i或任何其他子節點中的任何文本。是的,重新水泵文本可能會改變,但這是不相關的,因爲我正在定位跨度。另外,閱讀我發現// span [@ id ='PartComment']/[not(self :: i)]可以工作,但是這會不斷地將文本添加到其他子節點中,所以它不起作用爲了我。 所以基本上我需要的是一種方法,我可以在xpath中使用not函數來排除i節點(至少現在是這樣) – zuri

回答

1

您可以使用下面的代碼:

var firstText = this.Driver.FindElement(By.XPath("//span[@id='lblPartComment']")).Text; 
var firstChildText = this.Driver.FindElement(By.XPath("//span[@id='lblPartComment']/i")).Text; 
firstText = firstText.Replace(firstChildText, string.Empty); 

找到雙方父母和子女元素,得到他們的文本,然後用空字符串代替孩子的文本。 :)

+0

這是java嗎? :) – zuri

+0

這是C#,但Java的代碼應該是相同的,這個想法很重要。 :) –

+0

我在翻譯代碼時還不流利,你能把它翻譯成java嗎? @Anton Angelov – zuri

0

你可以這樣做。從this

JavascriptExecutor js = (JavascriptExecutor) driver; 
    String text = (String) js.executeScript("var parent = arguments[0];" 
      + "var child = parent.firstChild;" 
      + "var ret = \"\";" 
      + "while(child) {" 
      + " if (child.nodeType === Node.TEXT_NODE)" 
      + "  ret += child.textContent;" 
      + " child = child.nextSibling;" 
      + "}" 
      + "return ret;", driver.findElement(By.id("PartComment")));