2016-07-27 16 views
3

在我們的自動化測試,在我們的代碼典型的行可能看起來像:如何使用css-modules在網站上調整Capybara finders?

find('.edit-icon').click

我們對我們的方式在我們的項目中使用CSS-模塊和我已經警告說,類名可能會發生巨大變化一個漂亮的滑稽的例子是這樣的網站,在其類名稱使用表情符號(當你檢查頁面):

css modules by Glenn Maddern

會如何我最好的一個變化劇烈這個準備?我想我們的許多規格都打破了,但我有點擔心在我們的項目中無法使用這項新技術編寫測試。

+1

一種方法是使用自定義的水豚選擇 - https://開頭的github .com/jnicklas/capybara/blob/master/lib/capybara/selector.rb - 爲了抽象,你可以做一些類似'find(:edit_button).click'的東西。儘管答案完全是「它取決於」 - 爲什麼你首先使用css類? –

+0

在我提供的例子中,這在我的項目中很常見,最終得到的按鈕和其他元素無法通過任何標識文本或其他屬性找到。我還傾向於使用類名選擇器來避免在編寫期望時出現任何歧義/誤報(例如,如果某些文本預期會從一個區域跳到另一個區域)。我希望隨着我們的項目的進行,我可以提供一些更具體的例子。類是不是通常用於自動規格?謝謝你的幫助,湯姆。 – Phil

+0

是有很多類 - 雖然我傾向於嘗試和使用它們作爲最後的手段。主要用例中沒有文本,其他屬性等的元素。正如我所提到的自定義選擇器可以在這裏幫助 - Capybara.add_selector(:edit_button){css do |定位器| '.edit-icon'end} - 然後將css隔離到一個地方。當類名稱發生變化時,您可以更改該選擇器,並且可能會在進入css模塊時執行類似'[class * ='\ _ edit \ _「]'的操作,具體取決於類名最終是如何組成的 –

回答

2

使用自定義水豚選擇器,你可以從實際的css查詢中抽象出來並將它移動到一個位置。在你的評論中你提到需要改變一個以傳入值開始的類屬性。

Capybara.add_selector(:class_starts_with) do 
    css { |locator| "[class^=\"#{locator}\"]" 
end 

會做到這一點,則可以稱爲

find(:class_starts_with, 'something') 

,或者如果你設置Capybara.default_selector =:class_starts_with這純粹是

find('something') 

而不是改變default_selector另一種選擇應該只是定義一個像find_by_class_start這樣的助手方法,或者只是通過調用find:class_starts_with方法(如何使用Capybara的#find_field等)來實現。

還要注意,上面的自定義選擇將只有真正的工作,如果只有一個類名設置如果有多個預期,你可以選擇更改爲"[class^=\"#{locator}\"], [class*=\" #{locator}\"]"

+0

嗨Tom,是否還有一種方法可以爲'have_css'添加自定義匹配器,就像我們爲'find( )'?我似乎無法找到任何文件。 – Phil

+1

@Phil'has_css(...)'基本上只是'have_selector(:css,...)'和'have_selector(...)'默認爲Capybara.default_selector,如果沒有其他選擇器通過。所以你可以做'have_selector(:class_starts_with,...)' –

+0

啊,我不知道!感謝您通過這整個線程的所有幫助。我真的很感激它。 – Phil