web-dev-qa-db-fra.com

Comment faire défiler une DIV spécifique à l'aide de Selenium WebDriver avec Java?

Certains WebElements ne sont pas reconnus par WebDriver. WebDriver ne parvient pas à trouver l'élément qui n'est pas visible dans la zone visible du navigateur.

Afin de rendre WebElement affichable par WebDriver, nous devons rendre cet élément visible dans la vue du navigateur pour pouvoir faire défiler vers le bas un div particulier!

Comment puis-je effectuer mon action (défiler vers le bas et cliquer) sur une zone particulière de ma page Web? J'ai essayé beaucoup, ne m'a pas aidé. 

S'il vous plaît aidez-moi à résoudre mon problème.

21
pandiaraj

Défiler vers le bas:

import org.openqa.Selenium.JavascriptExecutor;
WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(0, 250)"); //y value '250' can be altered

Faites défiler vers le haut:

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(250, 0)"); //x value '250' can be altered

Faites défiler le bas de la page:

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

ou

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.END).perform();

Défilement complet vers le bas au ralenti:

for (int second = 0;; second++) {
    if(second >=60){
        break;
    }
    ((JavascriptExecutor) driver).executeScript("window.scrollBy(0,400)", ""); //y value '400' can be altered
    Thread.sleep(3000);
}

ou

JavascriptExecutor jse = (JavascriptExecutor)driver;
for (int second = 0;; second++) {
    if(second >=60){
        break;
    }
    jse.executeScript("window.scrollBy(0,800)", ""); //y value '800' can be altered
    Thread.sleep(3000);
}

Faites défiler automatiquement jusqu'à votre élément Web:

Point hoverItem =driver.findElement(By.xpath("Value")).getLocation();
((JavascriptExecutor)driver).executeScript("return window.title;");    
Thread.sleep(6000);
((JavascriptExecutor)driver).executeScript("window.scrollBy(0,"+(hoverItem.getY())+");"); 
// Adjust your page view by making changes right over here (hoverItem.getY()-400)

ou

((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", driver.findElement(By.xpath("Value')]")));

ou

WebElement element = driver.findElement(By.xpath("Value"));
Coordinates coordinate = ((Locatable)element).getCoordinates(); 
coordinate.onPage(); 
coordinate.inViewPort();
8
Rupesh Shinde

Tout d’abord, la plupart des réponses affichées ici sont hors sujet. Je travaille avec Selenium 2 et Selenium 3 maintenant, le WebDriver peut gérer le défilement de la fenêtre pour rendre un élément visible.

Pour tout le monde poster des extraits comme:

driver.execute_script('scrollBy(0, 250)')

vous n'obtenez pas la question du tout!

En fait, je n'ai toujours pas trouvé le moyen de simuler correctement l'action de glissement de la poignée de défilement, mais cette réponse semble prometteuse - mais je n'ai pas essayé.

Jusqu'à présent personnellement, il y a deux façons de faire cela pour moi:

  1. Utilisez Keys.ARROW_DOWN
  2. Utilisez Keys.PAGE_DOWN

En réalité, il existe une troisième solution: abandonnez simplement Selenium et contactez le site Web si celui-ci fournit une API.

8
Junchao Gu

Le moyen le plus simple de le faire est de exécuter un Javascript pour faire défiler l’élément haut/bas.

JavascriptExecutor jsExec = (JavascriptExecutor) driver;
jsExec.executeScript("document.getElementById('id').scrollDown += 100");
6
Marcelo Xavier
driver.get("http://www.***.com/");
driver.manage().window().maximize();
WebElement scroll = driver.findElement(By.id("someId"));
scroll.sendKeys(Keys.PAGE_DOWN);
3
Pavel Kononenko

D'abord, vous devriez faire défiler plutôt que trouver l'élément, faites comme ci-dessous:

document.getElementById("your div id").scrollTop(250);

Après ci-dessus, vous pouvez trouver cette div spécifique.

Vous pouvez également essayer ci-dessous:

    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("javascript:window.scrollBy(250,350)");
2
Helping Hands

Une autre façon de le faire en utilisant la méthode JavascriptExceutor's scrollIntoView():

WebElement DIVelement = driver.findElement(By.xpath("xpath to div"));

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView(true)". DIVelement);
2
kushal.8

Mon "Contournement" consiste à faire défiler jusqu'à la position en utilisant les coordonnées x et y de l'élément. J'ai également ajouté un décalage à y afin que tout en-tête/pied de page ou autre élément ne bloque pas la visibilité de l'élément que je souhaite faire défiler.

J'ai ma réponse posté sous cette question - 

Selenium WebDriver ne peut pas cliquer sur un lien en dehors de la page

0
yuva

Considérez votre code HTML comme ci-dessous:

<div id="someId" class="className" style="position: relative; top: 0px; left: opx;>

vous pouvez observer l'attribut style dans div recherchez la valeur de top qui est 0px dans l'exemple ci-dessus

Maintenant, essayez de faire quelque chose comme:

$('.className').animate({top: "-60px"});

ce qui vous aidera à faire défiler . C’est un exécuteur JavaScript, vous devez donc bien sûr l’implémenter.

0
Gaurav Lad

Aucune des réponses postées n'a fonctionné pour moi, cependant j'ai trouvé une solution basée sur ce post .

((JavascriptExecutor) driver).executeScript(
    "arguments[0].scrollTop=arguments[1].offsetTop",
    divWithScrollbarElement,
    elementToScrollTo);

divWithScrollbarElement est l'élément div que vous souhaitez faire défiler, et elementToScrollTo est l'élément enfant que vous souhaitez rendre visible (qui dans mon cas était en fait le parent de l'élément que j'essayais initialement de visualiser). Si elementToScrollTo ne figure pas encore dans le DOM, vous devrez peut-être utiliser le script une fois pour faire défiler l'écran le plus loin possible, puis à nouveau une fois que des éléments ont été chargés.

0
Dave