2012-05-25 5 views

risposta

-2

Nessuno di cui sono a conoscenza. Ottenere il PID di solito richiede qualche modifica del codice Selenium. È tuttavia possibile ottenere il PID dal sistema anziché da Selenium stesso. Questo argomento sul gruppo di utenti WebDriver può essere utile:

https://groups.google.com/forum/#!topic/webdriver/_-8Slyn6qrI

+1

Se non ci sono test paralleli di esecuzione, più istanze del browser, non poteva competere con il processo selezionato con il interessata selenio ID di sessione –

17

Utilizzando l'API di Python, è abbastanza semplice:

from selenium import webdriver 
browser = webdriver.Firefox() 
print browser.binary.process.pid 
# browser.binary.process is a Popen object... 

Se stai usando Chrome, è un po 'più complessa, si va attraverso un processo chromedriver:

c = webdriver.Chrome() 
c.service.process # is a Popen instance for the chromedriver process 
import psutil 
p = psutil.Process(c.service.process.pid) 
print p.get_children(recursive=True) 
+1

Non sapete come farlo utilizzando nodejs? – k102

+1

Io no. L'ho trovato scavando attraverso la fonte, in un modulo chiamato "selenium.webdriver.firefox". Forse scavare intorno alla fonte js? Da qualche parte come qui? http://code.google.com/p/selenium/source/browse/javascript/firefox-driver/js/firefoxDriver.js – hwjp

+0

Questo non funziona se usi PhantomJS. Il driver non ha attributo binario. – ABM

8

Se stai usando PhantomJS allora si può ottenere il PID dal popen oggetto processo:

012.
from selenium import webdriver 
browser = webdriver.PhantomJS() 
print browser.service.process.pid 
0

per i ragazzi che stanno venendo qui per trovare una soluzione, eccolo, spero che ti possa aiutare.

protected Integer getFirefoxPid(FirefoxBinary binary){ 
    try { 
     final Field fieldCmdProcess = FirefoxBinary.class.getDeclaredField("process"); 
     fieldCmdProcess.setAccessible(true); 
     final Object ObjCmdProcess = fieldCmdProcess.get(binary); 

     final Field fieldInnerProcess = ObjCmdProcess.getClass().getDeclaredField("process"); 
     fieldInnerProcess.setAccessible(true); 
     final Object objInnerProcess = fieldInnerProcess.get(ObjCmdProcess); 

     final Field fieldWatchDog = objInnerProcess.getClass().getDeclaredField("executeWatchdog"); 
     fieldWatchDog.setAccessible(true); 
     final Object objWatchDog = fieldWatchDog.get(objInnerProcess); 

     final Field fieldReelProcess = objWatchDog.getClass().getDeclaredField("process"); 
     fieldReelProcess.setAccessible(true); 
     final Process process = (Process) fieldReelProcess.get(objWatchDog); 

     final Integer pid; 

     if (Platform.getCurrent().is(WINDOWS)) { 
      final Field f = process.getClass().getDeclaredField("handle"); 
      f.setAccessible(true); 
      long hndl = f.getLong(process); 

      final Kernel32 kernel = Kernel32.INSTANCE; 
      final WinNT.HANDLE handle = new WinNT.HANDLE(); 
      handle.setPointer(Pointer.createConstant(hndl)); 
      pid = kernel.GetProcessId(handle); 

     } else { 
      final Field f = process.getClass().getDeclaredField("pid"); 
      f.setAccessible(true); 
      pid = (Integer) f.get(process); 
     } 
     logger.info("firefox process id : " + pid + " on plateform : " + Platform.getCurrent()); 
     return pid; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     logger.error("Cannot get firefox process id, exception is : {}", e); 
    } 
    return null; 
} 
0

Se si utilizza Java e selenio, si può semplicemente prima trovare il PID della JVM e poi attraverso i suoi processi figli, è possibile ottenere il PID di chromedriver e poi allo stesso modo PID di Chrome. Ecco un esempio per trovare il PID di chromedriver.

final String jvmName = ManagementFactory.getRuntimeMXBean().getName(); 
    final int index = jvmName.indexOf('@'); 
    if(index > 1) { 
     try { 
      String processId = Long.toString(Long.parseLong(jvmName.substring(0, index))); 
      Scanner scan = new Scanner(Runtime.getRuntime().exec("wmic process where (ParentProcessId="+ processId +") get Caption,ProcessId").getInputStream()); 
      scan.useDelimiter("\\A"); 
      String childProcessIds = scan.hasNext() ? scan.next() : ""; 
      List<String> chromeDrivers = new ArrayList<String>(); 
      String[] splited = childProcessIds.split("\\s+"); 
      for(int i =0 ; i<splited.length; i = i+2){ 
       if("chromedriver.exe".equalsIgnoreCase(splited[i])){ 
        chromeDrivers.add(splited[i+1]); 
       } 
      } 
      /*    
      * 
      *Do whatever you want to do with the chromedriver's PID here  
      * 
      * */   
      scan.close(); 
     } catch (Exception e) { 

     } 
    }