How to get a Selenium/Ruby bot to wait before performing an action?

Joe Morano picture Joe Morano · Mar 3, 2016 · Viewed 12.9k times · Source

I'm building a Selenium/Ruby web bot that clicks on elements. The problem is, sometimes there isn't enough time for the page to load before the bot decides it can't find the element.

What's the Ruby way to get Selenium to wait before performing an action? I would prefer explicit waiting, but I'm fine with implicit waiting too.


I tried to use the wait.until method:

require "selenium-webdriver"
require "nokogiri"
driver = Selenium::WebDriver.for :chrome
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
driver.navigate.to "http://google.com"
driver.wait.until.find_element(:class, "gb_P").click

But I'm getting the following error:

Undefined method 'wait' for <Selenium::WebDriver>

I also tried:

require "watir-webdriver/wait"
...
driver.find_element(:class, "gb_P").wait_until.click

but that's also giving me an undefined method error:

undefined method `when_present' for #<Selenium::WebDriver...>

Answer

Guy picture Guy · Mar 6, 2016

You are using wait as WebDriver function, but it isn't. Try this

element = wait.until { driver.find_element(:class => "gb_P") }
element.click