2013-06-05 29 views
7

我希望點擊一個彈出消息出現在我的測試應用程序,如果它存在。我是新來的水豚,似乎找不到辦法做到這一點。我以前有過經驗的Watir,如果我用的Watir做它會是這樣的:點擊元素,如果它存在於水豚

if browser.link(:text, "name").exists? do 
    browser.link(:text, "name").click 
end 

我如何可以做同樣的水豚?注意這個鏈接不會總是出現,因此我希望擁有if語句。

+0

如果你正在編寫確定性測試你不應該*知道*如果彈出會存在與否?爲什麼你首先檢查存在,而不是直接點擊? – nzifnab

+0

@nzifnab,因爲如果元素不存在'click'方法將失敗 –

+0

@Andrey但是因爲你正在寫一個*測試*你應該知道元素是否應該在那裏。因此,點擊方法應該失敗,因爲您的測試期望失敗。沒有? – nzifnab

回答

-3

您是否嘗試過做類似:

if page.find('.id') do 
    click_link('Some Link') # or page.find('.id').click 
else 
    page.should_not have_selector('.id') # or something like that 
end 
+1

謝謝惠特尼!如果沒有元素匹配這樣的選擇器,'find'會拋出'Capybara :: ElementNotFound'異常,我可以在if語句 – user1523236

+2

@ user1523236中使用page.find。因此,如果鏈接不存在,則此代碼將不起作用 –

+0

link = first('')在其中找到'find',它只是找到第一個鏈接...如果傳入find的任何內容不存在,它將拋出相同的異常。 –

22

起始碼的直線就是隻調用一個has_link?匹配,然後click_link行動:

if page.has_link?('name') 
    page.click_link('name') 
end 

但它將是不是最快因爲Capybara將向驅動程序發出兩個查詢來獲取元素:第一個在has_link?,第二個在click_link

一個更好的變體可僅做一個查詢來獲取一個元素:

# This code doesn't check that an element exists only at one place and just chooses the first one 
link = first('name') 
link.click if link 

# This code checks that element exists only at one place 
links = all('name') 
unless links.empty? 
    links.count.should == 1 
    link = links.first 
    link.click 
end 

個人而言,我會用has_link?/click_link去執行作爲第二變形開不檢查元素是否只存在於一個地方,第三個元素是否太長。

+0

這對我有用 'click_link('whatever')if page.has_link?('whatever')' –

+0

'if ... do'創建語法錯誤(至少在ruby 2.3.1上),刪除'do'解決了這個問題。 – Pavelloz

-1

如果我用has_css?查詢:

if page.has_css?("button #popUpButton") 
    click_button(#popUpButton") 
end