ãã¡ãã£ã¨Capybaraã«ã¤ãã¦ãæ´çããå¿
è¦ããã£ãã®ã§ãã¡ãã§ç°¡åã«ã¾ã¨ãã¦ããã¾ããCapybaraã¯ãGithubã®ã¹ã¿ã¼ããã¼ã¸ã«ä½¿ãæ¹ãä¸å¯§ã«æ¸ãã¦ããã®ã§ããã¡ããåç
§ããã大æµã®ãã¨ã解ãããã«ãªã£ã¦ãã¾ãã
What is Capybara
ãCapybaraã¯ãWebã¢ããªã±ã¼ã·ã§ã³ã®ã¤ã³ãã°ã¬ã¼ã·ã§ã³ã»ãã¹ããè£å©ããçºã®ã©ã¤ãã©ãªã§ããCapybaraãæä¾ããæ¬è³ªçãªæ©è½ã¨ãã¦ã¯ãDSLã¨Driverã®2ç¹ã®ã¿ã§ããDSLã¨ã¯ãã¡ã¤ã³åºæè¨èªã§ãç¹å®ã®åé¡ã«ç¹åããã³ã³ãã¥ã¼ã¿è¨èªã§ããCapybaraã¯ãã¹ãã£ã³ã°ãã¬ã¼ã ã¯ã¼ã¯ãæä½ããå½ä»¤ããããããã®ãã¬ã¼ã ã¯ã¼ã¯ã«ä¾åããªãå½¢ã§æä¾ãã¾ããã¤ã¾ãããã¹ãã£ã³ã°ãã¬ã¼ã ã¯ã¼ã¯ã§ããCucumberãRSpec,Test::Unitãªã©ãééçã«å©ç¨ã§ãã¾ãã次ã«ãã©ã¤ãã¼ã§ããWebã¢ããªã±ã¼ã·ã§ã³ã®ã¤ã³ãã°ã¬ã¼ã·ã§ã³ã»ãã¹ãã«ã¯ããã©ã¦ã¶ãããã¯ããã«é¡ãããã®ãå¿ è¦ã§ãããã®çºã«ãSeleniumã®ããã«ãã©ã¦ã¶ãæä½ãããã¬ã¼ã ã¯ã¼ã¯ããWebKitã®ãããªãã©ã¦ã¶ã®ã¬ã³ããªã³ã°ã¨ã³ã¸ã³ãç´æ¥ä½¿ãæ¹æ³ãããã¾ããCapybaraã¯ããããããã©ã¤ãã¨ãã¦æ±ããã¨ãåºæ¥ã¾ãã

