2013-10-02 3 views
13

Auf PhantomJS 1.9.2, ubuntu 12 LTS und Ghostdirver 1.04 zusammen mit Selen 2.35 Ich bekomme Phantomjs Prozesse nach meinen Tests baumeln. Jeder weiß einen guten Weg, um das zu beheben?phantomjs nicht schließen und verlassen verwaiste Prozesse

Hier ist ein Testprogramm, das das seltsame Verhalten zeigt:

package testing; 

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.phantomjs.PhantomJSDriver; 
import org.openqa.selenium.phantomjs.PhantomJSDriverService; 
import org.openqa.selenium.remote.DesiredCapabilities; 

public class PhantomIsNotKilledDemo { 

    private static WebDriver getDriver(){ 
     String browserPathStr = System.getProperty("selenium.pathToBrowser"); 
     if (browserPathStr == null) browserPathStr = "/home/user1/apps/phantomjs/bin/phantomjs"; 

     DesiredCapabilities caps = DesiredCapabilities.phantomjs(); 

     caps.setCapability("takesScreenshot", true); 
     caps.setCapability(
       PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, 
       browserPathStr); 

     WebDriver driver = new PhantomJSDriver(caps); 

     return driver; 
    } 

    public static void main(String[] args) { 
     int max = 10; 
     for (int i = 0; i < max; i++){ 
      WebDriver d1 = getDriver(); 
      d1.get("http://www.imdb.com/title/tt1951264"); 

      System.out.println("done with cycle " + (i+1) +" of "+max); 
      d1.close(); 
      //d1.quit(); 
     } 

     System.out.println("done"); 
     System.exit(0); 
    } 
} 

dies ausführen zu können, sollten Sie den Pfad entsprechend Ihrer PhantomJS binär als Systemeigenschaft oder die Variable liefern.

Nach diesen Lauf zu lassen ich dieses Shell-Befehl

ps -ef | grep phantomjs 

und 10 baumelnden PhantomJS Prozesse finden.

Wenn ich stattdessen d1.quit() benutze, habe ich keinen Dangling-Prozess. Dies ist deutlich besser, aber ich hätte erwartet, dass das gleiche Ergebnis mit .close erhalten.

Hinweis, dies ist ein Crossposting von https://github.com/detro/ghostdriver/issues/162#issuecomment-25536311

aktualisieren Dieser Beitrag geändert wird nach Richards Vorschlag (siehe unten).

Antwort

9

Sie sollten quit() verwenden, um den Prozess statt close() zu beenden.

Wie Sie festgestellt haben, schließt schließen das aktuelle Fenster (und Browser), aber es wird nicht den Prozess herunterfahren. Dies ist nützlich, wenn Sie zusätzliche Befehle an den Prozess senden oder den Prozess überprüfen möchten.

Beenden ist für, wenn Sie jedes Fenster schließen und den Prozess stoppen möchten, der wie das klingt, wonach Sie suchen.

Die documentation für diese beiden Methoden lautet:

close()

das aktuelle Fenster schließen, um den Browser zu verlassen, wenn es das letzte Fenster derzeit geöffnet ist.

beenden()

diesen Treiber wird beendet, alle zugehörigen Fenster schließen.

+2

endlich wirft jemand Licht darauf. Vielleicht haben sie die Unterlagen geklärt, seit ich meine Frage gestellt habe, seitdem ich den Unterschied nicht gesehen habe. Es ist immer noch ein ziemlich seltsames und ziemlich unerwartetes Verhalten, aber naja - so sei es. Danke, dass du darauf hingewiesen hast. – luksch

3

Ich würde Ihren Code in etwa so umschreiben:

public static void main(String[] args) { 
    int max = 10; 
    for (int i = 0; i < max; i++){ 
     WebDriver d1 = getDriver(); 

     d1.get("http://www.imdb.com/title/tt1951264"); 

     System.out.println("done with cycle " + (i+1) +" of "+max); 
     d1.quit(); 
    } 

    System.out.println("done"); 
    System.exit(0); 
} 

Ich bin nicht ganz sicher, warum die .close() ist die WebDriver nicht endet. Theoretisch sollte .close() WebDriver beenden, wenn es im letzten geöffneten Fenster aufgerufen wird. Vielleicht öffnet etwas ein zweites Fenster, wenn diese URL aufgerufen wird? Oder vielleicht .close() funktioniert anders für Phantomjs.

Wie, warum .quit() wird alle der PhantomJS Sitzungen nicht geschlossen wird, der letzte getDriver() Sie anrufen keine entsprechende .quit() außerhalb der Schleife haben. Ich restrukturierte Ihre for-Schleife, um die Instanz von WebDriver zu erstellen, führen Sie Ihren Test, dann .quit() diese Sitzung von WebDriver/phantomjs am Ende jeder Schleife durch.

+0

Sie haben Recht über die falsche Platzierung von '' 'WebDriver d1 = getDriver();' '' Ich ändere meine Frage. Danke für das Hinzeigen. Die eigentliche Frage ist jedoch, warum '' .close() '' 'nicht tut, was es tun sollte. Es gibt nur ein einziges Fenster. Sie können andere URLs verwenden und haben den gleichen Effekt. – luksch