module Capybara::Selenium::Scroll
def scroll_by(x, y)
def scroll_by(x, y) driver.execute_script <<~JS, self, x, y var el = arguments[0]; if (el.scrollBy){ el.scrollBy(arguments[1], arguments[2]); } else { el.scrollTop = el.scrollTop + arguments[2]; el.scrollLeft = el.scrollLeft + arguments[1]; } JS end
def scroll_element_to_location(element, location)
def scroll_element_to_location(element, location) scroll_opts = case location when :top 'true' when :bottom 'false' when :center "{behavior: 'instant', block: 'center'}" else raise ArgumentError, "Invalid scroll_to location: #{location}" end driver.execute_script <<~JS, element arguments[0].scrollIntoView(#{scroll_opts}) JS end
def scroll_to(element, location, position = nil)
def scroll_to(element, location, position = nil) # location, element = element, nil if element.is_a? Symbol if element.is_a? Capybara::Selenium::Node scroll_element_to_location(element, location) elsif location.is_a? Symbol scroll_to_location(location) else scroll_to_coords(*position) end self end
def scroll_to_coords(x, y)
def scroll_to_coords(x, y) driver.execute_script <<~JS, self, x, y if (arguments[0].scrollTo){ arguments[0].scrollTo(arguments[1], arguments[2]); } else { arguments[0].scrollTop = arguments[2]; arguments[0].scrollLeft = arguments[1]; } JS end
def scroll_to_location(location)
def scroll_to_location(location) driver.execute_script <<~JS, self if (arguments[0].scrollTo){ arguments[0].scrollTo(0, #{SCROLL_POSITIONS[location]}); } else { arguments[0].scrollTop = #{SCROLL_POSITIONS[location]}; } JS end