Class Scroller

  • All Implemented Interfaces:
    org.openqa.selenium.support.events.WebDriverListener

    public class Scroller
    extends Object
    implements org.openqa.selenium.support.events.WebDriverListener
    Automatically scrolls the element into view.

    Especially in the configuration page, the floating DIVs at the top and the bottom of the pages can interfere with WebDriver trying to click the elements underneath it.

    At least on Chrome (and possibly in other browsers), trying to interact with an element when it's below another element causes the following error:

     
     Tests run: 3, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 227.711 sec <<< FAILURE! - in plugins.AntPluginTest
     autoInstallAnt(plugins.AntPluginTest)  Time elapsed: 73.932 sec  <<< ERROR!
     org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (506, 967). Other element would receive the click: <div class="bottom-sticker-inner">...</div>
       (Session info: chrome=34.0.1847.116)
       (Driver info: chromedriver=2.10.267518,platform=Linux 3.13.0-24-generic x86_64) (WARNING: The server did not provide any stacktrace information)
     Command duration or timeout: 61 milliseconds
     Build info: version: '2.40.0', revision: '4c5c0568b004f67810ee41c459549aa4b09c651e', time: '2014-02-19 11:13:01'
     System info: host: 'jglick-t520', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-24-generic', java.version: '1.7.0_55'
     Session ID: 412a7b3ab0eb823da2cddd156e8d122c
     Driver info: org.openqa.selenium.chrome.ChromeDriver
     Capabilities [{platform=LINUX, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=/tmp/.com.google.Chrome.3Xt0hp}, rotatable=false, locationContextEnabled=true, version=34.0.1847.116, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=false, takesScreenshot=true}]
     	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
     	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
     	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
     	at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193)
     	at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
     	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:573)
     	at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:268)
     	at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:79)
     	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     	at java.lang.reflect.Method.invoke(Method.java:606)
     	at org.openqa.selenium.support.events.EventFiringWebDriver$EventFiringWebElement$1.invoke(EventFiringWebDriver.java:331)
     	at com.sun.proxy.$Proxy33.click(Unknown Source)
     	at org.openqa.selenium.support.events.EventFiringWebDriver$EventFiringWebElement.click(EventFiringWebDriver.java:344)
     	at org.jenkinsci.test.acceptance.po.CapybaraPortingLayer.clickButton(CapybaraPortingLayer.java:66)
     	at org.jenkinsci.test.acceptance.po.JenkinsConfig.addTool(JenkinsConfig.java:35)
     	at org.jenkinsci.test.acceptance.plugins.ant.AntInstallation.install(AntInstallation.java:37)
     	at plugins.AntPluginTest.autoInstallAnt(AntPluginTest.java:76)
     	
     

    This work around simply tries to scroll the element into a view before we interact with this. Originally developed in Ruby version of selenium-tests in lib/jenkins/capybara.rb.

    Author:
    ogondza, Kohsuke Kawaguchi
    • Constructor Summary

      Constructors 
      Constructor Description
      Scroller​(org.openqa.selenium.WebDriver driver)  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void afterGet​(org.openqa.selenium.WebDriver driver, String url)  
      void beforeClear​(org.openqa.selenium.WebElement element)  
      void beforeClick​(org.openqa.selenium.WebElement element)  
      void beforeSendKeys​(org.openqa.selenium.WebElement element, CharSequence[] keysToSend)  
      void disableStickyElements()
      Sometimes sticky elements (elements that are fixed in position on the page, such as the bottom app bar), appear on top of other elements, making those elements inaccessible.
      void scrollIntoView​(org.openqa.selenium.WebElement e)
      The framework is expected to take care of the correct scrolling.
      • Methods inherited from interface org.openqa.selenium.support.events.WebDriverListener

        afterAccept, afterActiveElement, afterAddCookie, afterAlert, afterAnyAlertCall, afterAnyCall, afterAnyNavigationCall, afterAnyOptionsCall, afterAnyTargetLocatorCall, afterAnyTimeoutsCall, afterAnyWebDriverCall, afterAnyWebElementCall, afterAnyWindowCall, afterBack, afterClear, afterClick, afterClose, afterDefaultContent, afterDeleteAllCookies, afterDeleteCookie, afterDeleteCookieNamed, afterDismiss, afterExecuteAsyncScript, afterExecuteScript, afterFindElement, afterFindElement, afterFindElements, afterFindElements, afterForward, afterFrame, afterFrame, afterFrame, afterFullscreen, afterGetAttribute, afterGetCookieNamed, afterGetCookies, afterGetCssValue, afterGetCurrentUrl, afterGetLocation, afterGetPageSource, afterGetPosition, afterGetSize, afterGetSize, afterGetTagName, afterGetText, afterGetText, afterGetTitle, afterGetWindowHandle, afterGetWindowHandles, afterImplicitlyWait, afterIsDisplayed, afterIsEnabled, afterIsSelected, afterMaximize, afterNewWindow, afterPageLoadTimeout, afterParentFrame, afterPerform, afterQuit, afterRefresh, afterResetInputState, afterSendKeys, afterSendKeys, afterSetPosition, afterSetScriptTimeout, afterSetSize, afterSubmit, afterTo, afterTo, afterWindow, beforeAccept, beforeActiveElement, beforeAddCookie, beforeAlert, beforeAnyAlertCall, beforeAnyCall, beforeAnyNavigationCall, beforeAnyOptionsCall, beforeAnyTargetLocatorCall, beforeAnyTimeoutsCall, beforeAnyWebDriverCall, beforeAnyWebElementCall, beforeAnyWindowCall, beforeBack, beforeClose, beforeDefaultContent, beforeDeleteAllCookies, beforeDeleteCookie, beforeDeleteCookieNamed, beforeDismiss, beforeExecuteAsyncScript, beforeExecuteScript, beforeFindElement, beforeFindElement, beforeFindElements, beforeFindElements, beforeForward, beforeFrame, beforeFrame, beforeFrame, beforeFullscreen, beforeGet, beforeGetAttribute, beforeGetCookieNamed, beforeGetCookies, beforeGetCssValue, beforeGetCurrentUrl, beforeGetLocation, beforeGetPageSource, beforeGetPosition, beforeGetSize, beforeGetSize, beforeGetTagName, beforeGetText, beforeGetText, beforeGetTitle, beforeGetWindowHandle, beforeGetWindowHandles, beforeImplicitlyWait, beforeIsDisplayed, beforeIsEnabled, beforeIsSelected, beforeMaximize, beforeNewWindow, beforePageLoadTimeout, beforeParentFrame, beforePerform, beforeQuit, beforeRefresh, beforeResetInputState, beforeSendKeys, beforeSetPosition, beforeSetScriptTimeout, beforeSetSize, beforeSubmit, beforeTo, beforeTo, beforeWindow, onError
    • Constructor Detail

      • Scroller

        public Scroller​(org.openqa.selenium.WebDriver driver)
    • Method Detail

      • beforeClick

        public void beforeClick​(org.openqa.selenium.WebElement element)
        Specified by:
        beforeClick in interface org.openqa.selenium.support.events.WebDriverListener
      • beforeSendKeys

        public void beforeSendKeys​(org.openqa.selenium.WebElement element,
                                   CharSequence[] keysToSend)
        Specified by:
        beforeSendKeys in interface org.openqa.selenium.support.events.WebDriverListener
      • beforeClear

        public void beforeClear​(org.openqa.selenium.WebElement element)
        Specified by:
        beforeClear in interface org.openqa.selenium.support.events.WebDriverListener
      • afterGet

        public void afterGet​(org.openqa.selenium.WebDriver driver,
                             String url)
        Specified by:
        afterGet in interface org.openqa.selenium.support.events.WebDriverListener
      • disableStickyElements

        public void disableStickyElements()
        Sometimes sticky elements (elements that are fixed in position on the page, such as the bottom app bar), appear on top of other elements, making those elements inaccessible. This method removes the sticky nature of these elements meaning that they'll no longer appear on top of other elements.
      • scrollIntoView

        public void scrollIntoView​(org.openqa.selenium.WebElement e)
        The framework is expected to take care of the correct scrolling. When you are tempted to scroll from PageObjects or tests, there is likely a framework problem to be fixed.