Saturday 27 April 2013

Scrolling on pages using Selenium

Scrolling on pages using Selenium

Somebody recently asked me on how to scroll a page which is dynamically loaded. Something like the Facebook page where the updates gets loaded as you scroll down the page. As I never had such a requirement , I didn't knew a solution to it. 


While searching I found people suggesting the "selenium.focus" function to be used as a solution, but that does not solve the problem I am talking about.  The "selenium.focus" should be used when the element you are looking for gets loaded when the page gets loaded and not when you scroll through the page.


After lot of searching I was unable to get a proper answer to my problem and finally got an idea for implementing it. Its just a 4 to 5 lines of code that can be used in your code for scrolling on the page.Following is the code:
?
1
2
3
4
5
6
7
for (int second = 0;; second++) {
            if(second >=60){
                break;
            }
                driver.executeScript("window.scrollBy(0,200)", "");
                Thread.sleep(1000);
            }

The above code uses the JavaScript method "scrollBy" to scroll on the page. The forloop runs for 60 sec  and calls the scrollBy function every second. This makes the selenium to scroll on the page.

If you have a test where you need to scroll on the page and check whether an element is loaded dynamically or not you can put a isElementPresent like function after the "driver.executeScript" to check visibility of your element.Following is a test method written in webdriver that you can use to test the above function on the Facebook page:?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class FacebookScrollWebDriver {
RemoteWebDriver driver;
@Before
public void startup(){
    DesiredCapabilities cap=new DesiredCapabilities();
    cap.setJavascriptEnabled(true);
    cap.setBrowserName("firefox");
    try {
        driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), cap);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}
@Test
    public void testScroll() throws InterruptedException{
        driver.get("http://www.facebook.com");
        driver.findElement(By.id("email")).click();
        driver.findElement(By.id("email")).clear();
        driver.findElement(By.id("email")).sendKeys("facebook id");
        driver.findElement(By.id("pass")).clear();
        driver.findElement(By.id("pass")).sendKeys("facebook pswd");
        driver.findElement(By.xpath("//input[@type='submit']")).click();
        Thread.sleep(5000);
        driver.switchTo().defaultContent();
//Following is the code that scrolls through the page
        for (int second = 0;; second++) {
            if(second >=60){
                break;
            }
                driver.executeScript("window.scrollBy(0,200)", "");
                Thread.sleep(3000);
            }
}
@After
public void stop(){
    driver.quit();
}
public boolean isElementPresent(RemoteWebDriver driver, By by){
    try{
        driver.findElement(by);
        return true;
    }catch(NoSuchElementException e){
        return false;
    }
}
}

The following code is written for Selenium-1.0 users:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class FaceScrollSeleniumOne {
    Selenium selenium;
    @Before
    public void startup(){
        selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://www.facebook.com");
        selenium.start();
    }
    @Test
        public void testScroll() throws InterruptedException{
             
        selenium.open("/");
        selenium.type("id=email", "facebook id");
        selenium.type("id=pass", "facebook pswd");
        selenium.click("//input[@type='submit']");
            Thread.sleep(5000);
    //Following is the code that scrolls through the page
            for (int second = 0;; second++) {
                if(second >=60){
                    break;
                }
                selenium.getEval("window.scrollBy(0,200)");
                    
                    Thread.sleep(3000);
                }
    }
    @After
    public void stop(){
        selenium.stop();
    }
}

No comments:

Post a Comment

Angular JS Protractor Installation process - Tutorial Part 1

                     Protractor, formally known as E2E testing framework, is an open source functional automation framework designed spe...