Watir. Scroll to a certain point of the page
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
how to scroll a web page using watir
If you have JavaScript enabled, you can access the underlying driver and execute some JavaScript to scroll on the page.
@browser.driver.executeScript("window.scrollBy(0,200)")
will scroll down the page 200 pixels along the y axix.
See here for documentation of the method:
http://www.w3schools.com/jsref/met_win_scrollby.asp
How to scroll within a table using watir-scroll
Making an element scrollable is often done by setting the overflow
style. It is likely on a div
that contains the table
. For example:
<html>
<body>
<div style="overflow:scroll; height:250px;">
<table>
<tr height="200px"><td>Cell A</td></tr>
<tr height="200px"><td>Cell B</td></tr>
<tr height="200px"><td>Cell C</td></tr>
<tr height="200px"><td>Cell D</td></tr>
</table>
</div>
</body>
</html>
There are no built-in methods in Watir (at least as of v6.17.0) for scrolling an element. However, there are still some workarounds.
Set scrollTop
You can set the scroll position of the element by setting its scrollTop
property:
# Get the element that has the overflow property
div = browser.div
# Scroll to a specific point
div.execute_script('arguments[0].scrollTop = 100;', div)
# Scroll down a certain amount
div.execute_script('arguments[0].scrollTop += 50;', div)
Send Keys
Depending how your application is listening for the scrolled event, setting the scrollTop
might not trigger the loading of rows. An approach that is more likely to be detected is by sending the :down
or :page_down
keyboard keys - ie more like a real user.
It looks like both Watir and Selenium-WebDriver prevent using #send_keys
for this (throws not interactable errors), so you'll need to use the action builder:
# Get the element that has the overflow property
div = browser.div
# Scroll down a bit
browser.wd.action.send_keys(div.wd, :down).perform
browser.wd.action.send_keys(div.wd, :page_down).perform
# Scroll to the bottom
browser.wd.action.send_keys(div.wd, :end).perform
Watir scroll down the page as long as there is more content to show
You can check if a scrollable element is at the bottom by comparing its scrollTop and scrollHeight.
The following work:
scrollable = browser.div(class: 'j6cq2') # div with overflow-y=scroll
until browser.execute_script('return arguments[0].scrollTop + arguments[0].clientHeight >= arguments[0].scrollHeight', scrollable) do
browser.execute_script('arguments[0].scrollTop = arguments[0].scrollHeight', scrollable)
sleep(1)
end
Note that I didn't have time to find a better solution than using #sleep. However, hopefully this gives you an idea.
Attempt to scroll an element to the centre of the viewport
IE & Firefox implement elementScrollBehavior
. It is set for all elements for the entire session of the driver. Where 0
is default and places element at the top of the view port, and 1
scrolls the element to the bottom of the view port.
caps = Selenium::WebDriver::Remote::Capabilities.firefox('elementScrollBehavior' => 1)
Watir::Browser.new :firefox, desired_capabilities: caps
For more control you would need to use javascript (Watir should probably investigate more direct support for scrolling to an offset of an element).
browser.execute_script('javascript:window.scrollBy(250,350)')
Scrolling inside a form in Watir
My guess is that this is a custom scrollable element that hides the content with the overflow: hidden
style. Elements in the overflow are not considered visible/present. When you manually scroll, you're bringing the element out of the overflow so that it's present.
I've seen a couple of these in the past. Each one needed a different approach for scrolling. Without the exact HTML/CSS, it's hard to say how to scroll the element.
However, if you're not trying to test the scrolling, you could manually fire the click event. This will bypass the visibility requirements:
@browser.button(class: xxx).click!
Watir-scroll gives an error when scrolling to element
As of Watir-Scroll v0.2, the browser-level scrolling no longer supports scrolling to an element.
The equivalent of:
@browser.scroll.to page_element_xy
Is now:
page_element_xy.scroll.to :top
Scrolling to the top of the element is the default, so you can simply do:
page_element_xy.scroll.to
Ruby watir webdriver: how to keep scrolling through lazy loading
If you are looking to determine the last link on a page with lazy loaded but limited list of options you can do something along the lines of:
loop do
link_number = browser.links.size
browser.scroll.to :bottom
break if browser.links.size == link_number
end
Related Topics
Retrieve Contents of Url as String
Ruby: No Such File or Directory @ Rb_Sysopen - Testfile (Errno::Enoent)
Don't Have Jekyll-Paginate or One of Its Dependencies Installed
Truncate String to the First N Words
How to Reference a Lambda from Within Itself Using Ruby
Nokogiri Error When Running Bundle Install
Strategies for Overriding Database.Yml
How to Include a Yaml File Inside a Yaml File in Ruby
Rake Assets:Precompile Gets Killed When There Is a Console Session Open in Production
In Ruby/Rails, How to Encode/Escape Special Characters in Urls
Understanding Method_Added for Class Methods
Passenger Installation with Nginx Fails
Differencebetween "Rails S" and "Bundle Exec Rails S"
Routing Error - Uninitialized Constant