Capybaraã®DSL
ãCapybaraã«ã¯ãä¸è¨ã®æ©è½ãDSLã¨ãã¦æä¾ãã¦ãã¾ããè¦ã¯ãCucumberã§ããããRSpecã§ãããããåãããã«æ±ããã¨ãããã¡ãªããã§ããä¸æ¹ã§ãCucumberããRSpecã«ä¹ãæããã¨ããè¦ä»¶ããã¾ããªãã®ã§ãã©ãèããã¹ããªãã§ããããã
ç»é¢é·ç§»æ©è½
ãCapybaraã®ç»é¢é·ç§»ã¯ãGETã¡ã½ããã®ã¿ã§ããPOSTã«ã¤ãã¦ã¯ããã©ã¼ã å
¥åæ©è½ãå©ç¨ãã¾ãã
ã¡ã½ããå | æ©è½ |
---|---|
visit | GETã§ãã¼ã¸é·ç§»ãã¾ããã«ã¬ã³ãã®ãã¹ã¯ãcurrent_pathã§åå¾ã§ãã¾ãã |
ãªã³ã¯ï¼ã¯ãªãã¯æ©è½
Capybaraã¯ãä¸éãã®ãã©ã¼ã ã®å
¥åæ©è½ãç¨æããã¦ãã¾ãã
ã¡ã½ããå | æ©è½ |
---|---|
click_link('id-of-link') | IDæå®ã§ãªã³ã¯ãæ¼ãã¾ã |
click_link('Link Text') | ãªã³ã¯ã®ããã¹ãåã§æ¼ãã¾ã |
click_button('Save') | ãã¿ã³åã§ååãæ¼ãã¾ã |
click_on('Link Text') | ãªã³ã¯ããã¿ã³ã©ã¡ãããã¯ãªãã¯ãã¾ã |
click_on('Button Value') | ãã¿ã³ã®å¤æå®ã§æ¼ãã¾ã |
ãã©ã¼ã å ¥åæ©è½
Capybaraã¯ãä¸éãã®ãã©ã¼ã ã®å ¥åæ©è½ãç¨æããã¦ãã¾ãã
ã¡ã½ããå | æ©è½ |
---|---|
fill_in('First Name', :with => 'John') | ãã©ã¼ã ããã¹ããåãã¾ã |
fill_in('Password', :with => 'Seekrit') | ãã¹ã¯ã¼ããã©ã¼ã ãåãã¾ã |
fill_in('Description', :with => 'Really Long Text...') | TextAreaãåãã¾ã |
choose('A Radio Button') | ã©ã¸ãªãã¿ã³ãé¸æãã¾ãã |
check('A Checkbox') | ãã§ãã¯ãã¿ã³ãé¸æãã¾ãã |
uncheck('A Checkbox') | ãã§ãã¯ãã¿ã³ã®é¸æãå¤ãã¾ã |
attach_file('Image', '/path/to/image.jpg') | ç»åãæ·»ä»ãã¾ã |
select('Option', :from => 'Select Box') | ã»ã¬ã¯ãããã¯ã¹ãé¸æãã¾ã |
ã¯ã¨ãªã¼æ©è½ï¼ç¢ºèªæ©è½ï¼
Capybaraã§ã¯ã¯ã¨ãªã¼æ©è½ãå©ç¨ãã¦ããã¹ããè¡ãã¾ãã
ã¡ã½ããå | æ©è½ |
---|---|
page.has_selector?('table tr') | ã¨ã¬ã¡ã³ãã®åå¨ç¢ºèªããã¾ã |
page.has_selector?(:xpath, '//table/tr') | XPathæå®ã§ãã¨ã¬ã¡ã³ãã®åå¨ç¢ºèªããã¾ã |
page.has_xpath?('//table/tr') | XPathæå®ã§ãã¨ã¬ã¡ã³ãã®åå¨ç¢ºèªããã¾ã |
page.has_css?('table tr.foo') | CSSã§ãã¨ã¬ã¡ã³ãã®åå¨ç¢ºèªããã¾ã |
page.has_content?('foo') | æååã®åå¨ç¢ºèªããã¾ã |
æ¤ç´¢æ©è½
æ¤ç´¢æ©è½ã¨ãã¦ã¯ãfind_field,find_button,find,allã®4ã¤ãããã¾ãã
ã¡ã½ããå | æ©è½ |
---|---|
find_field('First Name').value | ãã£ã¼ã«ãåæå®ã§æ¤ç´¢ããå¤ã表示ãã¾ã |
find_link('Hello').visible? | ãã£ã¼ã«ãåæå®ã§æ¤ç´¢ãã表示æç¡ã確èªãã¾ã |
find_button('Send').click | ãã¿ã³ãæ¤ç´¢ããã¯ãªãã¯ãã¾ã |
find(:xpath, "//table/tr").click | XPathæå®ã§æ¤ç´¢ããã¯ãªãã¯ãã¾ã |
find("#overlay").find("h1").click | å ¥ãåã§æ¤ç´¢ããã¯ãªãã¯ãã¾ã |
all('a').each { |a| a[:href] } | å ¨ã¦ã®è¦ç´ ããaã¿ã°ãæ½åºããhrefã表示ãã¾ã |
ã¹ã³ã¼ãæ©è½
ãã¹ã³ã¼ãæ©è½ãå©ç¨ãããã¨ã§ãç¹å®ã®ã¨ã¬ã¡ã³ãä¸ã®ã¿æä½ã§ãã¾ããã«ã¼ãå¦ççã§ä¾¿å©ã§ãã
within("li#employee") do fill_in 'Name', :with => 'Jimmy' end within(:xpath, "//li[@id='employee']") do fill_in 'Name', :with => 'Jimmy' end
ã¹ã¯ãªããã£ã³ã°æ©è½ï¼JavaScriptã®ãµãã¼ãï¼
ãCapybaraã¯JavaScriptããµãã¼ããã¦ãã¾ãããã ãã使ç¨ä¸ã®DriverãJavaScriptããµãã¼ããã¦ãããã¨ãåæã§ããï¼O.K. Selenium,WebKit,Poltergeist NG RackTestï¼
ã¡ã½ããå | æ©è½ |
---|---|
page.execute_script("$('body').empty()") | JavaScriptãå®è¡ãã¾ã |
ãããã°æ©è½
ããããã°ç¨ã«å¹¾ã¤ãã®æ©è½ãæä¾ããã¦ãã¾ãããã¹ãã®ã¨ããã³ã¹ã«ãæ´»ç¨åºæ¥ãã®ã§ã¯ãï¼ãã¹ãã®åç¾æ§ã確ä¿ããããããããã¨ããã³ã¹ä¸è¦ã§ããããï¼
ã¡ã½ããå | æ©è½ |
---|---|
save_and_open_page | ã¹ã¯ãªã¼ã³ã·ã§ãããåå¾ãã¾ã |
print page.html | ãã¼ã¸ã®å°å·ãã¾ã |
page.save_screenshot('screenshot.png') | ã¹ã¯ãªã¼ã³ã·ã§ãããåå¾ãã¾ã |
Capybaraã®Driver
ãCapybaraã«ã¯ãDriverã¨ãã¦å¹¾ã¤ãã®ãã©ã¦ã¶ã·ãã¥ã¬ã¼ã¿ããã©ã¦ã¶ã¨ã³ã¸ã³ãæ±ããã¨ãåºæ¥ã¾ãã使ãåãã¨ãã¦ã¯ãJavaScriptãå©ç¨ããªããã®ã«ã¤ãã¦ã¯ãRackTestã®ãããªè»½éã®ãã®ãå©ç¨ãããã¨ãèãããã¾ããã¾ããéçºæ®µéã¯ãSeleniumã使ã£ã¦å®éã®åããè¦ã¦ãéè¡ãã¹ãã®æ®µéã«ãªã£ãã¨ãã¯WebKitã使ã軽éåãããªã©ãèãããã¾ããä¸è¨ã®ããã«ãç°¡åã«Driverãå¤æ´ã§ãã¾ãã
Capybara.default_driver = :selenium
Driverå | ç¹å¾´ |
---|---|
RackTest | ããã©ã«ãã®Driverã§ããJavaScriptã¯ãµãã¼ããã¦ãã¾ãããã¾ããå¤é¨ã®URLã¸ã®ã¢ã¯ã»ã¹ãåºæ¥ã¾ããã |
capybara-mechanize | RackTestã¨åæ§ã«JavaScriptã¯ãµãã¼ããã¦ãã¾ãããããããå¤é¨ã®URLã¸ã®ã¢ã¯ã»ã¹å¯è½ã§ãã |
Selenium | Capybaraã¯ãSelenium 2.0ï¼WebDriverï¼ããµãã¼ããã¦ãã¾ããã¾ãJavaScriptãOnã«ããå ´åã¯ãæå®ããªãã¨èªåçã«Seleniumãå©ç¨ãã¾ãã |
Capybara-webkit | headlessãå©ç¨ãã¦ç»é¢ãªãã§ãã¹ããã¾ããã¬ã³ããªã³ã°ã¨ã³ã¸ã³ã¨ãã¦ã¯ãWebKitãå©ç¨ãJavaScriptã®ãã¹ããå¯è½ã§ããXvfbãå¿ è¦ã§ãã |
Poltergeist | headlessãå©ç¨ãã¦ç»é¢ãªãã§ãã¹ããã¾ããPhantomJSãåä½ãJavaScriptã®ãã¹ããå¯è½ã§ããXvfbãä¸è¦ã§ãã |
ããµã¼ãã«Xvfbã®ã¤ã³ã¹ãã¼ã«ã¯ãå²ã¨é¢åãããã§ããç¶ç¶çã¤ã³ãã°ã¬ã¼ã·ã§ã³ã®çºã«ãµã¼ããµã¤ãã§ãã¹ããå®è¡ãããå ´åã¯ãPoltergeistãããããããã¾ãããæ¬æ ¼çã«ããã®ã§ããã°ãSeleniumãå©ç¨ãã¦ãè¤æ°ã®ãã©ã¦ã¶ã«å¯¾ãã¦ãã¹ããå®è¡ããã¨ãã£ããã¨ãããã§ããã
ã¾ã¨ã
ãCapybaraã®å½¹å²ã解ãã°ããªããªã便å©ã§ããç§ã®å ´åã¯ãSeleniumãCucumber,RSpecã使ã£ã¦ããCapybaraã使ãã ãã¾ããããããªãCapybaraã®æ¹ãå¦ç¿ã³ã¹ããä½ãã¦ããããããã¾ãããä¸æ¹ã§ãããã£ãæã«ããããããªãã¨ããã®ãããããããã¾ãããä½ã¯ã¨ããããä¸åº¦ã試ããã ãããEnjoy!!
See Also:
Web画面の自動テストの導入に失敗する理由とその対策
Selenium2.0 WebDriverで複数ブラウザのUIテスト もう一度、Selenium再入門
JenkinsとSelenium WebDriverでUI層のテストも自動化&永続化する
åç
§ï¼
jnicklas/capybara