Role a página para cima ou para baixo no Selenium WebDriver (Selenium 2) usando java

Eu escrevi o seguinte código no Selenium 1 (também conhecido como Selenium RC) para rolagem de página usando java:

selenium.getEval("scrollBy(0, 250)"); 

Qual é o código equivalente no Selenium 2 (WebDriver)?

Para rolar para baixo :

 WebDriver driver = new FirefoxDriver(); JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("window.scrollBy(0,250)", ""); 

OU, você pode fazer o seguinte:

 jse.executeScript("scroll(0, 250);"); 

Para rolar para cima :

 jse.executeScript("window.scrollBy(0,-250)", ""); OR, jse.executeScript("scroll(0, -250);"); 

Rolando para a parte inferior de uma página:

 JavascriptExecutor js = ((JavascriptExecutor) driver); js.executeScript("window.scrollTo(0, document.body.scrollHeight)"); 

Há muitas maneiras de rolar para cima e para baixo no Selenium Webdriver Eu sempre uso o Java Script para fazer o mesmo.

Abaixo está o código que sempre funciona para mim se eu quiser rolar para cima ou para baixo

  // This will scroll page 400 pixel vertical ((JavascriptExecutor)driver).executeScript("scroll(0,400)"); 

Você pode obter o código completo a partir daqui Scroll Page in Selenium

Se você quiser rolar por um elemento, então o código abaixo funcionará para você.

 je.executeScript("arguments[0].scrollIntoView(true);",element); 

Você obterá o documento completo aqui Rolar por elemento específico

Esta pode não ser uma resposta exata à sua pergunta (em termos de WebDriver), mas descobri que a biblioteca java.awt é mais estável que a selenium.Keys . Assim, uma ação de page down usando o primeiro será:

 Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_PAGE_DOWN); robot.keyRelease(KeyEvent.VK_PAGE_DOWN); 
 JavascriptExecutor js = ((JavascriptExecutor) driver); 

Rolar para baixo:

 js.executeScript("window.scrollTo(0, document.body.scrollHeight);"); 

Rolar para cima:

 js.executeScript("window.scrollTo(0, -document.body.scrollHeight);"); 

Eu não queria usar JavaScript, ou qualquer biblioteca externa, então essa era a minha solução (C #):

 IWebElement body = Driver.FindElement(By.TagName("body")); IAction scrollDown = new Actions(Driver) .MoveToElement(body, body.Size.Width - 10, 15) // position mouse over scrollbar .ClickAndHold() .MoveByOffset(0, 50) // scroll down .Release() .Build(); scrollDown.Perform(); 

Você também pode facilmente tornar isso um método de extensão para rolar para cima ou para baixo em qualquer elemento.

Tente isso

  Actions dragger = new Actions(driver); WebElement draggablePartOfScrollbar = driver.findElement(By.xpath("//*[@id='jobreslist_outercontainer']/div/div[2]/div")); // drag downwards int numberOfPixelsToDragTheScrollbarDown = 50; for (int i=10;i<500;i=i+numberOfPixelsToDragTheScrollbarDown){ try{ // this causes a gradual drag of the scroll bar, 10 units at a time dragger.moveToElement(draggablePartOfScrollbar).clickAndHold().moveByOffset(0,numberOfPixelsToDragTheScrollbarDown).release().perform(); Thread.sleep(1000L); }catch(Exception e1){} } // now drag opposite way (downwards) numberOfPixelsToDragTheScrollbarDown = -50; for (int i=500;i>10;i=i+numberOfPixelsToDragTheScrollbarDown){ // this causes a gradual drag of the scroll bar, -10 units at a time dragger.moveToElement(draggablePartOfScrollbar).clickAndHold().moveByOffset(0,numberOfPixelsToDragTheScrollbarDown).release().perform(); Thread.sleep(1000L); } 

Você deve adicionar um pergaminho à página para selecionar todos os elementos usando Selenium.executeScript("window.scrollBy(0,450)", "") .

Se você tiver uma lista grande, adicione o pergaminho várias vezes durante a execução. Observe que o pergaminho só vai para um certo ponto na página, por exemplo (0,450).

 JavascriptExecutor jse = ((JavascriptExecutor) driver); jse.executeScript("window.scrollTo(0, document.body.scrollHeight)"); 

Este código funciona para mim. Como a página que estou testando, carrega conforme rolamos para baixo.

O executor de Javascript sempre faz o trabalho perfeitamente:

 ((JavascriptExecutor) driver).executeScript("scroll(0,300)"); 

onde (0,300) são as distâncias horizontal e vertical, respectivamente. Coloque suas distâncias conforme suas necessidades.

Se você é um perfeccionista e gostaria de obter a distância exata que você deseja rolar até a primeira tentativa, use esta ferramenta, MeasureIt . É um add-on shiny do firefox.

Obrigado pela resposta de Ripon Al Wasim. Eu fiz algumas melhorias. devido a problemas de rede, repito três vezes até o loop de interrupção.

 driver.get(url) # Get scroll height last_height = driver.execute_script("return document.body.scrollHeight") try_times = 0 while True: # Scroll down to bottom driver.execute_script("window.scrollBy(0,2000)") # Wait to load page time.sleep(scroll_delay) # Calculate new scroll height and compare with last scroll height new_height = driver.execute_script("return document.body.scrollHeight") if last_height == new_height: try_times += 1 if try_times > 3: try_times = 0 break last_height = new_height