web-dev-qa-db-fra.com

org.openqa.Selenium.interactions.MoveTargetOutOfBoundsException: (x, y) est hors limites tandis que MouseHover avec GeckoDriver Firefox Selenium

J'apprends à automatiser les tests avec Selenium WebDriver, mais je suis coincé et je ne peux pas faire fonctionner le menu déroulant dans Firefox. Le même code fonctionne parfaitement dans Chrome.

Le site sur lequel je pratique est: http://www.executeautomation.com/demosite/index.html et je souhaite cliquer sur l'élément suivant dans le menu: Outils d'automatisation> Selenium> Selenium WebDriver.

Le message d'erreur suggère que l'élément Web n'est peut-être pas encore chargé à l'écran, j'ai donc mis en œuvre une méthode pour attendre à chaque exécution jusqu'à ce que l'élément s'affiche:

public static void ImplicitWait(WebDriver driver){
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
}

mais cela n'a pas aidé.

J'ai ensuite lu qu'il valait mieux "canaliser" ces méthodes moveToElement () au lieu de les exécuter une par une. J'ai donc changé cela:

action.moveToElement(menu).perform();
action.moveToElement(Selenium).perform();
action.moveToElement(seleniumWebDriver).click().build().perform();

à une ligne. À ce stade, il a commencé à fonctionner sur Chrome, mais j'ai encore du mal à le faire fonctionner sur Firefox.

Le code actuel ressemble à ceci:

System.setProperty("webdriver.gecko.driver", "C:\\Drivers\\geckodriver-v0.24.0-win64\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
WebDriver driver = new FirefoxDriver();

ImplicitWait(driver);

driver.navigate().to("http://executeautomation.com/demosite/index.html");

WebElement menu = driver.findElement(By.id("Automation Tools"));
WebElement Selenium = driver.findElement(By.id("Selenium"));
WebElement seleniumWebDriver = driver.findElement(By.id("Selenium WebDriver"));

Actions action = new Actions(driver);
action.moveToElement(menu).moveToElement(Selenium).moveToElement(seleniumWebDriver).click().build().perform();

Comme je l'ai mentionné ci-dessus, la même chose fonctionne bien lorsque je passe à Chrome, mais avec Firefox, je reçois le message d'erreur:

Exception in thread "main" org.openqa.Selenium.interactions.MoveTargetOutOfBoundsException: (-9862, 206) is out of bounds of viewport width (1283) and height (699)

J'utilise: * Firefox v66.0.2 * Java v1.8.0_201 * Selenium Java v3.141.59 * GeckoDriver v0.24.0

Veuillez aider.

4
Michal Jeruzal

J'ai observé le même problème avec la classe geckodriver et Actions. Bien que vous puissiez utiliser le code suivant

System.setProperty("webdriver.gecko.driver", "C:\\Drivers\\geckodriver-v0.24.0-win64\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("http://executeautomation.com/demosite/index.html");
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
WebElement mainmenu = driver.findElement(By.xpath("//li[@class='active has-sub']"));
WebElement submenu = driver.findElement(By.xpath("//li[@class='has-sub'] [contains(.,'Selenium')]"));
WebElement intendedLink = driver.findElement(By.xpath("//li[@class='has-sub'] [contains(.,'Selenium')]//li[contains(.,'Selenium WebDriver')]"));

Actions action =new Actions(driver);
action.moveToElement(mainmenu).clickAndHold().build().perform();
Thread.sleep(1000);
action.moveToElement(submenu).clickAndHold().build().perform();
Thread.sleep(1000);
intendedLink.click();

Le code fonctionne bien de mon côté. faites-moi savoir s'il y a un problème.

Remarque: Gardez le pointeur de la souris hors de l'écran de la page Web, sinon il remplacera le focus actuel.

0
NarendraR

Veuillez essayer le code ci-dessous (si vous êtes à l'intérieur du cadre, vous devez sortir et utiliser le code ci-dessous):

WebDriver driver=new ChromeDriver();
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(0,400)");
0
Naveen Gaddipati

Essayez de l'utiliser -

action.moveToElement(menu).build().perform();
Thread.sleep(500);
moveToElement(Selenium).build().perform();
Thread.sleep(500);
moveToElement(seleniumWebDriver).click().build().perform();
0
Dinesh Deshmane

Utilisez WebDriverWait et essayez le code suivant.

driver.get("http://executeautomation.com/demosite/index.html");
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement menu= wait.until(ExpectedConditions.elementToBeClickable(By.id("Automation Tools")));

Actions action = new Actions(driver);
action.moveToElement(menu).build().perform();
WebElement Selenium =wait.until(ExpectedConditions.elementToBeClickable(By.id("Selenium"))); 
action.moveToElement(Selenium).build().perform();
WebElement seleniumWebDriver =wait.until(ExpectedConditions.elementToBeClickable(By.id("Selenium WebDriver")));
action.moveToElement(seleniumWebDriver).click().build().perform();

enter image description here

0
KunduK