2017-05-08 206 views
0

我可以使用XPath找到元素,但不使用它的ID,類或文本。我不想使用XPath,因爲我知道它很容易中斷。Watir通過xpath查找元素,但不是通過id或class

這是什麼樣子:

$browser.div(:xpath => "/html/body/nav/div[1]/div/div[3]/div/div/div[3]/div/div/div[2]/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div").present? 
$browser.div(:xpath => "/html/body/nav/div[1]/div/div[3]/div/div/div[3]/div/div/div[2]/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div").click 

它返回true,並且點擊元素。

繼路徑,我覺得元素,然後嘗試使用它的ID,如:

$browser.div(:id => "PaymentSelector").present? 
$browser.div(:id => "PaymentSelector").click 

返回false和超時試圖點擊。文字或課程也是如此。

該元素不在幀或iframe中。

爲什麼會發生這種情況,我該如何解決?

+2

你能嘗試給出一個最小的,可重複的例子嗎?這可能是由時間問題或錯字造成的,我無法知道。 –

+0

我真的不知道如何給出一個可重複的例子。但使用xpath,我可以找到並點擊它。然後,使用相同的xpath,我從中得到id和文本,所以我100%確定id是正確的。但是,我用$ path替換了一個獲得$ browser.div(:id =>「PaymentSelector」)。present ?.然後,它不會找到它。任何理由我應該告訴這個div的父母? –

+0

好吧,更簡單的解釋: $ browser.div(:xpath =>「/ html/body/nav/div [1]/div/div [3]/div/div/div [3]/div/div/DIV [2]/DIV [1]/DIV/DIV [2]/DIV [2]/DIV [1]/DIV [2]/DIV/DIV/DIV「)。本? 返回true。 $ browser.div(:xpath =>「/ html/body/nav/div [1]/div/div [3]/div/div/div [3]/div/div/div [2]/div [1]/div/div [2]/div [2]/div [1]/div [2]/div/div/div「)。 >「PaymentSelector」)。存在? 返回:假 –

回答

3

正如評論中所討論的那樣,問題在於存在多個具有相同ID的元素。這可以通過調用:

$browser.divs(:id => "PaymentSelector").count 
#=> 5 

Watir返回第一個匹配元素,在這種情況下,它恰好是隱藏元素。它不是用戶感興趣的那個。您需要製作一個更具體的定位器,以便返回正確的元素。

一個選項是指定:index,因爲你現在知道它是第二個:

$browser.div(:id => "PaymentSelector", :index => 2).click 

但是,它可能會更穩健,只是發現通過使用:visible定位第一個可見:

$browser.div(:id => "PaymentSelector", :visible => true).click 
+0

注意,DOM有多個具有相同ID的元素(除非它們在不同的框架內)是無效的HTML。如果是我,我會親自寫出一個錯誤,指出HTML違反標準的原因是具有多個具有給定ID值的單個元素。 –

+0

WC3 [ID值]標準(https://www.w3.org/TR/html401/struct/global.html#adef- id) –