Есть ли способ получить Chrome pid, который контролируется селеном без сторонней библиотеки? [Дубликат]

Регулярное выражение

(?:(?:(?=.*?[0-9])(?=.*?[-!@#$%&*ˆ+=_])|(?:(?=.*?[0-9])|(?=.*?[A-Z])|(?=.*?[-!@#$%&*ˆ+=_])))|(?=.*?[a-z])(?=.*?[0-9])(?=.*?[-!@#$%&*ˆ+=_]))[A-Za-z0-9-!@#$%&*ˆ+=_]{6,15}
22
задан Harshavardhan Konakanchi 25 May 2012 в 11:11
поделиться

6 ответов

Если вы используете PhantomJS, вы можете получить PID из объекта Popen процесса:

from selenium import webdriver
browser = webdriver.PhantomJS()
print browser.service.process.pid  
9
ответ дан ABM 25 August 2018 в 17:31
поделиться

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

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
ответ дан Ismoh 25 August 2018 в 17:31
поделиться

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

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

-2
ответ дан JacekM 25 August 2018 в 17:31
поделиться

Если вы используете java и selenium, вы можете просто сначала найти PID JVM, а затем через свои дочерние процессы, вы можете получить PID хромодровера, а затем аналогично 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) {

        }
    }
0
ответ дан Prabhat Kumar Singh 25 August 2018 в 17:31
поделиться

В Java, если вы используете ChromeDriver, вы можете найти порт, который будет использовать драйвер

port = chromeDriverService.getUrl().getPort();

, а затем, используя порт, вы можете найти идентификатор процесса хромированной передачи, выполнив команду

netstat -anp | grep LISTEN | grep [port] (on linux)

или

netstat -aon | findstr LISTENING | findstr [port] (on windows)

Вы можете пойти дальше, чтобы узнать идентификатор процесса chrome, используя идентификатор процесса chromedriver (родительский идентификатор процесса chrome)

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

и на окнах:

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 | find "chrome.exe" |find "10692"
parse command response line:
C:\Program Files (x86)\Google\Chrome\Application\chrome.exe  10692 12264
detected chrome process id 12264
0
ответ дан Stefan Matei 25 August 2018 в 17:31
поделиться

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

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)
20
ответ дан thirtydot 25 August 2018 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: