Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 426
Sam Avatar asked Nov 15 '13 06:11

Sam


People also ask

What is the default timeout for Watir’s waits?

The default timeout for Watir’s Waits is 30 seconds. You can pass in the :timeout keyword parameter to any of the wait methods, or you can change the global default with: As of 6.15 #wait_while_present and #wait_until_present are deprecated.

How to open the browser using Watir?

The required browser drivers are installed along with Watir installation. In case you face any issues working with browsers, install the driver as shown in the Browsers drivers chapter and update the location in PATH variable. In this chapter, we will understand how to open the browser using Watir. Click on OK to create the file.

What is the timeout in webdriverio?

The testing framework you’re using with WebdriverIO has to deal with timeouts, especially since everything is asynchronous. It ensures that the test process doesn't get stuck if something goes wrong. By default, the timeout is 10 seconds, which means that a single test should not take longer than that.

How does webdriverio handle time in selenium?

Each command in WebdriverIO is an asynchronous operation. A request is fired to the Selenium server (or a cloud service like Sauce Labs ), and its response contains the result once the action has completed or failed. Therefore, time is a crucial component in the whole testing process.


1 Answers

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.

like image 148
Justin Ko Avatar answered Sep 28 '22 10:09

Justin Ko