获取selenium发布的浏览器PID

Har*_*chi 24 selenium webdriver selenium-rc selenium-webdriver

我想获得selenium推出的浏览器的PID.有没有办法完成它?

hwj*_*wjp 22

使用Python API,它非常简单:

from selenium import webdriver
browser = webdriver.Firefox()
print browser.binary.process.pid
# browser.binary.process is a Popen object...
Run Code Online (Sandbox Code Playgroud)

如果你使用的是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)
Run Code Online (Sandbox Code Playgroud)

  • 使用chrome现在是p.children而不是p.get_children (3认同)
  • 你不知道如何使用nodejs获取它吗? (2认同)
  • 我不。我通过在名为“selenium.webdriver.firefox”的模块中挖掘源代码找到了它。也许可以通过 js 源代码进行挖掘?像这里这样的地方吗?http://code.google.com/p/selenium/source/browse/javascript/firefox-driver/js/firefoxDriver.js (2认同)
  • 出于某种原因,当我使用geckodriver使用firefox时,这不起作用.在这种情况下,@ ABM建议的答案运行良好 (2认同)
  • 从 psutil 文档:`get_children` 现在是 `children`:http://pythonhosted.org/psutil/#psutil.Process.children (2认同)

ABM*_*ABM 10

如果您正在使用PhantomJS,那么您可以从进程Popen对象获取PID:

from selenium import webdriver
browser = webdriver.PhantomJS()
print browser.service.process.pid  
Run Code Online (Sandbox Code Playgroud)


小智 8

hwjp的解决方案对我而言不再有效,但如果有人怀疑,ABM的解决方案也可用于其他浏览器,因此截至目前,对于firefox:

from selenium import webdriver
driver = webdriver.Firefox()
print(driver.service.process.pid)
Run Code Online (Sandbox Code Playgroud)

由于声誉而无法发表评论,因此我将其作为单独的答案提交...

  • 这是一个答案,您不必为这不是评论而道歉。至于代表,这里有一些,所以你将能够发表评论。:) (2认同)
  • 获取RemoteBrowser的PID怎么样?有知道的请更新一下.. (2认同)
  • @nmfzone 请参阅下面的[答案](/sf/answers/4045743691/)。(请注意,此答案返回驱动程序的 PID,至少对于 Firefox 而言) (2认同)

Ste*_*tei 7

在Java中,如果你使用ChromeDriver,你可以找到驱动程序将使用的端口

port = chromeDriverService.getUrl().getPort();
Run Code Online (Sandbox Code Playgroud)

然后,使用端口,您可以通过运行命令找到 chromedriver 进程 ID

netstat -anp | grep LISTEN | grep [port] (on linux)
Run Code Online (Sandbox Code Playgroud)

或者

netstat -aon | findstr LISTENING | findstr [port] (on windows)
Run Code Online (Sandbox Code Playgroud)

您可以更进一步,通过使用 chromedriver 进程 id(chrome 进程的父 id)找出 chrome 进程 id

ps -efj | grep google-chrome | grep [chromedriverprocessid] (on linux)
Run Code Online (Sandbox Code Playgroud)

或者

wmic process get processid,parentprocessid,executablepath | find \"chrome.exe\" |find \"chromeDriverProcessID\"
Run Code Online (Sandbox Code Playgroud)

代码如下所示:

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]);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出将是,在 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
Run Code Online (Sandbox Code Playgroud)

并在窗户上:

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
Run Code Online (Sandbox Code Playgroud)


Deb*_*anB 5

您可以通过以下不同的方式使用客户端检索Selenium启动的浏览器进程的 PID :


火狐

使用以下解决方案访问返回功能对象:

  • 代码块:

    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']))
    
    Run Code Online (Sandbox Code Playgroud)
  • 控制台输出:

    PID of the browser process is: 14240
    
    Run Code Online (Sandbox Code Playgroud)
  • 浏览器快照:

火狐PID


铬合金

使用psutil.process_iter()where process.cmdline()contains遍历进程--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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 控制台输出:

    1164
    1724
    4380
    5748        
    
    Run Code Online (Sandbox Code Playgroud)
  • 浏览器快照:

Chrome_Process