2013-05-30 10 views
28

Tutaj dostaję jakiś problem od dłuższego czasu. I nie mogłem tego rozgryźć, czy ktoś mógłby mi pomóc? ... kiedy zamierzam przełączyć nowe okno, po ukończeniu zadania nowych okien. Chcę zamknąć że nowe window.and przełączyć stare okna,Jak zamknąć okno przeglądarki podrzędnej w Selenium WebDriver za pomocą Java

tak jak tu napisane kodu:

// 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 

Powyżej napisałem kod driver.quit() lub driver.close(). Ale dostaję błąd. Czy ktoś może mi pomóc...?

org.openqa.selenium.remote.SessionNotFoundException: FirefoxDriver nie może być używany po wywołaniu quit().

Odpowiedz

50

Aby zamknąć jednym oknie przeglądarki:

driver.close(); 

aby zamknąć wszystkie (rodzic + dziecko) okna przeglądarki i zakończyć całą sesję:

driver.quit(); 
+0

Wow! To jest sztuczka, której nie znałem: – 8090PZ

4

Logika już używany przełączenie kontroli na wyskakujące okienko jest nieprawidłowe

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

Ho w powyższą logikę przetransferuje sterowanie do nowego okna?


Zastosowanie logiki poniżej aby włączyć kontrolę nowym oknie

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

wykonać operację kliknięcia, które otwiera nowe okno

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

Istnieją pewne przypadki, w których okno zamknie się po poprawnym klamki zostały uzyskane z getWindowHandle() lub getWindowHandles().

Istnieje nawet możliwość, że okno zamknie się podczas getWindowHandles() działa, chyba stworzyć jakiś kod krytyczny typ odcinek (czyli zamrożenia przeglądarki podczas uruchamiania kodu testowego, aż wszystkie operacje zarządzania okna są kompletne)

Szybszym sposobem sprawdzenia aktualności aktualnego sterownika jest sprawdzenie wartości sessionId, która jest pusta przez driver.close() lub przez samo zamknięcie okna.

WebDriver musi być oddane do interfejsu zdalnego sterownika (RemoteWebDriver) w celu uzyskania sessionid, co następuje:

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

Należy również pamiętać, że zamknięcie ostatniego okna jest odpowiednikiem quit().

0

Istnieją 2 sposoby, aby zamknąć jedno okno dziecko:

Way 1:

driver.close(); 

Way 2: Używając + Klawisze w Ctrl z klawiatury:

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

driver.close(); dotyczy nowego okna. driver.findElement (By.cssSelector ("body")). sendKeys (Keys.CONTROL + "w"); dotyczy zarówno nowego okna, jak i nowej karty. –

0
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 "); 
    } 
} 
0

Próbowałem również

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

podobno te metody nie działają zgodnie z oczekiwaniami! (Nie mówiąc, że to nie działa) Próbowałem nawet stworzyć singleton klasy sterownika i nie pomogło mi to w uruchomieniu testowych przypadków równoległych. nie było również optymalnym rozwiązaniem. Ostatecznie, stworzyłem oddzielną klasę do uruchomienia pliku bat., który zawiera plik bat zawierający polecenia grupowania całego procesu sterownika chrome i wszystkich procesów potomnych it.and z klasy java I ' ve wykonał go przy pomocy Runtime.

plik klasy, który uruchamia plik 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) { 



     } 
    } 

} 

polecenie, które trzeba umieścić w [bat] plik

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