在 Selenium / Java 中杀死 chromedriver 进程
Posted
技术标签:
【中文标题】在 Selenium / Java 中杀死 chromedriver 进程【英文标题】:Kill chromedriver process in Selenium / Java 【发布时间】:2018-01-22 11:46:36 【问题描述】:我目前正在使用“定期构建”选项通过 Jenkins 运行多个 Java 程序,并使用 H 06 * * 1-5(从周一到周五每天早上 6 点到早上 7 点运行它)。
在某些程序中,我单击打开一个新窗口的链接。因此,我使用下面的代码
driver.findElement(By.xpath(".//*[@id='terms']/li[1]/a")).click();
System.out.println("Home Page is loaded Successfully and Terms of Use Link is clicked");
ArrayList<String> window1 = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(window1.get(1));
Thread.sleep(3000);
driver.close();
Thread.sleep(3000);
driver.switchTo().window(window1.get(0));
现在程序运行后,由于 ChromeDriver.exe 进程已经在运行,因此我的其他程序失败了。
我尝试在上面的代码中使用driver.quit()
而不是driver.close()
,但它会关闭我的整个浏览器。
注意:我在程序末尾使用了driver.quit()
,这并不能帮助我摆脱在切换窗口时打开的正在运行的 Chromedriver.exe 实例。
请建议我一个处理此问题的好方法。我一直在 JAVA 中寻找这个解决方案。但大多数情况下我看到了 C# 的答案。
谢谢
【问题讨论】:
您能总结一下您尝试自动化的具体手动步骤吗?如果您使用driver.close();
关闭浏览器,您将如何使用driver.switchTo().window(window1.get(0));
。而是关闭窗口句柄。
您好,我点击主页上的“使用条款”链接。这将打开一个新窗口。所以我切换到新打开的窗口以检查该窗口中的静态文本。一旦完成。我关闭该窗口并切换回原来的主页窗口。因此,当我使用 driver.close() 时,新打开的窗口会关闭,但是 chromedriver.exe 实例仍然存在。这会在我的下一个计划程序运行时产生问题。
如此关闭将关闭当前活动的窗口,并且相当会杀死chromedriver。当你的程序完成时,这就是为什么你需要使用 quit 来关闭 Chrome 和驱动程序
我确实在每个程序的最后使用 driver.quit()。我每天早上 6 点到 7 点之间使用 Jenkins 运行大约 20 个程序,并平均分配负载。但是每天都有一些或其他程序失败,当我重新登录时,我能够看到任务管理器中运行的多个 ChromeDriver 实例,我认为这会导致其他程序(随后的程序)失败。我有时也会看到 Chrome 失败并显示错误以关闭程序或将其报告给 google。
您的两个程序是否需要使用相同的浏览器会话?
【参考方案1】:
taskkill /FI "IMAGENAME eq chromedriver.exe" /F
可以为你施展魔法
【讨论】:
【参考方案2】:我还很新,还在学习。我最近注意到我的可用内存不足。直到那时我才发现进程下有很多 chromedriver.exe 实例(以及 FF 的 geckodriver.exe)。我用它来杀死我的 ChromeDriver.exe 实例。
Runtime.getRuntime().exec("taskkill /F /IM ChromeDriver.exe");
效果很好。
【讨论】:
【参考方案3】:在finally
块中使用taskkill
,如下所示。它将杀死任务chromedriver.exe
:
finally
if(System.getProperty("os.name").contains("Windows"))
Process process = Runtime. getRuntime(). exec("taskkill /F /IM chromedriver.exe /T");
process.destroy();
【讨论】:
欢迎来到 ***。您回答了这个问题两次,答案几乎相同。请使用答案左下角的编辑链接,而不是复制答案。这样可以避免使答案变得混乱,并使其他人能够更快地找到解决方案。【参考方案4】:不要在特定页面上使用driver.close()
,让它在驱动工厂中使用下面的代码:
//This closes the browser after each test class
@AfterClass
public void tearDown()
driver.quit();
应该有帮助。
【讨论】:
我尝试使用 driver.quit 而不是 driver.close()。但是,问题在于它关闭了程序打开的所有内容并停止执行下面的所有代码。如果我必须去 1.使用条款 2.隐私政策 3.主页上的版权信息。当我点击使用条款链接并打开一个新窗口时,当我使用 driver.quit() 而不是 driver.close() 时,我原来的主页屏幕也关闭了,程序在那里停止执行。我需要继续执行,并且必须继续点击“隐私政策”和“版权信息”页面【参考方案5】:由于您单击的链接会打开一个新窗口,因此最初我们必须存储父窗口的WindowHandle
,稍后我们将使用它来遍历父窗口。单击链接Terms of Use
后,新窗口打开后,我们会将Selenium
的焦点转移到新窗口,在那里执行我们的任务并最终关闭它。然后我们要通过父窗口句柄将Selenium
的焦点移回父窗口,如下:
driver.navigate().to("someurl.com");
String parent = driver.getWindowHandle();
System.out.println("Parent Window ID is : "+parent);
driver.findElement(By.xpath("Link_of_Terms_of_Use_opens_New_Window")).click();
System.out.println("Home Page is loaded Successfully and Terms of Use Link is clicked");
Set<String> allWindows = driver.getWindowHandles();
int count = allWindows.size();
System.out.println("Total Windows : "+count);
for(String child:allWindows)
if(!parent.equalsIgnoreCase(child))
driver.switchTo().window(child);
System.out.println("Child Window Title is: "+driver.getTitle());
//perform all your tasks in the new window here
driver.close();
driver.switchTo().window(parent);
System.out.println("Parent Window Title is: "+driver.getTitle());
【讨论】:
【参考方案6】:根本原因可能在其他地方。此类问题通常发生在抛出意外异常的情况下,这会阻止您的框架完全退出会话。
由于我们无法全面了解您如何管理 WebDriver 会话,因此这只是一场猜谜游戏。
驱动程序本身可以通过命令行被杀死,例如taskkill
(或您正在使用的任何操作系统),可以通过例如执行https://github.com/zeroturnaround/zt-exec 图书馆。但这只是一种解决方法,它将隐藏您架构的潜在弱点。
【讨论】:
以上是关于在 Selenium / Java 中杀死 chromedriver 进程的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 和 Selenium 为我的驱动程序传递无头选项?