karim79
karim79

Reputation: 342665

How do I use Watir::Waiter::wait_until to force Chrome to wait?

I'm trying to tell my watir script to wait for an ajax-injected login box to open up. I am using watir-webdriver, and testing in Chrome. I cannot get wait_until to work, as commented in the below (simplified) script.

require "rubygems"
require "watir-webdriver"
b = Watir::Browser.new(:chrome)
site = "www.example.com"
b.goto site

puts "Click on Sign In button"
b.link(:id, 'btnLogin').click

puts "Waiting for the username/password dialog to show up"

# Below line does *not* work
# Throws this error: "uninitialized constant Watir::Waiter (NameError)" 
Watir::Waiter::wait_until { b.text_field(:id, 'username').exists? }

# Below line does *not* work
# Throws this error: "undefined method `wait_until' for main:Object (NoMethodError)" 
wait_until { b.text_field(:id, 'username').exists? }

# Below line *does* work, but I don't want to use it.
sleep 1 until b.text_field(:id, 'username').exists?

Is Watir::Waiter an IE-only class? Or what am I doing wrong, the sleep 1 wait method works just fine. I am new to Ruby and watir, I literally just picked this up yesterday so I'm half expecting this to be a result of my noobaciousness.

In case it is relevant, I am working on a mac (OSX v. 10.6.5).

Upvotes: 17

Views: 23287

Answers (3)

unknownbits
unknownbits

Reputation: 2885

You can also set timeout with browser.it will wait for it 700 seconds, like this.

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 700 # seconds � default is 60 second
ie=Watir::Browser.new:firefox, :http_client => client

Upvotes: 2

sbos61
sbos61

Reputation: 564

I run into the same issue few weeks ago. The point is that Watir::Wait.until{} waits ONLY for the main page to load (tested mainly on Firefox). If you have some JavaScript code loading other components, these are not waited for.

So, the only solution is to pick and element and explicitly wait for it to appear (using methods 2 & 3).

Upvotes: 1

jarib
jarib

Reputation: 6058

Do this first:

require "watir-webdriver/wait"

Then try these:

1

Watir::Wait.until { ... }

2

browser.text_field(:id => 'username').when_present.set("name")

3

browser.text_field(:id => 'username').wait_until_present

Note that "present" here means "the element both exists and is visible".

Upvotes: 28

Related Questions