Để thêm vào khối kiến thức hiện có tại đây:
Đối với các bài kiểm tra JS, Capybara phải giữ hai luồng (một cho RSpec, một cho Rails) và một quá trình thứ hai (trình duyệt) đồng bộ. Nó thực hiện điều này bằng cách chờ (lên đến thời gian chờ tối đa đã định cấu hình) trong hầu hết các phương pháp tìm nút và đối sánh.
Capybara chủ yếu cũng có các phương thức không chờ đợi Node#all
. Sử dụng chúng giống như nói với thông số kỹ thuật của bạn rằng bạn muốn chúng không liên tục.
Câu trả lời được chấp nhận gợi ý page.first('selector')
. Điều này là không mong muốn, ít nhất là đối với các thông số kỹ thuật JS, bởi vì việc Node#first
sử dụngNode#all
.
Điều đó nói rằng, Node#first
sẽ đợi nếu bạn cấu hình Capybara như vậy:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Tùy chọn này đã được thêm vào Capybara 2.5.0 và là sai theo mặc định.
Như Andrei đã đề cập, thay vào đó bạn nên sử dụng
find('selector', match: :first)
hoặc thay đổi bộ chọn của bạn. Một trong hai sẽ hoạt động tốt bất kể cấu hình hoặc trình điều khiển.
Để làm phức tạp thêm mọi thứ, trong các phiên bản cũ của Capybara (hoặc với tùy chọn cấu hình được bật), #find
sẽ vui vẻ bỏ qua sự mơ hồ và chỉ trả lại bộ chọn phù hợp đầu tiên. Điều này cũng không tuyệt vời vì nó làm cho thông số kỹ thuật của bạn ít rõ ràng hơn, điều mà tôi tưởng tượng là lý do tại sao không còn là hành vi mặc định nữa. Tôi sẽ để lại các chi tiết cụ thể vì chúng đã được thảo luận ở trên.
Nhiêu tai nguyên hơn: