2012-05-25 5 views

ответ

-2

Нет, что я знаю. Получение PID обычно требует некоторой модификации кода Selenium. Однако вы можете получить ПИД из системы, а не от самого Селена. Эта тема на WebDriver группы пользователей могут быть полезны:

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

+1

Если есть параллельные тесты, исполняющие, несколько экземпляров браузера, мы не могли соответствовать выбранному процессу с соответствующей селеном идентификатор сеанса –

17

Используя API Python, это довольно просто:

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

Если вы используете Chrome, это немного более сложным, вы идете с помощью процесса 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

Вы не знаете, как получить его с помощью nodejs? – k102

+1

Я этого не делаю. Я нашел его, копаясь через источник, в модуле под названием 'selenium.webdriver.firefox'. Может быть, копаться через источник js? Где-то здесь? http://code.google.com/p/selenium/source/browse/javascript/firefox-driver/js/firefoxDriver.js – hwjp

+0

Это не работает, если вы используете PhantomJS. Драйвер не имеет двоичного атрибута. – ABM

8

Если вы используете PhantomJS, то вы можете получить PID из технологического объекта POPEN:

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

для парней, отправляющихся сюда, чтобы найти решение, вот оно, надеюсь, оно вам поможет.

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

Если вы используете Java и селен, вы можете просто сначала найти PID из виртуальной машины Java, а затем через его дочерние процессы, вы можете получить PID из chromedriver, а затем аналогичным образом PID хрома. Вот пример, чтобы найти PID хромированного ребра.

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) { 

     } 
    } 
Смежные вопросы