gpt4 book ai didi

java - 如何在selenium中关闭IEDriverServer.exe?

转载 作者:行者123 更新时间:2023-11-30 03:51:09 26 4
gpt4 key购买 nike

我有一个程序,可以使用 selenium 驱动程序在 IE 中打开所需的 URL。但是我想在 URL 加载后关闭驱动程序 exe。
我使用了driver.quit();,这会导致清理exe并关闭浏览器。但是我不想关闭打开的浏览器
有没有办法在不使用的情况下实现这一目标Runtime.getRuntime().exec("taskkill/F/IM IEDriverServer.exe");?

最佳答案

Helium自动为您执行此操作 - 如果您没有调用 driver.quit();,当 JVM 终止时,Helium 会使浏览器窗口保持打开状态,但会清理驱动程序 exe。

以下是实现的工作原理:Selenium 类 DriverService 管理 driver.exe 进程。我们需要操作正确的 DriverService 实例的字段来关闭 exe。默认情况下这些字段是不可访问的,因此我们需要使用Java反射来访问它们。

首先,启动IE时,需要手动传入DriverService实例:

InternetExplorerDriverService.Builder serviceBuilder = new InternetExplorerDriverService.Builder().usingAnyFreePort();
InternetExplorerDriverService service = serviceBuilder.build();
WebDriver ie = new InternetExplorerDriver(service);
// Open your URL:
ie.get("http://www.google.com");

要杀死驱动程序exe,您首先需要获取服务的lock字段。它不是公开的,因此我们需要使用反射来访问它:

Field lockField = DriverService.class.getDeclaredField("lock");
lockField.setAccessible(true);
ReentrantLock lock = (ReentrantLock) lockField.get(service);

用于防止对驱动程序exe的并发访问。为了安全地访问驱动程序 exe,我们需要将其余代码包装在 try ...finally block 中:

try {
lock.lock();
[...]
} finally {
lock.unlock();
}

现在来说[...]:我们需要再次通过反射访问process字段:

Field processField = DriverService.class.getDeclaredField("process");
processField.setAccessible(true);
CommandLine process = (CommandLine) processField.get(service);

可能会发生 processnull 的情况,在这种情况下我们无能为力:

if (process == null)
return;

否则,我们调用process.destroy() - 这会杀死驱动程序exe进程:

process.destroy();

...并将process设置为null:

processField.set(service, null);

就是这样!这是 Helium startIE(...) 背后发生的一些事情。命令。

关于java - 如何在selenium中关闭IEDriverServer.exe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24423526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com