Vorrei ottenere il PID del browser lanciato dal selenio. C'è un modo per farlo?Ottieni PID del browser lanciato dal selenio
risposta
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
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)
Non sapete come farlo utilizzando nodejs? – k102
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
Questo non funziona se usi PhantomJS. Il driver non ha attributo binario. – ABM
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
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;
}
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) {
}
}
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 –