我想获得selenium推出的浏览器的PID。有没有办法完成它?
答案 0 :(得分:22)
使用Python API,非常简单:
from selenium import webdriver
browser = webdriver.Firefox()
print browser.binary.process.pid
# browser.binary.process is a Popen object...
如果你正在使用Chrome,那就更复杂了,你可以通过一个镀铬过程:
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 :(得分:10)
如果您正在使用PhantomJS,那么您可以从进程Popen对象中获取PID:
from selenium import webdriver
browser = webdriver.PhantomJS()
print browser.service.process.pid
答案 2 :(得分:4)
在Java中,如果您使用ChromeDriver,则可以找到驱动程序将使用的端口
port = chromeDriverService.getUrl().getPort();
然后,使用该端口,您可以通过运行命令
找到chromedriver进程IDnetstat -anp | grep LISTEN | grep [port] (on linux)
或
netstat -aon | findstr LISTENING | findstr [port] (on windows)
您可以通过使用chromedriver进程ID(chrome进程的父ID)来进一步查找chrome进程ID
ps -efj | grep google-chrome | grep [chromedriverprocessid] (on linux)
或
wmic process get processid,parentprocessid,executablepath | find \"chrome.exe\" |find \"chromeDriverProcessID\"
代码如下所示:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import org.apache.commons.lang.SystemUtils;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
public class WebdriverProcessID
{
public static void main(String[] args) throws IOException, InterruptedException
{
ChromeDriver driver = null;
ChromeOptions options = new ChromeOptions();
List<String> listArguments = new ArrayList<String>();
DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(ChromeOptions.CAPABILITY, options);
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
ChromeDriverService chromeDriverService = ChromeDriverService.createDefaultService();
int port = chromeDriverService.getUrl().getPort();
driver = new ChromeDriver(chromeDriverService, cap);
System.out.println("starting chromedriver on port " + port);
int chromeDriverProcessID = GetChromeDriverProcessID(port);
System.out.println("detected chromedriver process id " + chromeDriverProcessID);
System.out.println("detected chrome process id " + GetChromeProcesID(chromeDriverProcessID));
driver.navigate().to("https://www.test.com/");
try
{
Thread.sleep(100000);
}
catch (InterruptedException e)
{
}
try
{
driver.close();
}
catch (WebDriverException ex)
{
ex.printStackTrace();
}
try
{
driver.quit();
}
catch (WebDriverException ex)
{
ex.printStackTrace();
}
}
private static int GetChromeDriverProcessID(int aPort) throws IOException, InterruptedException
{
String[] commandArray = new String[3];
if (SystemUtils.IS_OS_LINUX)
{
commandArray[0] = "/bin/sh";
commandArray[1] = "-c";
commandArray[2] = "netstat -anp | grep LISTEN | grep " + aPort;
}
else if (SystemUtils.IS_OS_WINDOWS)
{
commandArray[0] = "cmd";
commandArray[1] = "/c";
commandArray[2] = "netstat -aon | findstr LISTENING | findstr " + aPort;
}
else
{
System.out.println("platform not supported");
System.exit(-1);
}
System.out.println("running command " + commandArray[2]);
Process p = Runtime.getRuntime().exec(commandArray);
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = "";
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
String result = sb.toString().trim();
System.out.println("parse command response line:");
System.out.println(result);
return SystemUtils.IS_OS_LINUX ? ParseChromeDriverLinux(result) : ParseChromeDriverWindows(result);
}
private static int GetChromeProcesID(int chromeDriverProcessID) throws IOException, InterruptedException
{
String[] commandArray = new String[3];
if (SystemUtils.IS_OS_LINUX)
{
commandArray[0] = "/bin/sh";
commandArray[1] = "-c";
commandArray[2] = "ps -efj | grep google-chrome | grep " + chromeDriverProcessID;
}
else if (SystemUtils.IS_OS_WINDOWS)
{
commandArray[0] = "cmd";
commandArray[1] = "/c";
commandArray[2] = "wmic process get processid,parentprocessid,executablepath | find \"chrome.exe\" |find \"" + chromeDriverProcessID + "\"";
}
else
{
System.out.println("platform not supported");
System.exit(-1);
}
System.out.println("running command " + commandArray[2]);
Process p = Runtime.getRuntime().exec(commandArray);
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = "";
while ((line = reader.readLine()) != null)
{
if (SystemUtils.IS_OS_LINUX && line.contains("/bin/sh"))
{
continue;
}
sb.append(line + "\n");
}
String result = sb.toString().trim();
System.out.println("parse command response line:");
System.out.println(result);
return SystemUtils.IS_OS_LINUX ? ParseChromeLinux(result) : ParseChromeWindows(result);
}
private static int ParseChromeLinux(String result)
{
String[] pieces = result.split("\\s+");
// root 20780 20772 20759 15980 9 11:04 pts/1 00:00:00 /opt/google/chrome/google-chrome.........
// the second one is the chrome process id
return Integer.parseInt(pieces[1]);
}
private static int ParseChromeWindows(String result)
{
String[] pieces = result.split("\\s+");
// C:\Program Files (x86)\Google\Chrome\Application\chrome.exe 14304 19960
return Integer.parseInt(pieces[pieces.length - 1]);
}
private static int ParseChromeDriverLinux(String netstatResult)
{
String[] pieces = netstatResult.split("\\s+");
String last = pieces[pieces.length - 1];
// tcp 0 0 127.0.0.1:2391 0.0.0.0:* LISTEN 3333/chromedriver
return Integer.parseInt(last.substring(0, last.indexOf('/')));
}
private static int ParseChromeDriverWindows(String netstatResult)
{
String[] pieces = netstatResult.split("\\s+");
// TCP 127.0.0.1:26599 0.0.0.0:0 LISTENING 22828
return Integer.parseInt(pieces[pieces.length - 1]);
}
}
输出将在linux上:
starting chromedriver on port 17132
running command netstat -anp | grep LISTEN | grep 17132
parse command response line:
tcp 0 0 127.0.0.1:17132 0.0.0.0:* LISTEN 22197/chromedriver
detected chromedriver process id 22197
running command ps -efj | grep google-chrome | grep 22197
parse command response line:
root 22204 22197 22183 15980 26 11:17 pts/1 00:00:00 /opt/google/chrome/google-chrome ...
detected chrome process id 22204
并在Windows上:
starting chromedriver on port 34231
running command netstat -aon | findstr LISTENING | findstr 34231
parse command response line:
TCP 127.0.0.1:34231 0.0.0.0:0 LISTENING 10692
detected chromedriver process id 10692
running command wmic process get "processid,parentprocessid,executablepath" | findstr "chrome.exe" | findstr "10692"
parse command response line:
C:\Program Files (x86)\Google\Chrome\Application\chrome.exe 10692 12264
detected chrome process id 12264
答案 3 :(得分:4)
hwjp的解决方案对我而言不再有效,但是如果有人怀疑,ABM的解决方案也适用于其他浏览器,所以到目前为止,对于Firefox:
from selenium import webdriver
driver = webdriver.Firefox()
print(driver.service.process.pid)
由于声誉而无法发表评论,所以我将其作为单独的答案提交...
答案 4 :(得分:1)
您可以使用Selenium客户端通过以下几种不同方式来检索python启动的浏览器进程的PID:
使用以下解决方案访问capabilities对象,该对象将返回dictionary:
代码块:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
options = Options()
options.binary_location = r'C:\Program Files\Firefox Nightly\firefox.exe'
driver = webdriver.Firefox(firefox_options=options, executable_path=r'C:\WebDrivers\geckodriver.exe')
my_dict = driver.capabilities
print("PID of the browser process is: " + str(my_dict['moz:processID']))
控制台输出:
PID of the browser process is: 14240
浏览器快照:
使用psutil.process_iter()
遍历整个过程,其中process.cmdline()
包含 --test-type=webdriver
,如下所示:
代码块:
from selenium import webdriver
from contextlib import suppress
import psutil
driver = webdriver.Chrome(executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get('https://www.google.com/')
for process in psutil.process_iter():
if process.name() == 'chrome.exe' and '--test-type=webdriver' in process.cmdline():
with suppress(psutil.NoSuchProcess):
print(process.pid)
控制台输出:
1164
1724
4380
5748
浏览器快照:
答案 5 :(得分: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;
}
答案 6 :(得分:0)
如果你正在使用java和selenium,你可以先找到JVM的PID,然后通过它的子进程,你可以得到chromedriver的PID,然后是chrome的chrome。这是一个找到chromedriver PID的例子。
forChild
答案 7 :(得分:0)
我这样解决了:
我正在使用 Python 的 Linux操作系统来检测 Firefox 的内存使用情况:
import psutil
# Get pid of geckodriver
webdriver_pid = driver.service.process.pid
# Get the process of geckodriver
process = psutil.Process(webdriver_pid)
# Get memory of geckodriver + firefox
# Since memory is in bytes divide by 1024*1024 to obtain result in MB
total_memory = sum([x.memory_info().rss/1048576 for x in process.children() + [process]])
答案 8 :(得分:0)
这是可用于C#和Selenium的示例。其他语言(例如Java)也可以使用相同的实现,但是我只使用C#。
Chrome允许您提供自己的用户定义的命令行参数。因此,您可以在当前正在运行的程序的PID(Windows进程ID)中添加一个名为“ scriptpid-”的参数。 ChromeDriver在命令行中将参数传递给Chrome。然后使用Windows WMI调用从正在运行的Chrome的命令行中检索此PID ...
public static IntPtr CurrentBrowserHwnd = IntPtr.Zero;
public static int CurrentBrowserPID = -1;
ChromeOptions options = new ChromeOptions();
options.AddArgument("scriptpid-" + System.Diagnostics.Process.GetCurrentProcess().Id);
IWebDriver driver = new ChromeDriver(options);
// Get the PID and HWND details for a chrome browser
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("chrome");
for (int p = 0; p < processes.Length; p++)
{
ManagementObjectSearcher commandLineSearcher = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + processes[p].Id);
String commandLine = "";
foreach (ManagementObject commandLineObject in commandLineSearcher.Get())
{
commandLine += (String)commandLineObject["CommandLine"];
}
String script_pid_str = (new Regex("--scriptpid-(.+?) ")).Match(commandLine).Groups[1].Value;
if (!script_pid_str.Equals("") && Convert.ToInt32(script_pid_str).Equals(System.Diagnostics.Process.GetCurrentProcess().Id))
{
CurrentBrowserPID = processes[p].Id;
CurrentBrowserHwnd = processes[p].MainWindowHandle;
break;
}
}
CurrentBrowserHwnd 应该包含您的Chrome窗口的HWND。
CurrentBrowserPID 应该包含您的Chrome窗口的进程ID。
答案 9 :(得分:-3)
我不知道。获取PID通常需要对Selenium代码进行一些修改。但是,您可以从系统而不是从Selenium本身获取PID。关于webdriver用户组的这个主题可能会有所帮助:
https://groups.google.com/forum/#!topic/webdriver/_-8Slyn6qrI