J'utilise Selenium WebDriver pour automatiser les tests de mon navigateur. L’en-tête de mon navigateur est flottant et est toujours présent indépendamment du défilement du navigateur .
Ainsi, lorsque je clique sur certains éléments présents sous la zone visible du navigateur, Selenium essaie de faire défiler l'élément en vue et de cliquer dessus.
Mais en raison du défilement automatique en tant que tel, les éléments défilent derrière l'en-tête flottant et lorsqu'une action est effectuée sur eux, les éléments de l'en-tête de la page sont cliqués.
existe-t-il un moyen de limiter le défilement par défaut du WebDriver ?
Locatable hoverItem = (Locatable) driver.findElement(By.xpath("//li[text()='Reklama w Google']"));
int y = hoverItem.getCoordinates().getLocationOnScreen().getY();
((JavascriptExecutor)driver).executeScript("window.scrollBy(0,"+y+");");
Si vous souhaitez faire défiler la fenêtre firefox à l’aide de Selenium Webdriver, l’un des moyens consiste à utiliser javaScript dans le code Java. Le code javeScript à faire défiler est le suivant:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("window.scrollTo(0,Math.max(document.documentElement.scrollHeight," +
"document.body.scrollHeight,document.documentElement.clientHeight));");
Utilisez simplement le .sendKeys(Keys.PAGE_DOWN);
Lorsque votre élément était visible, cliquez simplement dessus, par .click(element).perform();
Pour moi, fonctionne comme ceci:
clicker = new Actions(driver);
clicker.sendKeys(Keys.PAGE_DOWN);
Thread.sleep(1000);
clicker.click(button).perform();
Thread.sleep(1000);
Vous pouvez faire défiler jusqu'à l'emplacement nécessaire à l'aide de javascript. Pour que cela fonctionne, vous devez utiliser la méthode scrollTo plutôt que la méthode scrollBy.
public void scrollToElement(By by) {
Locatable element = (Locatable) Selenium.findElement(by);
Point p= element.getCoordinates().getLocationOnScreen();
JavascriptExecutor js = (JavascriptExecutor) Selenium;
js.executeScript("window.scrollTo(" + p.getX() + "," + (p.getY()+150) + ");");
}
Faire défiler vers le haut peut être fait:
private void scrollToTop() {
JavascriptExecutor js = (JavascriptExecutor) webDriver;
js.executeScript("window.scrollTo(0, 0);");
}
Pour faire défiler vers le bas:
System.setProperty("webdriver.chrome.driver",
"/home/shreetesh/chromedriver");
WebDriver driver = new ChromeDriver();
String url = "https://en.wikipedia.org/wiki/Main_Page";
driver.get(url);
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("scroll(0, 25000);");
Pour faire défiler vers le haut, il suffit de remplacer la valeur de scroll par (2500, 0).
Utilisez le code ci-dessous pour faire défiler vers le haut et vers le bas
Actions dragger = new Actions(driver);
WebElement draggablePartOfScrollbar = driver.findElement(By.xpath("<Scroll bar Element >"));
// 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);
}
J'ai récemment eu ce problème en raison d'un menu Drupal bloquant l'élément lorsque j'ai exécuté ce code:
public void scrollTo(WebElement x) {
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", x);
}
Après référençant cette page , je me suis mis à jour pour définir le booléen sur false en utilisant ce code, et cela fonctionne très bien:
public void scrollTo(WebElement x) {
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(false);", x);
}