org.openqa.selenium.interactions.MoveTargetOutOfBoundsException: (x, y) выходит за границы, когда MouseHover с GeckoDriver Firefox Selenium - PullRequest
2 голосов
/ 29 марта 2019

Я учусь, как автоматизировать тесты с Selenium WebDriver, однако я застрял и не могу сделать выпадающее меню для работы в Firefox. Тот же код прекрасно работает в Chrome.

Сайт, на котором я практикуюсь: http://www.executeautomation.com/demosite/index.html и я хочу щелкнуть по следующему пункту в меню: Инструменты автоматизации> Selenium> Selenium WebDriver.

Сообщение об ошибке указывает на то, что веб-элемент еще не может быть загружен на экран, поэтому я реализовал некоторый метод для ожидания при каждом выполнении до появления элемента:

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

но это не помогло.

Затем я прочитал, что лучше "направить" эти методы moveToElement (), а не выполнять их один за другим. Поэтому я изменил это:

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

до одной строки. В этот момент он начал работать на Chrome, но я все еще пытаюсь заставить его работать на Firefox.

Текущий код выглядит следующим образом:

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();

Как я уже упоминал выше, то же самое отлично работает, когда я переключаюсь на Chrome, но с Firefox я получаю сообщение об ошибке:

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

Я использую: * Firefox v66.0.2 * Java v1.8.0_201 * Selenium Java v3.141.59 * GeckoDriver v0.24.0

Пожалуйста, помогите.

Ответы [ 4 ]

1 голос
/ 29 марта 2019

Основная проблема с веб-приложением заключается в том, что HTML DOM достигает document.readyState равным complete даже до того, как элемент подменю стекст Selenium WebDriver будет обработан.Следовательно, вы видите ошибку как:

Exception in thread "main" org.openqa.selenium.interactions.MoveTargetOutOfBoundsException: (-4899, 91) is out of bounds of viewport width (1366) and height (664)

Решение

Таким образом, идеальным решением было бы:

  • Induce WebDriverwait для titleIs() Execute Automation
  • Induce WebDriverwait для элемента меню с текстом Инструменты автоматизации
  • Induce WebDriverwait для элемента подменю с текстом Selenium
  • Induce WebDriverwait для подменю elementToBeClickable с текстом Selenium
  • Можно использовать следующее решение:
  • Блок кода:

        import org.openqa.selenium.By;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.firefox.FirefoxDriver;
        import org.openqa.selenium.interactions.Actions;
        import org.openqa.selenium.support.ui.ExpectedConditions;
        import org.openqa.selenium.support.ui.WebDriverWait;
    
        public class MouseHoverFirefox {
    
            public static void main(String[] args) {
    
                System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
                WebDriver driver=new FirefoxDriver();
                driver.get("http://www.executeautomation.com/demosite/index.html");
                new WebDriverWait(driver, 20).until(ExpectedConditions.titleIs("Execute Automation"));
                new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@id='Automation Tools']")))).build().perform();
                new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@class='active has-sub']/a/span//following::ul[1]/li[@class='has-sub']/a/span[@id='Selenium']")))).build().perform();
                new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@class='active has-sub']/a/span//following::ul[1]/li/a/span[@id='Selenium']//following::ul[1]/li/a/span[text()='Selenium WebDriver']"))).click();
            }
        }
    
  • Снимок браузера:

selenium_WebDriver

0 голосов
/ 29 марта 2019

Я наблюдал ту же проблему с классами geckodriver и Actions.Хотя вы можете использовать следующий код

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();

Код работает нормально на моем конце.дайте мне знать, если возникнет какая-либо проблема.

Примечание: Не указывайте курсор мыши на экране веб-страницы, иначе он переопределяет текущий фокус.

0 голосов
/ 29 марта 2019

Попробуйте использовать его -

action.moveToElement(menu).build().perform();
Thread.sleep(500);
moveToElement(selenium).build().perform();
Thread.sleep(500);
moveToElement(seleniumWebDriver).click().build().perform();
0 голосов
/ 29 марта 2019

Используйте WebDriverWait и попробуйте следующий код.

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

...