Capybara ช่วยคุณทดสอบเว็บแอปพลิเคชันโดยจำลองว่าผู้ใช้จริงจะโต้ตอบกับแอปของคุณอย่างไร เป็นเรื่องที่ไม่เชื่อเรื่องพระเจ้าเกี่ยวกับไดรเวอร์ที่ทำการทดสอบของคุณและมาพร้อมกับการรองรับ Rack::Test และ Selenium ในตัว WebKit ได้รับการสนับสนุนผ่าน gem ภายนอก
หากคุณและ/หรือบริษัทของคุณค้นพบคุณค่าใน Capybara และต้องการบริจาคทางการเงินเพื่อการบำรุงรักษาและการพัฒนาอย่างต่อเนื่อง โปรดไปที่ Patreon
ต้องการความช่วยเหลือ? ถามในการสนทนา (โปรดอย่าเปิดประเด็น): https://github.com/orgs/teamcapybara/discussions/categories/qa
Capybara ต้องใช้ Ruby 3.0.0 หรือใหม่กว่า หากต้องการติดตั้ง ให้เพิ่มบรรทัดนี้ใน Gemfile
ของคุณและรัน bundle install
:
gem 'capybara'
หากแอปพลิเคชันที่คุณกำลังทดสอบเป็นแอป Rails ให้เพิ่มบรรทัดนี้ในไฟล์ตัวช่วยทดสอบของคุณ:
require 'capybara/rails'
หากแอปพลิเคชันที่คุณกำลังทดสอบเป็นแอป Rack แต่ไม่ใช่ Rails ให้ตั้งค่า Capybara.app เป็นแอป Rack ของคุณ:
Capybara . app = MyRackApp
หากคุณต้องการทดสอบ JavaScript หรือหากแอปของคุณโต้ตอบกับ (หรืออยู่ที่) URL ระยะไกล คุณจะต้องใช้ไดรเวอร์อื่น หากใช้ Rails 5.0+ แต่ไม่ได้ใช้การทดสอบระบบ Rails จาก 5.1 คุณอาจต้องการสลับ "เซิร์ฟเวอร์" ที่ใช้ในการเปิดแอปของคุณเป็น Puma เพื่อให้ตรงกับค่าเริ่มต้นของ Rails
Capybara . server = :puma # Until your setup is working
Capybara . server = :puma , { Silent : true } # To clean up your test output
อัญมณี cucumber-rails
มาพร้อมกับตัวรองรับ Capybara ในตัว หากคุณไม่ได้ใช้ Rails ให้โหลดโมดูล capybara/cucumber
ด้วยตนเอง:
require 'capybara/cucumber'
Capybara . app = MyRackApp
คุณสามารถใช้ Capybara DSL ในขั้นตอนของคุณได้ เช่น:
When /I sign in/ do
within ( "#session" ) do
fill_in 'Email' , with : '[email protected]'
fill_in 'Password' , with : 'password'
end
click_button 'Sign in'
end
คุณสามารถสลับไปใช้ Capybara.javascript_driver
( :selenium
โดยค่าเริ่มต้น) โดยการแท็กสถานการณ์ (หรือคุณสมบัติ) ด้วย @javascript
:
@javascript
Scenario : do something Ajaxy
When I click the Ajax link
...
นอกจากนี้ยังมีแท็กที่ชัดเจนสำหรับไดรเวอร์ที่ลงทะเบียนแต่ละตัวที่ตั้งค่าไว้สำหรับคุณ ( @selenium
, @rack_test
ฯลฯ )
โหลดการสนับสนุน RSpec 3.5+ โดยเพิ่มบรรทัดต่อไปนี้ (โดยทั่วไปคือไฟล์ spec_helper.rb
ของคุณ):
require 'capybara/rspec'
หากคุณใช้ Rails ให้ใส่ข้อมูลจำเพาะของ Capybara ลงใน spec/features
หรือ spec/system
(ใช้งานได้เฉพาะเมื่อคุณกำหนดค่าไว้ใน RSpec เท่านั้น) และหากคุณมีข้อมูลจำเพาะของ Capybara ในไดเร็กทอรีอื่น ให้แท็กกลุ่มตัวอย่างด้วย type: :feature
หรือ type: :system
ขึ้นอยู่กับประเภทของการทดสอบที่คุณกำลังเขียน
หากคุณใช้ข้อมูลจำเพาะของระบบ Rails โปรดดูเอกสารประกอบสำหรับการเลือกไดรเวอร์ที่คุณต้องการใช้
หากคุณไม่ได้ใช้ Rails ให้แท็กกลุ่มตัวอย่างทั้งหมดที่คุณต้องการใช้ Capybara ด้วย type: :feature
ตอนนี้คุณสามารถเขียนข้อมูลจำเพาะของคุณดังนี้:
describe "the signin process" , type : :feature do
before :each do
User . create ( email : '[email protected]' , password : 'password' )
end
it "signs me in" do
visit '/sessions/new'
within ( "#session" ) do
fill_in 'Email' , with : '[email protected]'
fill_in 'Password' , with : 'password'
end
click_button 'Sign in'
expect ( page ) . to have_content 'Success'
end
end
ใช้ js: true
เพื่อสลับไปใช้ Capybara.javascript_driver
( :selenium
เป็นค่าเริ่มต้น) หรือระบุตัวเลือก :driver
เพื่อสลับไปยังไดรเวอร์เฉพาะตัวเดียว ตัวอย่างเช่น:
describe 'some stuff which requires js' , js : true do
it 'will use the default js driver'
it 'will switch to one specific driver' , driver : :selenium
end
Capybara ยังมาพร้อมกับ DSL ในตัวสำหรับสร้างการทดสอบการยอมรับเชิงพรรณนา:
feature "Signing in" do
background do
User . create ( email : '[email protected]' , password : 'caplin' )
end
scenario "Signing in with correct credentials" do
visit '/sessions/new'
within ( "#session" ) do
fill_in 'Email' , with : '[email protected]'
fill_in 'Password' , with : 'caplin'
end
click_button 'Sign in'
expect ( page ) . to have_content 'Success'
end
given ( :other_user ) { User . create ( email : '[email protected]' , password : 'rous' ) }
scenario "Signing in as another user" do
visit '/sessions/new'
within ( "#session" ) do
fill_in 'Email' , with : other_user . email
fill_in 'Password' , with : other_user . password
end
click_button 'Sign in'
expect ( page ) . to have_content 'Invalid email or password'
end
end
ในความเป็นจริงแล้ว feature
เป็นเพียงนามแฝงสำหรับ describe ..., type: :feature
background
เป็นนามแฝงสำหรับ before
, scenario
สำหรับ it
และ given
/ given!
นามแฝงสำหรับ let
/ let!
ตามลำดับ
สุดท้ายนี้ ตัวจับคู่ Capybara ก็ได้รับการรองรับในข้อกำหนดการดูด้วย:
RSpec . describe "todos/show.html.erb" , type : :view do
it "displays the todo title" do
assign :todo , Todo . new ( title : "Buy milk" )
render
expect ( rendered ) . to have_css ( "header h1" , text : "Buy milk" )
end
end
หมายเหตุ: เมื่อคุณต้องการให้ติดตั้งวิธีการพร็อกซี 'capybara/rspec' เพื่อแก้ไขปัญหาการชนกันของชื่อระหว่างวิธี Capybara::DSL all
/ within
และตัวจับคู่ RSpec ในตัวที่มีชื่อเหมือนกัน หากคุณเลือกที่จะไม่ต้องการ 'capybara/rspec' คุณสามารถติดตั้งวิธีการพร็อกซีได้โดยต้องการ 'capybara/rspec/matcher_proxy' หลังจากต้องการ RSpec และ 'capybara/dsl'
หากคุณใช้ Test::Unit
ให้กำหนดคลาสพื้นฐานสำหรับการทดสอบ Capybara ของคุณดังนี้:
require 'capybara/dsl'
class CapybaraTestCase < Test :: Unit :: TestCase
include Capybara :: DSL
def teardown
Capybara . reset_sessions!
Capybara . use_default_driver
end
end
หากคุณใช้การทดสอบระบบ Rails โปรดดูเอกสารประกอบสำหรับข้อมูลเกี่ยวกับการเลือกไดรเวอร์ที่คุณต้องการใช้
หากคุณใช้ Rails แต่ไม่ได้ใช้การทดสอบระบบ Rails ให้เพิ่มโค้ดต่อไปนี้ในไฟล์ test_helper.rb
เพื่อให้ Capybara พร้อมใช้งานในกรณีทดสอบทั้งหมดที่ได้รับจาก ActionDispatch::IntegrationTest
:
require 'capybara/rails'
require 'capybara/minitest'
class ActionDispatch :: IntegrationTest
# Make the Capybara DSL available in all integration tests
include Capybara :: DSL
# Make `assert_*` methods behave like Minitest assertions
include Capybara :: Minitest :: Assertions
# Reset sessions and driver between tests
teardown do
Capybara . reset_sessions!
Capybara . use_default_driver
end
end
หากคุณไม่ได้ใช้ Rails ให้กำหนดคลาสพื้นฐานสำหรับการทดสอบ Capybara ของคุณดังนี้:
require 'capybara/minitest'
class CapybaraTestCase < Minitest :: Test
include Capybara :: DSL
include Capybara :: Minitest :: Assertions
def teardown
Capybara . reset_sessions!
Capybara . use_default_driver
end
end
อย่าลืมเรียก super
ในคลาสย่อยใดๆ ที่แทนที่ teardown
หากต้องการสลับไดรเวอร์ ให้ตั้งค่า Capybara.current_driver
ตัวอย่างเช่น
class BlogTest < ActionDispatch :: IntegrationTest
setup do
Capybara . current_driver = Capybara . javascript_driver # :selenium by default
end
test 'shows blog posts' do
# ... this test is run with Selenium ...
end
end
ปฏิบัติตามคำแนะนำข้างต้นสำหรับ Minitest และจำเป็นต้องมี capybara/minitest/spec เพิ่มเติม
page . must_have_content ( 'Important!' )
Capybara ใช้ DSL เดียวกันในการขับเคลื่อนเบราว์เซอร์และไดรเวอร์แบบไม่มีหัวที่หลากหลาย
ตามค่าเริ่มต้น Capybara จะใช้ไดรเวอร์ :rack_test
ซึ่งเร็วแต่มีข้อจำกัด: ไม่รองรับ JavaScript และไม่สามารถเข้าถึงทรัพยากร HTTP ภายนอกแอปพลิเคชัน Rack ของคุณ เช่น API ระยะไกลและบริการ OAuth เพื่อแก้ไขข้อจำกัดเหล่านี้ คุณสามารถตั้งค่าไดรเวอร์เริ่มต้นอื่นสำหรับคุณลักษณะของคุณได้ ตัวอย่างเช่น หากคุณต้องการรันทุกอย่างใน Selenium คุณสามารถทำได้:
Capybara . default_driver = :selenium # :selenium_chrome and :selenium_chrome_headless are also registered
อย่างไรก็ตาม หากคุณใช้ RSpec หรือ Cucumber (และแอปของคุณทำงานอย่างถูกต้องโดยไม่มี JS) คุณอาจต้องการพิจารณาปล่อยให้ :rack_test
เป็น default_driver ที่ เร็วกว่าแทน และทำเครื่องหมายเฉพาะการทดสอบที่ต้องใช้ไดรเวอร์ที่รองรับ JavaScript โดยใช้ js: true
หรือ @javascript
ตามลำดับ ตามค่าเริ่มต้น การทดสอบ JavaScript จะดำเนินการโดยใช้ไดรเวอร์ :selenium
คุณสามารถเปลี่ยนแปลงได้โดยการตั้งค่า Capybara.javascript_driver
คุณยังสามารถเปลี่ยนไดรเวอร์ได้ชั่วคราว (โดยทั่วไปจะอยู่ในบล็อกก่อน/ตั้งค่าและหลัง/รื้อถอน):
Capybara . current_driver = :selenium # temporarily select different driver
# tests here
Capybara . use_default_driver # switch back to default driver
หมายเหตุ : การสลับไดรเวอร์จะสร้างเซสชันใหม่ ดังนั้นคุณอาจไม่สามารถสลับได้ในระหว่างการทดสอบ
RackTest เป็นไดรเวอร์เริ่มต้นของ Capybara เขียนด้วย Ruby ล้วนๆ และไม่รองรับการรัน JavaScript เนื่องจากไดรเวอร์ RackTest โต้ตอบโดยตรงกับอินเทอร์เฟซของ Rack จึงไม่จำเป็นต้องมีเซิร์ฟเวอร์ในการเริ่มต้น อย่างไรก็ตาม นี่หมายความว่าหากแอปพลิเคชันของคุณไม่ใช่แอปพลิเคชัน Rack (Rails, Sinatra และเฟรมเวิร์ก Ruby อื่นๆ ส่วนใหญ่เป็นแอปพลิเคชัน Rack) คุณจะไม่สามารถใช้ไดรเวอร์นี้ได้ นอกจากนี้ คุณไม่สามารถใช้ไดรเวอร์ RackTest เพื่อทดสอบแอปพลิเคชันระยะไกล หรือเข้าถึง URL ระยะไกล (เช่น การเปลี่ยนเส้นทางไปยังไซต์ภายนอก API ภายนอก หรือบริการ OAuth) ที่แอปพลิเคชันของคุณอาจโต้ตอบด้วย
capybara-mechanize ให้ไดรเวอร์ที่คล้ายกันซึ่งสามารถเข้าถึงเซิร์ฟเวอร์ระยะไกลได้
RackTest สามารถกำหนดค่าได้ด้วยชุดส่วนหัวดังนี้:
Capybara . register_driver :rack_test do | app |
Capybara :: RackTest :: Driver . new ( app , headers : { 'HTTP_USER_AGENT' => 'Capybara' } )
end
ดูส่วนการเพิ่มและกำหนดค่าไดรเวอร์
Capybara รองรับ Selenium 3.5+ (Webdriver) ในการใช้ Selenium คุณจะต้องติดตั้ง selenium-webdriver
gem และเพิ่มลงใน Gemfile ของคุณหากคุณใช้ Bundler
Capybara จะลงทะเบียนไดรเวอร์ที่ระบุชื่อไว้ล่วงหน้าจำนวนหนึ่งซึ่งใช้ Selenium ได้แก่:
สิ่งเหล่านี้ควรใช้งานได้ (พร้อมกับการติดตั้งซอฟต์แวร์ที่เกี่ยวข้อง) ในการกำหนดค่าเดสก์ท็อปในเครื่อง แต่คุณอาจต้องปรับแต่งหากใช้ในสภาพแวดล้อม CI ที่อาจจำเป็นต้องส่งตัวเลือกเพิ่มเติมไปยังเบราว์เซอร์ ดูส่วนการเพิ่มและกำหนดค่าไดรเวอร์
หมายเหตุ : ไดรเวอร์ที่รันเซิร์ฟเวอร์ในเธรดอื่นอาจไม่แชร์ธุรกรรมเดียวกันกับการทดสอบของคุณ ทำให้ไม่มีการแชร์ข้อมูลระหว่างเซิร์ฟเวอร์ทดสอบและเซิร์ฟเวอร์ทดสอบ ดูธุรกรรมและการตั้งค่าฐานข้อมูลด้านล่าง
ข้อมูลอ้างอิงฉบับสมบูรณ์มีอยู่ที่ rubydoc.info
หมายเหตุ: ตามค่าเริ่มต้น Capybara จะค้นหาเฉพาะองค์ประกอบที่มองเห็นได้เท่านั้น เนื่องจากผู้ใช้จริงจะไม่สามารถโต้ตอบกับองค์ประกอบที่ไม่สามารถมองเห็นได้
หมายเหตุ : การค้นหาทั้งหมดใน Capybara จะ คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ เนื่องจาก Capybara ใช้ XPath อย่างมาก ซึ่งไม่รองรับการพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
คุณสามารถใช้วิธี เยี่ยมชม เพื่อไปยังหน้าอื่นๆ ได้:
visit ( '/projects' )
visit ( post_comments_path ( post ) )
วิธีการเยี่ยมชมใช้เพียงพารามิเตอร์เดียว วิธีการร้องขอจะเป็น GET เสมอ
คุณสามารถรับเส้นทางปัจจุบันของเซสชันการสืบค้นและทดสอบโดยใช้ตัวจับคู่ have_current_path
:
expect ( page ) . to have_current_path ( post_comments_path ( post ) )
หมายเหตุ : คุณยังสามารถยืนยันเส้นทางปัจจุบันได้โดยการทดสอบค่าของ current_path
โดยตรง อย่างไรก็ตาม การใช้ตัวจับคู่ have_current_path
จะปลอดภัยกว่า เนื่องจากจะใช้พฤติกรรมการรอของ Capybara เพื่อให้แน่ใจว่าการดำเนินการก่อนหน้า (เช่น click_link
) ได้เสร็จสิ้นแล้ว
ข้อมูลอ้างอิงฉบับเต็ม: Capybara::Node::Actions
คุณสามารถโต้ตอบกับ webapp ได้โดยไปที่ลิงก์และปุ่มต่างๆ Capybara ติดตามการเปลี่ยนเส้นทางโดยอัตโนมัติ และส่งแบบฟอร์มที่เกี่ยวข้องกับปุ่มต่างๆ
click_link ( 'id-of-link' )
click_link ( 'Link Text' )
click_button ( 'Save' )
click_on ( 'Link Text' ) # clicks on either links or buttons
click_on ( 'Button Value' )
ข้อมูลอ้างอิงฉบับเต็ม: Capybara::Node::Actions
มีเครื่องมือมากมายสำหรับการโต้ตอบกับองค์ประกอบของแบบฟอร์ม:
fill_in ( 'First Name' , with : 'John' )
fill_in ( 'Password' , with : 'Seekrit' )
fill_in ( 'Description' , with : 'Really Long Text...' )
choose ( 'A Radio Button' )
check ( 'A Checkbox' )
uncheck ( 'A Checkbox' )
attach_file ( 'Image' , '/path/to/image.jpg' )
select ( 'Option' , from : 'Select Box' )
การอ้างอิงแบบเต็ม: Capybara::Node::Matchers
Capybara มีตัวเลือกมากมายสำหรับการสืบค้นหน้าเว็บว่ามีองค์ประกอบบางอย่างอยู่ และทำงานกับและจัดการองค์ประกอบเหล่านั้น
page . has_selector? ( 'table tr' )
page . has_selector? ( :xpath , './/table/tr' )
page . has_xpath? ( './/table/tr' )
page . has_css? ( 'table tr.foo' )
page . has_content? ( 'foo' )
หมายเหตุ: รูปแบบเชิงลบ เช่น has_no_selector?
แตกต่างจาก not has_selector?
- อ่านหัวข้อ JavaScript แบบอะซิงโครนัสสำหรับคำอธิบาย
คุณสามารถใช้สิ่งเหล่านี้กับเครื่องจับคู่เวทย์มนตร์ของ RSpec:
expect ( page ) . to have_selector ( 'table tr' )
expect ( page ) . to have_selector ( :xpath , './/table/tr' )
expect ( page ) . to have_xpath ( './/table/tr' )
expect ( page ) . to have_css ( 'table tr.foo' )
expect ( page ) . to have_content ( 'foo' )
ข้อมูลอ้างอิงฉบับเต็ม: Capybara::Node::Finders
คุณยังสามารถค้นหาองค์ประกอบเฉพาะเพื่อจัดการองค์ประกอบเหล่านั้นได้:
find_field ( 'First Name' ) . value
find_field ( id : 'my_field' ) . value
find_link ( 'Hello' , :visible => :all ) . visible?
find_link ( class : [ 'some_class' , 'some_other_class' ] , :visible => :all ) . visible?
find_button ( 'Send' ) . click
find_button ( value : '1234' ) . click
find ( :xpath , ".//table/tr" ) . click
find ( "#overlay" ) . find ( "h1" ) . click
all ( 'a' ) . each { | a | a [ :href ] }
หากคุณต้องการค้นหาองค์ประกอบตามแอตทริบิวต์/คุณสมบัติเพิ่มเติม คุณสามารถส่งบล็อกตัวกรองได้ ซึ่งจะถูกตรวจสอบภายในพฤติกรรมการรอปกติ หากคุณพบว่าตัวเองจำเป็นต้องใช้สิ่งนี้บ่อยครั้ง คุณอาจจะดีกว่าการเพิ่มตัวเลือกแบบกำหนดเองหรือเพิ่มตัวกรองให้กับตัวเลือกที่มีอยู่
find_field ( 'First Name' ) { | el | el [ 'data-xyz' ] == '123' }
find ( "#img_loading" ) { | img | img [ 'complete' ] == true }
หมายเหตุ : find
จะรอให้องค์ประกอบปรากฏบนเพจ ตามที่อธิบายไว้ในส่วน Ajax หากองค์ประกอบไม่ปรากฏจะทำให้เกิดข้อผิดพลาด
องค์ประกอบเหล่านี้ล้วนมีวิธีการ Capybara DSL ทั้งหมด ดังนั้นคุณจึงสามารถจำกัดไว้เฉพาะบางส่วนของหน้าได้:
find ( '#navigation' ) . click_link ( 'Home' )
expect ( find ( '#navigation' ) ) . to have_button ( 'Sign out' )
Capybara ทำให้สามารถจำกัดการกระทำบางอย่าง เช่น การโต้ตอบกับแบบฟอร์ม หรือการคลิกลิงก์และปุ่ม ให้อยู่ภายในพื้นที่เฉพาะของหน้าได้ เพื่อจุดประสงค์นี้ คุณสามารถใช้วิธีการทั่วไป ภายในได้ คุณสามารถเลือกระบุประเภทของตัวเลือกที่จะใช้ได้
within ( "li#employee" ) do
fill_in 'Name' , with : 'Jimmy'
end
within ( :xpath , ".//li[@id='employee']" ) do
fill_in 'Name' , with : 'Jimmy'
end
มีวิธีการพิเศษในการจำกัดขอบเขตไว้ที่ชุดฟิลด์เฉพาะ ซึ่งระบุด้วยรหัสหรือข้อความของแท็กคำอธิบายของชุดฟิลด์ และไปยังตารางเฉพาะที่ระบุด้วยรหัสหรือข้อความของแท็กคำอธิบายภาพของตาราง
within_fieldset ( 'Employee' ) do
fill_in 'Name' , with : 'Jimmy'
end
within_table ( 'Employee' ) do
fill_in 'Name' , with : 'Jimmy'
end
Capybara มีวิธีการบางอย่างที่ช่วยให้ค้นหาและสลับหน้าต่างได้ง่ายขึ้น:
facebook_window = window_opened_by do
click_button 'Like'
end
within_window facebook_window do
find ( '#login_email' ) . set ( '[email protected]' )
find ( '#login_password' ) . set ( 'qwerty' )
click_button 'Submit'
end
ในไดรเวอร์ที่รองรับ คุณสามารถรัน JavaScript ได้อย่างง่ายดาย:
page . execute_script ( "$('body').empty()" )
สำหรับนิพจน์แบบง่าย คุณสามารถส่งคืนผลลัพธ์ของสคริปต์ได้
result = page . evaluate_script ( '4 + 4' ) ;
สำหรับสคริปต์ที่ซับซ้อนมากขึ้น คุณจะต้องเขียนเป็นนิพจน์เดียว
result = page . evaluate_script ( <<~JS , 3 , element )
(function(n, el){
var val = parseInt(el.value, 10);
return n+val;
})(arguments[0], arguments[1])
JS
ในไดรเวอร์ที่รองรับ คุณสามารถยอมรับ ยกเลิก และตอบสนองต่อการแจ้งเตือน ยืนยัน และแจ้งได้
คุณสามารถรับข้อความแจ้งเตือนได้โดยล้อมโค้ดที่สร้างการแจ้งเตือนไว้ในบล็อก:
accept_alert 'optional text or regex' do
click_link ( 'Show Alert' )
end
คุณสามารถยอมรับหรือยกเลิกการยืนยันโดยล้อมไว้ในบล็อกได้เช่นกัน:
accept_confirm 'optional text' do
click_link ( 'Show Confirm' )
end
dismiss_confirm 'optional text' do
click_link ( 'Show Confirm' )
end
คุณสามารถยอมรับหรือยกเลิกข้อความแจ้งได้เช่นกัน และยังระบุข้อความเพื่อกรอกคำตอบด้วย:
accept_prompt ( 'optional text' , with : 'Linus Torvalds' ) do
click_link ( 'Show Prompt About Linux' )
end
dismiss_prompt ( 'optional text' ) do
click_link ( 'Show Prompt About Linux' )
end
วิธีการกิริยาทั้งหมดส่งคืนข้อความที่ถูกนำเสนอ ดังนั้นคุณจึงสามารถเข้าถึงข้อความพร้อมต์ได้โดยกำหนดการส่งคืนให้กับตัวแปร:
message = accept_prompt ( with : 'Linus Torvalds' ) do
click_link ( 'Show Prompt About Linux' )
end
expect ( message ) . to eq ( 'Who is the chief architect of Linux?' )
การถ่ายภาพสแนปชอตของเพจตามที่เป็นอยู่ในปัจจุบันและดูที่หน้านั้นอาจเป็นประโยชน์:
save_and_open_page
คุณยังสามารถดึงข้อมูลสถานะปัจจุบันของ DOM เป็นสตริงได้โดยใช้ page.html
print page . html
สิ่งนี้มีประโยชน์เป็นส่วนใหญ่สำหรับการดีบัก คุณควรหลีกเลี่ยงการทดสอบกับเนื้อหาของ page.html
และใช้วิธีการค้นหาที่ชัดเจนกว่าแทน
สุดท้ายนี้ ในไดรเวอร์ที่รองรับ คุณสามารถบันทึกภาพหน้าจอได้:
page . save_screenshot ( 'screenshot.png' )
หรือให้บันทึกและเปิดอัตโนมัติ:
save_and_open_screenshot
ภาพหน้าจอจะถูกบันทึกไปที่ Capybara.save_path
ซึ่งสัมพันธ์กับไดเร็กทอรีของแอป หากคุณจำเป็นต้องใช้ capybara/rails
Capybara.save_path
จะมีค่าเริ่มต้นเป็น tmp/capybara
ผู้ช่วยเหลือและผู้จับคู่ที่ยอมรับตัวเลือกจะแบ่งปันลายเซ็นวิธีการทั่วไปซึ่งรวมถึง:
อาร์กิวเมนต์เหล่านี้มักจะเป็นทางเลือกไม่ทางใดก็ทางหนึ่ง
อาร์กิวเมนต์ชื่อกำหนดตัวเลือกที่จะใช้ อาร์กิวเมนต์เป็นทางเลือกเมื่อผู้ช่วยเหลือสื่อถึงชื่อตัวเลือกอย่างชัดเจน (เช่น find_field
ใช้ :field
, find_link
ใช้ :link
ฯลฯ):
page . html # => '<a href="/">Home</a>'
page . find ( :link ) == page . find_link
page . html # => '<input>'
page . find ( :field ) == page . find_field
อาร์กิวเมนต์ตัวระบุตำแหน่งมักจะแสดงถึงข้อมูลที่สามารถแยกแยะองค์ประกอบที่ตรงกับตัวเลือกจากองค์ประกอบที่ไม่มีความหมายได้มากที่สุด:
page . html # => '<div id="greeting">Hello world</div>'
page . find ( :css , 'div' ) . text # => 'Hello world'
page . find ( :xpath , './/div' ) . text # => 'Hello world'
วิธีการค้นหาวัตถุประสงค์ทั่วไป เช่น find
และ all
สามารถยอมรับตัวระบุตำแหน่งเป็นอาร์กิวเมนต์ตำแหน่งแรกได้ เมื่อวิธีการดังกล่าวสามารถอนุมานค่าเริ่มต้นจากการกำหนดค่า Capybara.default_selector
: