2017-08-14 7 views
3

Ich bin derzeit laufen mehrere Java-Programme über Jenkins mit "Build Periodically" -Option und verwendet H 06 * * 1-5 (führen sie jeden Tag zwischen 6 Uhr morgens und 7 Uhr von Montag bis Freitag) .Kill Chromedriver-Prozess in Selen/Java

Es gibt bestimmte Programme, in denen ich auf Links klicke, was ein neues Fenster öffnet. Daher verwende ich den Code unten

driver.findElement(By.xpath(".//*[@id='terms']/li[1]/a")).click(); 
System.out.println("Home Page is loaded Successfully and Terms of Use Link is clicked"); 
ArrayList<String> window1 = new ArrayList<String>(driver.getWindowHandles()); 
driver.switchTo().window(window1.get(1)); 
Thread.sleep(3000); 
driver.close(); 
Thread.sleep(3000); 
driver.switchTo().window(window1.get(0)); 

Jetzt, nachdem das Programm läuft, mein anderes Programm das folgende schlägt fehl, da der ChromeDriver.exe Prozess, der bereits läuft.

Ich habe versucht, driver.quit() anstelle von driver.close() in den Code oben, aber es wird meinen gesamten Browser zu schließen.

Hinweis: Ich habe am Ende meines Programms driver.quit() verwendet, was mir nicht hilft, die laufende Chromedriver.exe-Instanz loszuwerden, die geöffnet wurde, als ich das Fenster wechselte.

Bitte schlagen Sie mir einen guten Weg vor, um mit diesem Problem umzugehen. Ich habe in JAVA nach dieser Lösung gesucht. Aber meistens sehe ich Antworten für C#.

Dank

+0

Können Sie Ihre genaue manuelle Schritte zusammenfassen Sie versuchen, zu automatisieren? Wenn Sie den Browser mit 'driver.close() schließen;' wie würden Sie 'driver.switchTo(). Window (window1.get (0)); '. Schließen Sie stattdessen die Fenstergriffe. – DebanjanB

+0

Hallo, ich klicke auf einen Link "Nutzungsbedingungen" von meiner Homepage. Dies öffnet ein neues Fenster. Also wechsle ich in das neu geöffnete Fenster, um einen statischen Text aus diesem Fenster zu überprüfen. Sobald das erledigt ist. Ich schließe das Fenster und wechsle zurück zum ursprünglichen Home Page Window. Wenn ich also driver.close() verwendet habe, wird das neu geöffnete Fenster geschlossen, die Instanz von chromedriver.exe bleibt jedoch erhalten. Dies verursacht Probleme, wenn mein nächstes geplantes Programm ausgeführt wird. – johnsonambrose

+0

so schließen wird das derzeit aktive Fenster schließen und wird Chromedriver ziemlich töten. Wenn Sie das Programm beenden, müssen Sie den Befehl "Schließen" verwenden, um Chrome und den Treiber zu schließen. –

Antwort

0

Sie es unten in der Fahrer Fabrik sein und den Code nicht driver.close() auf der bestimmten Seite verwenden, lassen Sie zu verwenden:

//This closes the browser after each test class 

@AfterClass 
public void tearDown() 
{ 
    driver.quit(); 
} 

Es sollte helfen.

+0

Ich habe versucht, driver.quit anstelle von driver.close() zu verwenden. Das Problem ist jedoch, dass es alles schließt, was das Programm geöffnet hat, und die Ausführung des gesamten darunter liegenden Codes beendet. Wenn ich zu 1.Nutzungsbedingungen 2.Datenschutzrichtlinie 3.Copyright Information von der Homepage gehen musste. und wenn ich auf den Nutzungsbedingungen Link klicke und ein neues Fenster öffne, wenn ich driver.quit() anstelle von driver.close() verwende, wird mein ursprünglicher Home Page Bildschirm geschlossen und das Programm wird dort nicht mehr ausgeführt. Ich muss mit meiner Ausführung fortfahren und muss weiter auf die "Datenschutzrichtlinie" und "Copyright Info" -Seite klicken – johnsonambrose

0

Die Ursache könnte in der anderen Stelle sein. Solche Probleme treten normalerweise auf, wenn unerwartete Ausnahmen ausgelöst werden, die verhindern, dass Ihr Framework die Sitzung sauber beendet.

Da wir nicht das gesamte Bild sehen, wie Sie WebDriver-Sitzungen verwalten, wird es nur ein Ratespiel sein.

Treiber selbst konnte über die Befehlszeile z. taskkill (oder welches Betriebssystem Sie verwenden), die über z. https://github.com/zeroturnaround/zt-exec Bibliothek. Aber es wäre nur ein Workaround, der eine mögliche Schwäche Ihrer Architektur verbergen würde.

1

Da Sie auf einen Link klicken, der ein neues Fenster öffnet, müssen wir zuerst die WindowHandle des übergeordneten Fensters speichern, die wir später verwenden werden, um zurück zum übergeordneten Fenster zu gehen. Klicken Sie auf den Link Terms of Use, sobald das neue Fenster geöffnet wird, verschieben wir den Fokus auf das neue Fenster, führen unsere Aufgaben dort aus und schließen es schließlich. Dann haben wir Selenium ‚verschieben s Fokus zurück auf das übergeordnete Fenster, durch das übergeordnete Fenster-Handle wie folgt:

driver.navigate().to("someurl.com"); 
    String parent = driver.getWindowHandle(); 
    System.out.println("Parent Window ID is : "+parent); 
    driver.findElement(By.xpath("Link_of_Terms_of_Use_opens_New_Window")).click(); 
    System.out.println("Home Page is loaded Successfully and Terms of Use Link is clicked"); 
    Set<String> allWindows = driver.getWindowHandles(); 
    int count = allWindows.size(); 
    System.out.println("Total Windows : "+count); 
    for(String child:allWindows) 
    { 
     if(!parent.equalsIgnoreCase(child)) 
     { 
      driver.switchTo().window(child); 
      System.out.println("Child Window Title is: "+driver.getTitle()); 
      //perform all your tasks in the new window here 
      driver.close(); 
     } 
    } 
    driver.switchTo().window(parent); 
    System.out.println("Parent Window Title is: "+driver.getTitle());