Search code examples
rubywatirwatir-webdriverruby-1.9.3

Watir. Scroll to a certain point of the page


I am trying to automate an online survey on a website but I get this error each time:

Selenium::WebDriver::Error::UnknownError: unknown error: Element is not clickable at  
point (561, 864). Other element would receive the click: a id="habla_oplink_a"       

class="habla_oplink_a_normal hbl_pal_header_font_size hbl_pal_title_fg "

What I need to understand is how I can scroll to a certain point of the page so that my script can resume filling out the survey on the page.

This is my code that manages to fill out a portion of the survey but fails when it reaches a row which is not in view inside the browser (a row that requires the user to scroll down to):

buttons = browser.elements(:class => "assessment-choice")

buttons.each do |button|
  button.click
end

I would also like to be able to change my code so that it only selects a specific option but the HTML on the page is not very friendly.

This is the webpage I am looking at: https://staging2.clearfit.com/assessment/assessment/95867fb272df436352a0bd5fbdd

The HTML of one of the options on the survey:

<a id="answers_79_0" class="assessment-choice" onmouseover="answerOver(this)"    onmouseout="answerOut(this)" onclick="setAssessmentAnswer(this, 3, '0', '79',   '#answers_49839163')">Strongly<br>Agree</a>

Solution

  • Using execute_script

    To scroll to an element, you will need to execute javascript:

    browser.execute_script('arguments[0].scrollIntoView();', button)
    

    This can be seen to be working in the following script. Without the line to scroll, a chat tab overlays one of the buttons causing an exception.

    require 'watir-webdriver'
    
    browser = Watir::Browser.new :chrome
    browser.goto 'https://staging2.clearfit.com/assessment/assessment/95867fb272df436352a0bd5fbdd'
    
    buttons = browser.elements(:class => "assessment-choice")
    
    buttons.each do |button|
        browser.execute_script('arguments[0].scrollIntoView();', button)
        button.click
    end
    

    Using the watir-scroll gem

    Note that you can install the watir-scroll gem to make the scrolling line nicer. The gem allows the line to simply be:

    browser.scroll.to button
    

    The script would then look like:

    require 'watir-webdriver'
    require 'watir-scroll'
    
    browser = Watir::Browser.new :chrome
    browser.goto 'https://staging2.clearfit.com/assessment/assessment/95867fb272df436352a0bd5fbdd'
    
    buttons = browser.elements(:class => "assessment-choice")
    
    buttons.each do |button|
        browser.scroll.to button
        button.click
    end