问题描述
我的问题与这个问题非常相似.我启动了许多 WebDriver
实例,其中一些不响应 driver.quit()
.如此响应中所述,我可以通过从功能对象中直接检索 PID 来终止浏览器实例通过以下代码:
代码块:
import java.io.IOException;导入 org.openqa.selenium.Capabilities;导入 org.openqa.selenium.WebDriver;导入 org.openqa.selenium.firefox.FirefoxDriver;导入 org.openqa.selenium.remote.RemoteWebDriver;公共类 Kill_Firefox_PID {public static void main(String[] args) 抛出 IOException {System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");WebDriver 驱动程序 = 新的 FirefoxDriver();Capabilities cap = ((RemoteWebDriver) driver).getCapabilities();System.out.println("moz:processID 值为:"+cap.getCapability("moz:processID"));Runtime.getRuntime().exec("taskkill/PID "+cap.getCapability("moz:processID"));}}
控制台输出:
moz:processID 值为:8492
虽然这可以很好地杀死浏览器本身,但当我打开任务管理器时,我仍然看到 Geckodriver
的实例.正如另一个线程中所述,我无法通过 taskkill/f/im geckodriver.exe
不加选择地杀死所有 Geckdriver
实例,因为需要一些实例.
简而言之,我希望能够通过功能检索 Geckodriver
的 PID,并以类似的方式销毁 Geckodriver
的那些实例(通过 PID)检索 Firefox WebDriver
的 PID,如响应这个问题.
这可能吗?
谢谢!
一组新的 GeckoDriver 和 Firefox Browser 在您调用时启动:
WebDriver driver = new FirefoxDriver();
您可以在这是正确的-FirefoxDriver 驱动程序 = 新的 FirefoxDriver();?
GeckoDriver/Firefox Browser 的生命周期在您调用时不复存在:
driver.quit()
您可以在 PhantomJS Web 驱动程序停留在内存中找到详细讨论
解决方案
所以一个通用的解决方案是,而不是保留/保留 geckodriver 调用 close()
或 quit()
根据测试执行流程,这将使您免于不加选择地杀死所有 GeckoDriver 实例.
但是,在测试执行结束时,如果您想终止所有GeckoDriver实例,您可以使用以下解决方案:
公共类 Killing_GeckoDriver_PID {public static void main(String[] args) 抛出 IOException {字符串线;字符串 pidInfo ="";System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");WebDriver 驱动程序 = 新的 FirefoxDriver();进程 p =Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));while ((line = input.readLine()) != null) {pidInfo+=行;}input.close();if(pidInfo.contains("geckodriver.exe")){Runtime.getRuntime().exec("taskkill/F/IM geckodriver.exe");}System.out.println("杀死了所有 GeckoDriver 实例");}}
您可以在讨论中找到替代方法 Selenium:如何在不调用 driver.quit() 的情况下停止影响 PC 内存的 geckodriver 进程?
My question is very similar to this question. I launch many instances of WebDriver
and some of them don't respond to driver.quit()
. As described in this response I am able to kill browser instance by retrieving PID directly from capabilities object via the following code:
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 Kill_Firefox_PID { 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")); Runtime.getRuntime().exec("taskkill /PID "+cap.getCapability("moz:processID")); } }
Console Output:
moz:processID value is : 8492
While this works excellently to kill browser itself I still see instances of Geckodriver
when I open task manager. As stated in the other thread I am unable to indiscriminately kill all Geckdriver
instances via taskkill /f /im geckodriver.exe
as there are some instances that are needed.
In short, I want to be able to retrieve PID of Geckodriver
via capabilities and destroy those instances of Geckodriver
(via PID) in a similar way that we are able to retrieve PID of Firefox WebDriver
as outlined in response to this question.
Is this possible?
Thanks!
A new set of GeckoDriver and Firefox Browser are initiated when you invoke:
WebDriver driver = new FirefoxDriver();
The life span of GeckoDriver / Firefox Browser ceases to exist when you invoke:
driver.quit()
Solution
So a generic solution would be, instead of keeping the keeping/preserving the stale instances of geckodriver invoke close()
or quit()
as per the flow of your test execution which will relieve you from indiscriminately killing all the GeckoDriver instances.
However at the end of your Test Execution if you want to kill all the GeckoDriver instances, you can use the following solution:
public class Killing_GeckoDriver_PID {
public static void main(String[] args) throws IOException {
String line;
String pidInfo ="";
System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
Process p =Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
pidInfo+=line;
}
input.close();
if(pidInfo.contains("geckodriver.exe"))
{
Runtime.getRuntime().exec("taskkill /F /IM geckodriver.exe");
}
System.out.println("Killed all the instances of GeckoDriver");
}
}
这篇关于通过 PID 进程杀死 GeckoDriver [Java]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!