2011-08-03 39 views
55

Tôi đã thử một số ví dụ được tìm thấy trực tuyến, nhưng không có may mắn. Tôi đang tìm cách xác nhận thông báo xác nhận của liên kết xóa. Nỗ lực cuối cùng là mã bên dưới, nhưng điều đó dẫn đến lỗi Capybara :: NotSupportedByDriverError.Làm cách nào để xác nhận một cửa sổ bật lên javascript với Capybara?

def confirm_dialog 
    page.evaluate_script('window.confirm = function() { return true; }') 
end 
+0

trùng lặp có thể xảy ra [Làm thế nào để kiểm tra một hộp thoại xác nhận với dưa chuột?] (http://stackoverflow.com/questions/2458632/how-to-test-a-confirm-dialog-with-cucumber). Tác giả của câu trả lời được chấp nhận đồng ý với bản sao. –

+1

Bản sao bị từ chối. –

+0

Xem câu trả lời của tôi ở đây để có cách mới hơn để thực hiện việc này: http://stackoverflow.com/a/26472467/2170577 –

Trả lời

2

Tôi đoán bạn phải thêm selen vào tệp đá quý và định cấu hình nó và capybara mà capybara sử dụng selen làm trình điều khiển.

Tôi cũng nghĩ rằng How to test a confirm dialog with Cucumber? rất giống với câu hỏi của bạn, đặc biệt là câu trả lời được chấp nhận.

2

cố gắng thêm :js => true vào thử nghiệm của bạn.

RSpec’s metadata feature can be used to switch to a different driver. Use :js => true to switch to the javascript driver, or provide a :driver option to switch to one specific driver. For example:

it 'will use the default js driver' :js => true do 
    ... 
end 
47

Trước hết chuyển sang sử dụng Selenium như trình điều khiển bằng cách đặt một thẻ @javascript trước kịch bản của bạn.

Các mã sau trong bước dưa chuột của bạn sau đó sẽ xác nhận đối thoại:

page.driver.browser.switch_to.alert.accept 
# or 
page.driver.browser.switch_to.alert.dismiss 
# or 
page.driver.browser.switch_to.alert.text 

Như @NobbZ nói, câu hỏi này đã được hỏi và trả lời trước đây: How to test a confirm dialog with Cucumber?.

Nhiều tài liệu selen có sẵn ở đây quá: http://code.google.com/p/selenium/wiki/RubyBindings#JavaScript_dialogs

+2

phương thức chưa xác định 'switch_to 'cho # Dima

+1

Tôi hiểu rằng không xác định lỗi phương pháp và sau đó phát hiện ra rằng tôi không cần switch_to gọi ở tất cả vì selenium (tôi nghĩ) được tự động trả về true trên bất kỳ xác nhận nào. Điều đó sẽ không giúp được mọi người, nhưng có thể giúp một số. – elc

+1

@DimaGoltsman Bạn đang sử dụng RackTest. câu trả lời đề cập đến trình điều khiển selen. Bạn cần phải thiết lập trình điều khiển trước khi thử nghiệm được chạy bởi '' Capybara.current_driver =: selenium'' hoặc thêm js: true vào ví dụ nên đặt trình điều khiển thành '': selenium'' theo mặc định vì nó là mặc định '' Capybara.javascript_driver'' – Nultyi

14

cho Capybara-webkit:

page.driver.browser.accept_js_confirms 
page.driver.browser.reject_js_confirms 

mà vẫn làm việc, nhưng các tài liệu cũng nói:

page.driver.accept_js_confirms! 
page.driver.accept_js_confirms! 

Xem https://github.com/thoughtbot/capybara-webkit, tìm kiếm "accept_js_confirms"

+2

Nó đã làm việc cho tôi với page.driver.accept_js_confirms! (thực sự từ https://github.com/thoughtb/-apybara-webkit) – Adrien

+1

hiện tại dòng này hoạt động cho capybara: page.driver.browser.switch_to.alert.accept –

+0

Có vẻ như một trong số đó phải là trang. driver.reject_js_confirms! – retroGiant

6

Tôi đã phải sử dụng một giấc ngủ trong các thử nghiệm webkit vì nó sẽ thất bại everynow và sau đó nếu không.

Dưới đây là những gì tôi đã đưa ra sau khi đọc bài viết của mọi người:

if page.driver.class == Capybara::Selenium::Driver 
    page.driver.browser.switch_to.alert.accept 
elsif page.driver.class == Capybara::Webkit::Driver 
    sleep 1 # prevent test from failing by waiting for popup 
    page.driver.browser.accept_js_confirms 
else 
    raise "Unsupported driver" 
end 
+0

làm việc rất tốt cho tôi, cảm ơn. – juanpastas

+0

Vâng, chỉ cần thực sự cẩn thận không thêm quá nhiều trong số đó, nó làm cho thử nghiệm của bạn thực sự tốn kém để chạy (tức là họ sẽ mất nhiều thời gian vì ngủ) –

7

Tôi đã có vấn đề thời gian với các hộp thoại trình duyệt trong một môi trường CI vì vậy tôi bỏ phiếu cho một hộp thoại trước khi chấp nhận nó:

def accept_browser_dialog 
    wait = Selenium::WebDriver::Wait.new(:timeout => 30) 
    wait.until { 
    begin 
     page.driver.browser.switch_to.alert 
     true 
    rescue Selenium::WebDriver::Error::NoAlertPresentError 
     false 
    end 
    } 
    page.driver.browser.switch_to.alert.accept 
end 
24

Thêm câu trả lời cho những người đạt được điều này trong năm 2016 và hơn thế nữa. Bây giờ bạn có thể sử dụng trực tiếp Capybara để chấp nhận một hộp xác nhận. Bạn làm điều này bằng cách gói mã khiến hộp xác nhận xuất hiện trong hàm accept_confirm.

accept_confirm do 
    click_link 'Destroy' 
end 
+2

Xin chào từ tương lai (2017). Cảm ơn bạn vì câu trả lời này. – user1515295

+0

Bạn đang rất hoan nghênh :) – retroGiant

2

Trong Capybara, rất đơn giản để chấp nhận cửa sổ mô hình. Thậm chí chúng ta có thể làm tương tự trong selen nhưng hơi khó khăn đối với những người không biết về selen.

#This page.accept_modal sẽ chấp nhận cửa sổ modal

#This page.dismiss_modal sẽ chối/Loại bỏ các cửa sổ modal

+0

Điều này trả về cho tôi 'NoMethodError: phương thức riêng 'accept_modal' được gọi là # ' – Ruff9

Các vấn đề liên quan