Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selenium - Scroll down a growing page

I'm using Selenium with c#.

Selenium usually can automatically scroll down to the bottom of a web page to find elements but I having issues with a certain page which can increase in size.

Can anyone suggest code that will scroll down to the bottom of the page once it grows in size?

like image 647
user2184530 Avatar asked Sep 02 '13 11:09

user2184530


People also ask

How do you scroll down a webpage in Selenium?

Selenium runs the commands in Javascript with the execute_script() method. For scrolling down to the bottom of the page, we have to pass (0, document. body. scrollHeight) as parameters to the method scrollBy().

How do I scroll down a popup window in Selenium?

Scenario 1: To scroll down the web page by pixel. Javascript method ScrollBy() scrolls the web page to the specific number of pixels. The syntax of ScrollBy() methods is : executeScript("window. scrollBy(x-pixels,y-pixels)");

How do you scroll extreme right in Selenium?

scrollLeft = arguments[0]. offsetWidth", element); Try above to scroll on extreme right - it worked for me. If you want to scroll on left change accordingly.


3 Answers

Try using javascript as described in this question

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight);");
like image 122
Brantley Blanchard Avatar answered Nov 07 '22 10:11

Brantley Blanchard


I know it's an old one, but it may be of someone's help. I came out with the following C# code:

    private void ScrollToBottom(IWebDriver driver)
    {
        long scrollHeight = 0;

        do
        {
            IJavaScriptExecutor js = (IJavaScriptExecutor) driver;
            var newScrollHeight = (long) js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight); return document.body.scrollHeight;");

            if(newScrollHeight == scrollHeight)
            {
                break;
            }
            else
            {
                scrollHeight = newScrollHeight;
                Thread.Sleep(400);
            }
        } while (true);
    }
like image 34
Georgi Vatsov Avatar answered Nov 07 '22 08:11

Georgi Vatsov


An example in C# using .Net 4.5 and Selenium WebDriver 2.45

Just change the _url variable to point to your website and run.

I used the ChromeDriver but it should work with the other drivers as well.

using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace SeleniumScrollTest {

    internal static class Program {

        // Declare Selenium Web Driver
        private static IWebDriver _chromeDriver;

        private static String _url;

        private static void Main(string[] args) {
            // Instantiate URL
            _url = @"http://my.website.com/LazyLoadContent";

            // Instantiate Web Driver as ChromeDriver and set initial URL
            _chromeDriver = new ChromeDriver {Url = _url};

            // Instruct the WebDriver to wait X seconds for elements to load
            _chromeDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(15));

            // Instantiate JavaScript Executor using the web driver
            var jse = (IJavaScriptExecutor) _chromeDriver;

            // The minified JavaScript to execute
            const string script =
                "var timeId=setInterval(function(){window.scrollY<document.body.scrollHeight-window.screen.availHeight?window.scrollTo(0,document.body.scrollHeight):(clearInterval(timeId),window.scrollTo(0,0))},500);";

            // Start Scrolling
            jse.ExecuteScript(script);

            // Wait for user input
            Console.ReadKey();

            // Close the browser instance
            _chromeDriver.Close();

            // Close the ChromeDriver Server
            _chromeDriver.Quit();
        }
    }
}

If you've already a moderate understanding of Selenium and C#, the important bit is really the JavaScript. -Sourced from Cybermaxs, here

    var timeId = setInterval(function () {
        if (window.scrollY !== document.body.scrollHeight)
            window.scrollTo(0, document.body.scrollHeight);
        else
            clearInterval(timeId);
    }, 500);

The 500 above is the interval at which it will attempt scroll (in microseconds), adjust this as necessary. [1000 microseconds = 1 second]

like image 40
JerodG Avatar answered Nov 07 '22 09:11

JerodG