簡體   English   中英

Python Selenium:提取Chrome和Firefox瀏覽器的PID

[英]Python Selenium: Extracting the PID of Chrome and Firefox browser

如何獲取Selenium啟動的Chrome/Chromium或Firefox瀏覽器的進程ID(PID)? 我正在尋找一種在 Selenium Grid 中啟動瀏覽器時也能工作的解決方案。

Selenium Grid 無法使用driver.service.process.pid

要檢索Selenium啟動的 Chrome/Firefox 瀏覽器的進程 ID (PID) ,您可以使用以下解決方案:

火狐

  • 代碼塊:

     from selenium import webdriver driver = webdriver.Firefox(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: 2172

鉻合金

  • 代碼塊:

     from selenium import webdriver from contextlib import suppress import psutil driver = webdriver.Chrome(executable_path=r'C:\\WebDrivers\\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) driver.quit()
  • 控制台輸出:

     12384 13656 13800

參考

您可以在以下位置找到一些相關的詳細討論:

使用 Selenium 啟動瀏覽器時,它會為配置文件設置創建一個新的臨時目錄(除非另有說明)。 我們可以使用它來識別瀏覽器使用的特定進程:


In [470]: driver.capabilities
Out[470]: 
{'acceptInsecureCerts': False,
 'browserName': 'chrome',
 'browserVersion': '86.0.4240.198',
 'chrome': {'chromedriverVersion': '85.0.4183.87 (cd6713ebf92fa1cacc0f1a598df280093af0c5d7-refs/branch-heads/4183@{#1689})',
  'userDataDir': '/tmp/.com.google.Chrome.nW2W6p'},
 'goog:chromeOptions': {'debuggerAddress': 'localhost:44047'},
...}

這種方法適用於 Firefox 和 Chrome,即使您有多個瀏覽器實例正在運行,並且如果瀏覽器是通過 Selenium Grid 啟動的(如果代碼在節點服務器上運行)。

您將需要安裝psutil

pip install psutil
import psutil
import re
from typing import List


def pgrep(term, regex=False, full=True) -> List[psutil.Process]:
    """
    If `full`, then `term` is matched against the command line
    the process has been called with,
    else it is only matched against the process name.
    """
    procs = []
    for proc in psutil.process_iter(['pid', 'name', 'username', 'cmdline']):
        if full:
            name = ' '.join(proc.cmdline())
        else:
            name = proc.name()
        try:
            if regex and re.search(term, name):
                procs.append(proc)
            elif term in name:
                procs.append(proc)
        except psutil.NoSuchProcess:
            pass
    return procs


def browser_procs(driver) -> List[psutil.Process]:
    """
    Return the Processes associated with the browser
    (excluding geckodriver/chromedriver)
    """
    if driver.capabilities['browserName'] == 'firefox':
        directory = driver.capabilities['moz:profile']
    else:
        directory = driver.capabilities['chrome']['userDataDir']
    procs = pgrep(directory, full=True)
    procs.sort(key=lambda p: p.pid)
    return procs


def browser_proc(driver) -> psutil.Process:
    """
    Return the main Process of the browser
    (excluding geckodriver/chromedriver)
    """
    procs = browser_procs(driver)
    for proc in procs:
        name = proc.parent().name()
        if 'chromedriver' in name or 'geckodriver' in name:
            return proc
    raise ValueError



def driver_proc(driver) -> psutil.Process:
    """
    Return the Process of the geckodriver/chromedriver
    """
    return browser_proc(driver).parent()

讓我們看看它的實際效果:

In [436]: driver = Chrome()

In [451]: browser_procs(driver)
Out[468]: 
[psutil.Process(pid=38453, name='chrome', status='sleeping', started='18:45:51'),
 psutil.Process(pid=38462, name='chrome', status='sleeping', started='18:45:51'),
 psutil.Process(pid=38463, name='chrome', status='sleeping', started='18:45:51'),
 psutil.Process(pid=38467, name='chrome', status='sleeping', started='18:45:51'),
 psutil.Process(pid=38486, name='chrome', status='sleeping', started='18:45:52'),
 psutil.Process(pid=38489, name='chrome', status='sleeping', started='18:45:52'),
 psutil.Process(pid=38521, name='chrome', status='sleeping', started='18:45:52'),
 psutil.Process(pid=38522, name='chrome', status='sleeping', started='18:45:52')]

In [471]: p = browser_proc(driver)
In [472]: p.pid
Out[472]: 38453

如果您想要 chromedriver 或 geckodriver 的 PID,那么您可以通過browser_proc(driver).parent()獲取該進程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM