在 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 进程的主要内容,如果未能解决你的问题,请参考以下文章

Selenium-java-框架启动主流浏览器

在铬中杀死角度

如何使用 Java 和 Selenium 为我的驱动程序传递无头选项?

从python中杀死一个子进程,包括它的子进程[重复]

如何在 Python 中使用 Selenium 打开 chrome 开发者控制台?

监控并优雅地杀死或重用僵尸 GeckoDriver 实例