To bring browser to front, as per one of comments I need to get PID of browser. This helps to get PID but that is for Python. Is there any way, I can get PID of browser using Selenium WebDriver + Java?
            Asked
            
        
        
            Active
            
        
            Viewed 1,494 times
        
    2 Answers
3
            
            
        To retrieve the PID of Firefox Browser initiated and controlled by WebDriver using Selenium and java you can use getCapabilities() method and you can use the following solution:
- Code Block: - 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")); } }
- Console Output: - moz:processID value is : 4576
 
    
    
        undetected Selenium
        
- 183,867
- 41
- 278
- 352
- 
                    1thanks for the answer! It works for Firefox but could not find similar for Chrome. I'm looking for generic solution which will work across browsers. – Alpha Dec 26 '19 at 08:18
1
            
            
        I'm not sure whether it directly possible for Chrome as @DebanjanB posted for Firefox. You can use below code for now to achieve that
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();
}
UPDATED:
For windows, command is different. So need to make some tweaks in above code.
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();
Note: The command i passed to get PID is used on Mac. Please change it as per OS in case it doesn't work.
 
    
    
        NarendraR
        
- 7,577
- 10
- 44
- 82
- 
                    This is resulting into error - `java.io.IOException: Cannot run program "lsof": CreateProcess error=2, The system cannot find the file specified`. I'm working on Windows machine. Can you please suggest how to resolve this? What is equivalent of it? – Alpha Dec 26 '19 at 13:12
- 
                    @TDHM, if you are using windows then it must be a windows command to get a process id using port number. refer https://stackoverflow.com/a/37215252/5097027 – NarendraR Dec 26 '19 at 13:22
- 
                    This returns port correctly but no value is returned for executed command and hence `set.iterator().next();` results into `java.util.NoSuchElementException`. However same command manually executed gives correct result. – Alpha Dec 27 '19 at 06:02
- 
                    @TDHM https://chat.stackoverflow.com/rooms/204920/https-stackoverflow-com-questions-59484118-how-to-get-pid-of-a-browser-instance – NarendraR Dec 27 '19 at 06:58
- 
                    `lsof` takes a long time to run, would it be possible to use something more instantaneous, such as `ps`? – d-b Dec 22 '20 at 10:59
