2013-10-02 11 views
13

Su PhantomJS 1.9.2, ubuntu 12 LTS e Ghostdirver 1.04 insieme al selenio 2.35 I processi phantomjs penzolanti si verificano dopo i miei test. Qualcuno sa un buon modo come risolvere questo?phantomjs non si chiude e lascia i processi orfani

Ecco un programma di test che illustra il comportamento strano:

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

Per eseguire questo, si dovrebbe fornire il percorso dei vostri phantomjs binari come proprietà di sistema o di impostare la variabile di conseguenza.

Dopo aver abbandonato questo percorso lo faccio comando di shell

ps -ef | grep phantomjs 

e trovare 10 penzolanti processi phantomjs.

Se si utilizza d1.quit(), invece, si finisce senza alcun processo di oscillazione. Questo è chiaramente migliore, ma comunque mi sarei aspettato di ottenere lo stesso risultato con .close.

Nota, questo è un crosspost di https://github.com/detro/ghostdriver/issues/162#issuecomment-25536311

Aggiornamento Questo post viene modificato secondo il suggerimento di Richard (vedi sotto).

risposta

9

Si dovrebbe utilizzare quit() per terminare il processo anziché close().

Come hai scoperto, chiudi chiuderà la finestra corrente (e il browser), ma non spegnerà il processo. Questo è utile se stai per inviare comandi aggiuntivi al processo o vuoi ispezionare il processo.

Chiudere è per quando si desidera chiudere ogni finestra e interrompere il processo, che suona come quello che stai cercando.

Il documentation per questi due metodi si legge:

vicino()

Chiudere la finestra corrente, l'uscita dal browser, se è l'ultima finestra attualmente aperta.

quit()

chiude questo driver, chiudere ogni finestra associata.

+2

finalmente qualcuno fa luce su questo. Forse hanno chiarito i documenti da quando ho fatto la mia domanda da allora non ho visto la differenza. È ancora un comportamento piuttosto strano e piuttosto inaspettato, ma vabbè - così sia. Grazie per averlo indicato. – luksch

3

Mi piacerebbe riscrivere il codice a qualcosa di simile:

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

io non sono del tutto sicuro perché il .close() non sta finendo il WebDriver. In teoria, .close() dovrebbe chiudere WebDriver se viene chiamato nell'ultima finestra aperta. Forse qualcosa sta aprendo una seconda finestra quando viene chiamato quell'url? O forse .close() funziona in modo diverso per phantomjs.

Quanto al perché .quit() non si chiude tutte le sessioni phantomjs, l'ultimo getDriver() che si sta chiamando non hai corrispondente .quit() al di fuori del ciclo. Ho ristrutturato il tuo ciclo for per creare l'istanza di WebDriver, eseguire il test, quindi .quit() quella sessione di WebDriver/phantomjs alla fine di ogni ciclo.

+0

si ha ragione sul posizionamento errato di '' 'WebDriver d1 = getDriver();' '' Ho cambiato la mia domanda. grazie per averlo indicato. Comunque, la vera domanda è perché ''. .close() '' 'non sta facendo quello che dovrebbe fare. C'è solo una finestra davvero. Puoi prendere altri URL e avere lo stesso effetto. – luksch