2012-01-25 19 views
15

Khi tôi chạy rspec, có thể báo cáo capybara/selenium bất kỳ bảng điều khiển javascript nào. Các trường hợp ngoại lệ và các ngoại lệ khác quay lại rspec?Có cách nào để in javascript console.errors đến thiết bị đầu cuối với Rspec/Capybara/Selenium không?

Tôi có toàn bộ các thử nghiệm không thành công, nhưng ứng dụng của tôi đang hoạt động khi tôi kiểm tra thủ công. Nếu không biết các lỗi javascript có khả năng chặn ứng dụng web một trang của tôi chỉ trong khi thử nghiệm, thật khó để tìm ra lý do tại sao các thử nghiệm không thành công.

Tôi đã xem xét và chưa thực sự tìm được giải pháp cho điều này.

Trả lời

3

Tôi không biết điều này có giúp ích hay không, nhưng bạn có thể thử chuyển sang trình điều khiển capybara-webkit của thinkbot. Đó là một thay thế cho Selenium không có đầu, nghĩa là nó không mở trình duyệt để chạy thử nghiệm. Khi tôi chạy thử nghiệm của tôi bằng cách sử dụng trình điều khiển này (trong một thiết lập RSpec + Capybara), tất cả các lỗi Javascript được in nội tuyến với đầu ra RSpec của tôi.

Tôi chưa bao giờ thử chuyển từ Selenium sang capybara-webkit, vì vậy tôi không biết tính khả thi của dự án hiện tại như thế nào. Nếu bạn không làm bất cứ điều gì thực sự ưa thích với Selenium, quá trình chuyển đổi có thể khá trơn tru. Tuy nhiên, nếu bạn phụ thuộc vào việc có thể xem các bài kiểm tra đang chạy trong trình duyệt, hoặc có một số nhu cầu cụ thể khác đối với Selenium, thì câu trả lời của tôi sẽ không được sử dụng nhiều.

Bạn có thể tìm Capybara-webkit đây: https://github.com/thoughtbot/capybara-webkit

Bắt nó được cài đặt có thể là một nỗi đau, bởi vì bạn cần thư viện Qt4. Nếu bạn chưa có Qt4 trên hệ thống của mình, quá trình tạo có thể mất thời gian dài. Đối với tôi, nó cũng có giá trị rắc rối. Tôi thích capybara-webkit hơn bất kỳ giải pháp nào khác mà tôi đã thử.

+0

Tôi sử dụng đá quý thường xanh với capybara-webkit. Ngoài một số vấn đề phân tích cú pháp nó có vẻ là làm việc ok. –

6

Đây không phải là điều tuyệt vời, nhưng bạn có thể tiêm tập lệnh để đưa lỗi vào DOM và xem những thay đổi đó thông qua Selenium.

Cụ thể hơn, hãy chèn tập lệnh vào mỗi trang ghi đè window.onerror hoặc console sao cho lỗi thêm thông tin vào một số nút ẩn mà bạn đã chèn vào DOM. Sau đó, thông qua Selenium, định kỳ kiểm tra và làm trống nội dung của phần tử đó, in dữ liệu đã làm trống vào bảng điều khiển Java.

+1

Một chút quá phức tạp. Tôi nghĩ rằng ai đó đã làm điều này. Cảm ơn mặc dù. –

12

Có một mẫu mã ở cuối gist này https://gist.github.com/gkop/1371962 (một từ alexspeller) đã làm việc rất độc đáo đối với tôi.

tôi đã kết thúc làm điều này trong bối cảnh các cuộc thử nghiệm JS Tôi đã cố gắng để gỡ lỗi

after(:each) do 
    errors = page.driver.browser.manage.logs.get(:browser) 
    if errors.present? 
    message = errors.map(&:message).join("\n") 
    puts message 
    end 
end 
+1

một biến thể khác của điều này mà tôi thấy hữu ích: 'mong đợi (page.driver.browser.manage.logs.get (: trình duyệt) .select {| m | m.level == 'SEVERE'}. Chiều dài) .to eq (0) ' – Julie

1

tôi đang làm một cái gì đó tương tự như Leo, nhưng bao gồm các bản ghi trình duyệt như là một phần của thông điệp thử nghiệm thất bại:

def check_browser_logs_after_each_test(rspec_config) 
    rspec_config.before(:each) { 
    @prev_browser_logs = @browser.driver.manage.logs.get(:browser) 
    } 

    rspec_config.after(:each) { 
    logs = @browser.driver.manage.logs.get(:browser) 
    new_logs = logs - @prev_browser_logs 
    if example.exception then 
     s = new_logs.map { |l| l.to_s }.join("\n") 
     example.exception.message << "\nConsole logs:\n#{s}" 
    else 
     new_logs.should eq [ ] 
    end 
    } 
end 
4

Đây là một cách khác, hiện đang làm việc với Selenium và Chrome không đầu (cũng nên hoạt động với Firefox).

Thêm thông tin sau vào spec/rails_helper.rb, trong khối RSpec.configure do |config| và tất cả thông số kỹ thuật có thông số js: true sẽ hiển thị lỗi JS.

class JavaScriptError< StandardError; end 
RSpec.configure do |config| 
    config.after(:each, type: :feature, js: true) do |spec| 
    errors = page.driver.browser.manage.logs.get(:browser) 
       .select {|e| e.level == "SEVERE" && e.message.present? } 
       .map(&:message) 
       .to_a 
    if errors.present? 
     raise JavaScriptError, errors.join("\n\n") 
    end 
    end 
end 

Mã là sự thích nghi của this.

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