Веб-драйверы Chrome и Internet Explorer Selenium дают сбой случайно

Я запускаю свои тесты TestNG в нескольких браузерах, используя селен. У меня есть этот метод под названием "Пуск", который включает в себя все назначения браузеров. Вот как это выглядит.

public class Main {

    public static  WebDriver driver;

    public static void main(String[] args) throws MalformedURLException {
        start("localchrome");
        menuSelector("Grants", "Make a ", "Drive");
        quit();
    }

    @Parameters("browser")
    public static void start (String browsername) throws MalformedURLException {
        DesiredCapabilities capability;

        if(browsername.equalsIgnoreCase("firefox")){
            capability = DesiredCapabilities.firefox();
            driver = new RemoteWebDriver(new URL("http://###.###.##.####:4441/wd/hub"), capability);
            capability.setBrowserName("firefox");
        }

        else if (browsername.equalsIgnoreCase("chrome")){
            capability = DesiredCapabilities.chrome();
            driver = new RemoteWebDriver(new URL("http://###.###.##.####:4441/wd/hub"), capability);
            capability.setBrowserName("chrome");
        }

        else if (browsername.equalsIgnoreCase("ie")){
            capability = DesiredCapabilities.internetExplorer();
            capability.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
            driver = new RemoteWebDriver(new URL("http://###.###.##.####:4441/wd/hub"), capability);
            capability.setBrowserName("internet explorer");
        }

        else if (browsername.equalsIgnoreCase("LocalChrome")){
            System.setProperty("webdriver.chrome.driver", "/Users/#######/Documents/chromedriver");
            driver = new ChromeDriver();
        }

        else if (browsername.equalsIgnoreCase("LocalFirefox")){
            ProfilesIni profilesIni = new ProfilesIni();
            FirefoxProfile mp = profilesIni.getProfile("myProfile");
            driver = new FirefoxDriver(mp);
        }

        driver.navigate().to("http://www.someWebsite.com/login");

        WebElement loginInput = driver.findElement(By.id("login"));
        loginInput.sendKeys("user1");
        WebElement passwordInput = driver.findElement(By.id("pass"));
        passwordInput.sendKeys("pass111");
        WebElement loginButton = driver.findElement(By.id("submit"));
        loginButton.submit();
        WebElement nameField = driver.findElement(By.name("value(name)"));
        nameField.sendKeys("Acc 123");
        WebElement goButton = driver.findElement(By.name("value(search)"));
        goButton.click();

        WebElement selectButton = driver.findElement(By.name("select.name"));
        selectButton.click();
    }

    public static void quit(){
        driver.quit();
    }

    public static void menuSelector(String a, String b, String c){

        WebElement menuItem = driver.findElement(By.xpath("//td/div[contains(.,'"+a+"')]"));
        Actions actions = new Actions(driver);
        actions.moveToElement(menuItem).perform();

        WebDriverWait wait = new WebDriverWait(driver, 60);
        WebElement subMenuItem = wait.until(ExpectedConditions.
                visibilityOfElementLocated
                        (By.xpath("//td[contains(.,'" + b + "') and @class='label']")));

        actions.moveToElement(subMenuItem).perform();

        WebElement subItem = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//td[contains(.,'"+c+"') and @class='label']")));
        actions.moveToElement(subItem).click().perform();
    }

}

Поэтому, когда я запускаю это, он работает только в Firefox, а иногда и в Chrome и IE 11. Но в Chrome и IE 11 он случайно дает сбой один раз. Я получаю разные типы исключений каждый раз.

Я получаю ---- Исключение в потоке "main" org.openqa.selenium.StaleElementReferenceException: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы ---- в chrome и IE11.

Это происходит очень случайно, и я думаю, что это как-то связано с HTML DOM. Что я могу сделать, чтобы предотвратить это?

1 ответ

Попробуйте добавить еще немного синхронизации. Например,

      WebDriverWait wait = new WebDriverWait(driver,10); 
      wait.until(presenceOfElementLocated(By.id("login"));

, сразу после перехода на страницу и до того, как вы что-либо с ней связываете.

Другие вопросы по тегам