2013-06-27 105 views
1

我想使用Selenium的Xpath能力來找到一組元素。我已經在FireFox上使用FirePath來創建和測試我已經提出的Xpath,並且工作得很好,但是當我在Selenium的c#測試中使用Xpath時,沒有返回任何內容。Selenium Xpath不匹配項目

var MiElements = this._driver.FindElements(By.XPath("//div[@class='context-menu-item' and descendant::div[text()='Action Selected Jobs']]"));

和HTML看起來像這樣: - 任何人都可以請點我權利,我已經閱讀了網絡對我說,這個XPath是正確的一切。

感謝您提前一切。

+0

您是否嘗試過使用硒IDE(for firefox)爲您生成命令? – Izzy

回答

1

請張貼實際 HTML,所以我們可以簡單地「中拖放」到一個HTML文件,並嘗試一下自己,但我注意到,有在類名的末尾尾隨空間:

<div title="Actions Selected Jobs." class="context-menu-item " ..... 

所以迫使XPath來第一次的尾隨空格去掉:

var MiElements = this._driver.FindElements(By.XPath("//div[normalize-space(@class)='context-menu-item' and descendant::div[text()='Action Selected Jobs']]")); 
+0

抱歉,html是由客戶端上的服務器和javascripts動態生成的。 – ToxicBlotch

+0

Cheers Arran看過那個空間後,你已經突出顯示了我已經將空間添加到了我的Xpath中,並解決了它找不到元素的問題。然而,奇怪的是Firefox中的Firepath並不在意。 – ToxicBlotch

+2

@ToxicBlotch所有這一切,你可以考慮使用By.cssSelector(「div.context-menu-item [title ='Action Selected Jobs']」)'如果它符合你的要求(它與你有XPath有一點不同那裏)。如果你需要處理類,CSS選擇器(或者'By.className()')通常是要走的路。 –

0

也許這些元素需要加載你沒有考慮到時間,你去找他們時,他們還沒有「搜索」 。 更新我跳過關於這個問題的例子。請參閱Slanec的評論。

無論如何,Selenium建議儘可能避免通過xpath進行搜索,因爲速度更慢,更「脆弱」。 你可以找到你的元素是這樣的:

//see the method code below 
WebElement div = findDivByTitle("Action Selected Jobs"); 

//example of searching for one (first found) element 
if (div != null) { 
    WebElement myElement = div.findElement(By.className("context-menu-item")); 
} 

...... 

//example of searching for all the elements 
if (div != null) { 
    WebElement myElement = div.findElements(By.className("context-menu-item-inner")); 
} 

//try to wrap the code above in convenient method/s with expressive names 
//and separate it from test code 

...... 

WebElement findDivByTitle(final String divTitle) { 
    List<WebElement> foundDivs = this._driver.findElements(By.tagName("div")); 

    for (WebElement div : foundDivs) { 
     if (element.getAttribute("title").equals(divTitle)) { 
     return element; 
     } 
    } 
    return null; 
} 

這是近似的代碼(根據你的解釋),你應該使其更好地適應你的目的。同樣,請記住考慮加載時間,並將實用程序代碼與測試代碼分開。

希望它有幫助。

+0

對於一個XPath表達式(或在這種特殊情況下的單個CSS選擇器),這是很多代碼,沒有額外的好處(沒有處理您提到的異步加載問題)。如果擔心加載異步加載的元素的時間,首選的方法是使用隱式/顯式等待。雖然這會起作用,但我不相信它的有用性和好處。雖然XPath有時可能會變得棘手(主要是在這種情況下使用'class'處理),並且IE6 + 8的速度很慢(這裏的速度不慢),但是如果正確使用並且不會過度使用,它們通常是正確的工具。 –

+1

完全同意你對加載時間的評論。我提到它只是爲了防止ToxicBlotch不計入。 –

+1

至於代碼(和我所提到的)它是近似的。根據您的需求進行調整,可能會縮短。此外,正確的方法是儘可能通用並將其放入單獨的實用程序包中:因此它將不止一次地爲您服務。另外,這不是關於代碼量,而是關於它的質量:)我儘量避免使用xpath搜索:它不那麼富有表現力且非常敏感,尤其是生成的html。 –