Подтвердить что ты не робот

Как закрыть окно дочернего браузера в Selenium WebDriver с помощью Java

После того, как я переключаюсь в новое окно и завершаю задачу, я хочу закрыть это новое окно и переключиться на старое окно,

так что здесь я написал как код:

// Perform the click operation that opens new window

String winHandleBefore = driver.getWindowHandle();

    // Switch to new window opened

    for (String winHandle : driver.getWindowHandles()) {
        driver.switchTo().window(winHandle);
    }

    // Perform the actions on new window


    driver.findElement(By.id("edit-name")).clear();
    WebElement userName = driver.findElement(By.id("edit-name"));
    userName.clear();
              try
    {
        driver.quit();
    }

    catch(Exception e)
    {
        e.printStackTrace();
        System.out.println("not close");
                }

driver.switchTo().window(winHandleBefore);// Again I want to start code this old window

Выше я написал код driver.quit() или driver.close(). Но я получаю ошибку. Кто-нибудь может мне помочь...?

org.openqa.selenium.remote.SessionNotFoundException: FirefoxDriver нельзя использовать после вызова quit().

4b9b3361

Ответ 1

Чтобы закрыть одно окно браузера:

driver.close();

Чтобы закрыть все окна браузера (родительский + дочерний) и завершить весь сеанс:

driver.quit();

Ответ 2

Логика, которую вы использовали для переключения элемента управления во всплывающее окно, неверна

 for (String winHandle : driver.getWindowHandles()) {
        driver.switchTo().window(winHandle);
    }

Как приведенная выше логика переключит управление в новое окно?


Используйте следующую логику, чтобы переключить управление в новое окно

// get all the window handles before the popup window appears
 Set beforePopup = driver.getWindowHandles();

// click the link which creates the popup window
driver.findElement(by).click();

// get all the window handles after the popup window appears
Set afterPopup = driver.getWindowHandles();

// remove all the handles from before the popup window appears
afterPopup.removeAll(beforePopup);

// there should be only one window handle left
if(afterPopup.size() == 1) {
          driver.switchTo().window((String)afterPopup.toArray()[0]);
 }

// Perform the actions on new window

  **`//Close the new window`** 
    driver.close();

//perform remain operations in main window

   //close entire webDriver session
    driver.quit();

Ответ 3

//store instance of main window first using below code
String winHandleBefore = driver.getWindowHandle(); 

Выполните операцию щелчка, которая открывает новое окно

//Switch to new window opened
for (String winHandle : driver.getWindowHandles()) {
    driver.switchTo().window(winHandle);
}

// Perform the actions on new window
driver.close(); //this will close new opened window

//switch back to main window using this code
driver.switchTo().window(winHandleBefore);

// perform operation then close and quit
driver.close();
driver.quit();

Ответ 4

Есть несколько случаев, когда окно закрывается после того, как корректный дескриптор окна был получен из getWindowHandle() или getWindowHandles().

Существует даже возможность закрытия окна при запуске getWindowHandles(), если только вы не создадите код типа критического раздела (например, запустите браузер во время запуска тестового кода, пока все операции управления окнами не будут завершены)

Более быстрый способ проверить правильность текущего драйвера - проверить sessionId, который был сделан null с помощью driver.close() или закрытием окна.

Чтобы получить sessionId, WebDriver необходимо передать в интерфейс удаленного драйвера (RemoteWebDriver) следующим образом:

if (null == ((RemoteWebDriver)driver).sessionId) {
    // current window is closed, switch to another or quit
} else {
    // current window is open, send commands or close
}

Также обратите внимание, что закрытие последнего окна эквивалентно quit().

Ответ 5

Есть два способа закрыть одно дочернее окно:

Способ 1:

driver.close();

Путь 2: Используя клавиши Ctrl + w с клавиатуры:

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "w");

Ответ 6

public class First {
    public static void main(String[] args) {
        System.out.println("Welcome to Selenium");
        WebDriver wd= new FirefoxDriver();
        wd.manage().window().maximize();
        wd.get("http://opensource.demo.orangehrmlive.com/");
        wd.findElement(By.id("txtUsername")).sendKeys("Admin");
        wd.findElement(By.id("txtPassword")).sendKeys("admin");
        wd.findElement(By.id("btnLogin")).submit();
        **wd.quit(); //--> this helps to close the web window automatically** 
        System.out.println("Tested Sucessfully ");
    }
}

Ответ 7

Я также пробовал

1) driver.close();
2) driver.quit();

По-видимому, эти методы работают не так, как ожидалось! (не сказать, что это не работает). Я даже попытался сделать класс драйвера singleton, и это не помогло мне с запуском тестовых примеров parallel.so это было также не оптимальное решение. Наконец, я придумал создание отдельного класса для запуска bat файла. Этот файл bat содержит команды группировки всего процесса chrome-драйвера и всех дочерних процессов it.and из класса java. выполнил его с использованием Runtime.

Файл класса, в котором выполняется файл bat

public class KillChromeDrivers {

    public static void main(String args[]) {


        try {

            Runtime.getRuntime().exec("cmd /c start E:\\Work_Folder\\SelTools\\KillDrivers.bat");
            //Runtime.getRuntime().exec()
        } catch (Exception ex) {



        }
    }

}

Команда, которую вы должны поместить в файл .bat

taskkill /IM "chromedriver.exe" /T /F