【问题标题】:How to get PID of a browser instance using Selenium WebDriver + Java?如何使用 Selenium WebDriver + Java 获取浏览器实例的 PID?
【发布时间】:2020-04-16 10:36:50
【问题描述】:

bring browser to front,根据cmets 之一,我需要获取浏览器的PID。 This 有助于获取 PID,但这是针对 Python 的。有什么办法,我可以使用 Selenium WebDriver + Java 获取浏览器的 PID 吗?

【问题讨论】:

    标签: java selenium selenium-webdriver


    【解决方案1】:

    要检索由WebDriver 使用Selenium 发起和控制的Firefox 浏览器 的PID,可以使用getCapabilities() 方法,可以使用以下解决方案:

    • 代码块:

      import java.io.IOException;
      
      import org.openqa.selenium.Capabilities;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.firefox.FirefoxDriver;
      import org.openqa.selenium.remote.RemoteWebDriver;
      
      public class PID_Firefox_Java {
      
          public static void main(String[] args) throws IOException {
      
              System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
              WebDriver driver = new FirefoxDriver();
              Capabilities cap = ((RemoteWebDriver) driver).getCapabilities();
              System.out.println("moz:processID value is : "+cap.getCapability("moz:processID"));
          }
      }
      
    • 控制台输出:

      moz:processID value is : 4576
      

    【讨论】:

    • 感谢您的回答!它适用于 Firefox,但在 Chrome 中找不到类似的。我正在寻找可以跨浏览器工作的通用解决方案。
    【解决方案2】:

    我不确定 Chrome 是否可以直接使用 @DebanjanB 为 Firefox 发布的内容。您现在可以使用下面的代码来实现这一目标

    public static void main(String[] args) throws IOException {
    
        System.out.println(new Example().getProcessId("firefox"));
    }
    
    
    public String getProcessId(String browserName) throws IOException {
        int port = 0;
        WebDriver driver;
    
    
        if (browserName.equalsIgnoreCase("firefox")) {
            WebDriverManager.firefoxdriver().setup();
            GeckoDriverService service = GeckoDriverService.createDefaultService();
            driver = new FirefoxDriver(service);
            port = service.getUrl().getPort();
    
    
        } else if (browserName.equalsIgnoreCase("chrome")) {
            WebDriverManager.chromedriver().setup();
            ChromeDriverService service = ChromeDriverService.createDefaultService();
            driver = new ChromeDriver(service);
            port = service.getUrl().getPort();
    
        }
        BufferedReader reader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("lsof -i :" + port).getInputStream()));
        StringBuilder builder = new StringBuilder();
        String line = null;
        Set<String> set = new HashSet<String>();
        while ((line = reader.readLine()) != null) {
            if (line.contains(String.valueOf(port)) && line.contains("LISTEN")) {
                set.add(line.split(" ")[1]);
            }
        }
        return set.iterator().next();
    }
    

    更新:

    对于 Windows,命令是不同的。所以需要对上面的代码做一些调整。

    BufferedReader reader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("netstat -aon | find \""+ port+"\"").getInputStream()));
    StringBuilder builder = new StringBuilder();
    String line = null;
    Set<String> set = new HashSet<String>();
    while ((line = reader.readLine()) != null) {
        if (line.contains(String.valueOf(port)) && line.contains("LISTEN")) {
            String s[]=line.split(" ");
            set.add(s[s.length-1]);
        }
    }
    return set.iterator().next();
    

    注意:我传递来获取 PID 的命令在 Mac 上使用。请根据操作系统更改它,以防它不起作用。

    【讨论】:

    • 这会导致错误 - java.io.IOException: Cannot run program "lsof": CreateProcess error=2, The system cannot find the file specified。我在 Windows 机器上工作。你能建议如何解决这个问题吗?相当于什么?
    • @TDHM,如果您使用的是 windows,那么它必须是 windows 命令才能使用端口号获取进程 ID。参考stackoverflow.com/a/37215252/5097027
    • 这会正确返回端口,但不会为执行的命令返回任何值,因此set.iterator().next(); 会导致java.util.NoSuchElementException。然而,手动执行的相同命令给出了正确的结果。
    • lsof 需要很长时间才能运行,是否可以使用更瞬时的东西,例如ps
    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 2012-09-15
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多