Is it possible to globally increase Watir-Webdriver when_present wait time?
Asked Answered
A

1

6

I am writing an automated testing program which will test some web programs that are sometimes slow to load certain AJAX calls. For instance the user will click 'Query' which will result in a HTML 'loading' overlay for anywhere from 15 to 90 seconds. When the search completes, it will then update a table on the same page with the results.

So obviously I can increase the waiting time individually like so:

browser.td(:id => 'someId').when_present.some_action #=> will wait 30 seconds
browser.td(:id => 'someId').when_present(90).some_action #=> will wait *90* seconds

But is there a way to modify (in my case increase) the time so Watir-Webdriver always waits 90 seconds on .when_present like so:

browser.some_default = 90
browser.td(:id => 'someId').when_present.some_action #=> will wait *90* seconds

A few words of warning: Client timeout will not affect when_present. Nor will implicit wait.

Ailey answered 15/11, 2013 at 6:30 Comment(0)
M
9

Update: This monkey patch has been merged into watir-webdriver and so will no longer be needed in watir-webdriver v0.6.5. You will be able to set the timeout using:

Watir.default_timeout = 90

The wait methods are defined similar to:

def when_present(timeout = 30)
  message = "waiting for #{selector_string} to become present"

  if block_given?
    Watir::Wait.until(timeout, message) { present? }
    yield self
  else
    WhenPresentDecorator.new(self, timeout, message)
  end
end

As you can see, the default timeout of 30 seconds is hard-coded. Therefore, there is no easy way to change it everywhere.

However, you could monkey patch the wait methods to use a default time and set it to what you want. The following monkey patch will set the default timeout to 90 seconds.

require 'watir-webdriver'
module Watir

  # Can be changed within a script with Watir.default_wait_time = 30    
  @default_wait_time = 90  
  class << self
    attr_accessor :default_wait_time    
  end

  module Wait

    class << self
      alias old_until until
      def until(timeout = Watir.default_wait_time, message = nil, &block)
        old_until(timeout, message, &block)
      end

      alias old_while while
      def while(timeout = Watir.default_wait_time, message = nil, &block)
        old_while(timeout, message, &block)
      end

    end # self
  end # Wait

  module EventuallyPresent

    alias old_when_present when_present
    def when_present(timeout = Watir.default_wait_time, &block)
      old_when_present(timeout, &block)
    end

    alias old_wait_until_present wait_until_present
    def wait_until_present(timeout = Watir.default_wait_time)
      old_wait_until_present(timeout)
    end

    alias old_wait_while_present wait_while_present
    def wait_while_present(timeout = Watir.default_wait_time)
      old_wait_while_present(timeout)
    end

  end # EventuallyPresent
end # Watir

Include the patch after the watir webdriver code is loaded.

Manganate answered 15/11, 2013 at 14:17 Comment(2)
Newish to Ruby and hadn't extended much before now. This appears to work for me perfectly and was just the thing I needed. Thank you!Ailey
Instead of the monkey patching, you could of course send a pull request to watir-webdriver that proposes this change.Tales

© 2022 - 2024 — McMap. All rights reserved.