2011-01-27 37 views
14

Theo mặc định, Selenium chạy nhanh nhất có thể qua các tình huống mà tôi đã xác định bằng cách sử dụng Cucumber. Tôi muốn thiết lập để nó chạy ở tốc độ thấp hơn, vì vậy tôi có thể nắm bắt một video của quá trình.Làm thế nào tôi có thể chạy Selenium (sử dụng thông qua Capybara) ở tốc độ thấp hơn?

Tôi đã tìm ra rằng một thể hiện của Selenium::Client::Driver có phương thức set_speed. Tương ứng với Java API.

Tôi làm cách nào để có được phiên bản của lớp Selenium::Client::Driver? Tôi có thể nhận được như xa như page.driver, nhưng mà trả về một thể hiện của Capybara::Driver::Selenium.

Trả lời

21

Cảm ơn http://groups.google.com/group/ruby-capybara/msg/6079b122979ffad2 để biết gợi ý.

Chỉ cần lưu ý rằng điều này sử dụng giấc ngủ của Ruby, do đó, nó hơi không chính xác - nhưng nên thực hiện công việc cho bạn. Ngoài ra, thực hiện được gọi là cho tất cả mọi thứ vì vậy đó là lý do tại sao nó chờ đợi thứ hai. Các bước trung gian - đợi cho đến khi sẵn sàng, kiểm tra trường, lấy nét, nhập văn bản - mỗi lần tạm dừng.

Tạo một "throttle.rb" trong thư mục/hỗ trợ các tính năng của bạn (nếu sử dụng dưa chuột) và điền nó với:

require 'selenium-webdriver' 
module ::Selenium::WebDriver::Firefox 
    class Bridge 
    attr_accessor :speed 

    def execute(*args) 
     result = raw_execute(*args)['value'] 
     case speed 
     when :slow 
      sleep 0.3 
     when :medium 
      sleep 0.1 
     end 
     result 
    end 
    end 
end 

def set_speed(speed) 
    begin 
    page.driver.browser.send(:bridge).speed=speed 
    rescue 
    end 
end 

Sau đó, trong một định nghĩa bước, hãy gọi:

set_speed(:slow) 

hoặc:

set_speed(:medium) 

Để thiết lập lại, gọi:

set_speed(:fast) 
+0

thx for the gợi ý! chỉ trong trường hợp 'trang' không có sẵn, hoặc bao gồm' Capybara :: DSL' hoặc thay thế bằng 'Capybara.current_session' – RngTng

2

Là bản cập nhật, phương thức thực thi trong lớp đó không còn khả dụng nữa. Bây giờ ở đây chỉ là:

module ::Selenium::WebDriver::Remote

tôi cần thiết để tăng tốc một số xét nghiệm trong IE và điều này làm việc.

+0

bạn có thể đưa ra một ví dụ mã đầy đủ xin vui lòng :) tanx. –

+1

@MischaMolhoek Sử dụng mã ở trên và thay thế 'module :: Selenium :: WebDriver :: Firefox' bằng 'module :: Selenium :: WebDriver :: Remote'! : D Tôi hiện đang sử dụng tính năng w/rspec này và có nó trong 'spec/support/throttle.rb' gọi' set_speed: medium' trong khối trước của thông số tính năng của tôi. Hoạt động tốt khi có nhiều css và selen quá nhanh. Cảm ơn @phil vì đã cập nhật! –

+0

@rbatta, tanx :) –

0

Các phương pháp được đề cập trong chuỗi này không còn hoạt động với Trình quản trị trang web Selenium v3 nữa.

Thay vào đó, bạn sẽ cần phải thêm chế độ ngủ vào lệnh thực thi.

module Selenium::WebDriver::Remote 
    class Bridge 
    def execute(command, opts = {}, command_hash = nil) 
     verb, path = commands(command) || raise(ArgumentError, "unknown command: #{command.inspect}") 
     path = path.dup 

     path[':session_id'] = session_id if path.include?(':session_id') 

     begin 
     opts.each { |key, value| path[key.inspect] = escaper.escape(value.to_s) } 
     rescue IndexError 
     raise ArgumentError, "#{opts.inspect} invalid for #{command.inspect}" 
     end 

     Selenium::WebDriver.logger.info("-> #{verb.to_s.upcase} #{path}") 
     res = http.call(verb, path, command_hash) 
     sleep(0.1) # <--- Add your sleep here. 
     res 
    end 
    end 
end 

Lưu ý đây là cách rất dễ dàng để làm chậm thử nghiệm vì bạn đang vá một API riêng tư.

1

này sẽ làm việc, và ít giòn (đối với một số giá trị nhỏ "ít")

require 'selenium-webdriver' 
module ::Selenium::WebDriver::Remote 
    class Bridge 
    alias_method :old_execute, :execute 
    def execute(*args) 
     sleep(0.1) 
     old_execute(*args) 
    end 
    end 
end 
Các vấn đề liên quan