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