2013-02-08 60 views
5

我剛開始使用Selenium和現在需要選擇這個元素:我怎樣才能選擇這個跨度元素?

<span class=" close">Matrices</span> 

這行代碼返回零個元素,所以我想這不是正確的:-)

ReadOnlyCollection<IWebElement> matrixLink = driver.FindElements(By.PartialLinkText("Matrices")); 

但我找不到另一個合適的,除了Xpath,但看起來像這樣(//*[@id=\"Navigation\"]/div[2]/div[2]/ul/li[7]/span),這對我來說似乎有點脆弱?

編輯: 跨度有'關閉'類。 這是一個菜單,其中有19個跨度的與類「關閉」,所以它不是唯一的選擇。不幸的是一部分....

+0

所以跨度有一個空的類? –

+0

啊,好的一個,它沒有,點擊它時只有沒有課,我會編輯這個問題。但是,這是一個菜單項,我檢查了它:我有19個span(菜單項),class'close',點擊的項目有'close'類。 – Michel

+0

'// @ [@ id = \「Navigation \」]/descendant :: span [text()='Matrices']'工作嗎? – Arran

回答

8

第n個元素這將工作:

//*[@id=\"Navigation\"]/descendant::span[text()='Matrices'] 

請注意,如果你能,具體在你的XPath查詢,主要是幫助可讀性和提高性能......即您的查詢中的*將在頁面中查詢所有元素。我不知道導航元素是什麼樣的元素,但你應該把它的確切元素類型中,例如,如果它是一個div,使它:

//div[@id=\"Navigation\"]/descendant::span[text()='Matrices'] 

對於這個XPath輕微的解釋是它會抓住Navigation元素,只需在的任意位置查看即可找到span元素,其文字爲Matrices。如果沒有XPath中的descendant位,它只會搜索直接子項。這意味着Navigation的孩子,沒有別的 - 所以如果一個元素是TestDiv的孩子,它是Navigation的孩子,descendant會捕獲它,沒有它你不會返回任何結果。

至於爲什麼By.PartialLinkText不起作用,這隻會搜索錨鏈接。正如你所看到的那樣,錨鏈接在它們內部有一個span元素是很常見的,或者有時它本身就是一個span

By.PartialLinkText和類似的By.LinkText不會「看到」這個元素,因爲它不是一個錨元素。

2

我最喜歡的解決問題者對於這些情況:

  • 安裝Selenium IDE
  • 點擊鏈接,你需要
  • 在「目標」中硒IDE,你會看到不同的XPath可能性

但我會用方法,它與「親潮」級(//span[7]或類似的東西)

+1

是的,第7個元素的xpath可以工作,但是看起來很脆弱,當菜單獲得一個額外的項目時它不再是第7個項目... – Michel

+0

同意。在我的情況下,它的工作原理是完美的,因爲Web GUI的變化並不是那麼經常,也不是侵入式的 –

2

您可以使用// span [text()='矩陣'] 它會選擇您的元素。

相關問題