22

Tôi có một dòng thực sự đơn giản trong một thử nghiệm mà các cuộc gọi thực thi kịch bản như thế này:Làm thế nào để trả về một giá trị khi sử dụng execute_script trong capybara?

puts page.execute_script("return somefunction();").to_i.inspect 

Và trong javascript Tôi có một chức năng như thế này:

function somefunction(){ 
    console.log("test"); 
    return 999; 
} 

Các 'test' từ giao diện điều khiển đăng nhập đang nhận được đăng xuất vì vậy nó đang chạy tuy nhiên ...

Nhìn vào nhật ký khi chạy thử nghiệm, hàm execute_script trả về 0 không 999, vì vậy trong rspec tôi không thể nhận được giá trị trả về từ hàm, cách thực hiện Tôi trả về page.execute_script giá trị đó từ hàm đó?

+0

nào lái xe bạn đang sử dụng? Dường như nó hoạt động với ít nhất Selenium-Webdriver. –

+0

Đó là Poltergeist. – Smickie

Trả lời

33

Người tài xế Poltergeist được thiết kế để trở lại con số không cho execute_script:

def execute_script(script) 
    browser.execute(script) 
    nil 
end 

Poltergeist sẽ chỉ trả lại một giá trị nếu bạn sử dụng evaluate_script:

def evaluate_script(script) 
    browser.evaluate(script) 
end 

Capybara có phương pháp tương ứng cho mỗi - tức là Session#execute_scriptSession#evaluate_script. code của bạn nên làm việc nếu bạn chuyển sang sử dụng evaluate_script (và như @AndreyBotalov chỉ ra, bạn cũng cần phải loại bỏ các return):

puts page.evaluate_script("somefunction();").to_i.inspect 
+1

Lưu ý rằng câu trả lời này sẽ không hoạt động với Selenium vì Capybara sẽ chèn 'return'. –

+0

@AndreyBotalov, tôi đã sửa mã để xóa 'trả về' khi sử dụng' eval_script'. Bao gồm 'return' sẽ ném một ngoại lệ cho cả Selenium và Poltergeist. –

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