【发布时间】:2020-04-16 10:36:50
【问题描述】:
到bring browser to front,根据cmets 之一,我需要获取浏览器的PID。 This 有助于获取 PID,但这是针对 Python 的。有什么办法,我可以使用 Selenium WebDriver + Java 获取浏览器的 PID 吗?
【问题讨论】:
标签: java selenium selenium-webdriver
到bring browser to front,根据cmets 之一,我需要获取浏览器的PID。 This 有助于获取 PID,但这是针对 Python 的。有什么办法,我可以使用 Selenium WebDriver + Java 获取浏览器的 PID 吗?
【问题讨论】:
标签: java selenium selenium-webdriver
要检索由WebDriver 使用Selenium 和java 发起和控制的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
【讨论】:
我不确定 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 机器上工作。你能建议如何解决这个问题吗?相当于什么?
set.iterator().next(); 会导致java.util.NoSuchElementException。然而,手动执行的相同命令给出了正确的结果。
lsof 需要很长时间才能运行,是否可以使用更瞬时的东西,例如ps?