繁体   English   中英

在 Selenium / Java 中杀死 chromedriver 进程

[英]Kill chromedriver process in Selenium / Java

我目前正在使用“定期构建”选项通过 Jenkins 运行多个 Java 程序,并使用 H 06 * * 1-5(从周一到周五每天早上 6 点到早上 7 点运行它)。

在某些程序中,我单击链接会打开一个新的 window。因此,我使用以下代码

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() ,这并不能帮助我摆脱在切换 window 时打开的正在运行的 Chromedriver.exe 实例。

请给我建议一个处理这个问题的好方法。 我一直在 JAVA 中寻找这个解决方案。但大多数时候我看到的是 C# 的答案。

谢谢

我是新手,还在学习。 我最近注意到我的可用内存不足。 直到那时我才发现进程下有很多 chromedriver.exe(和 FF 的 geckodriver.exe)实例。 我用它来杀死我的 ChromeDriver.exe 实例。

Runtime.getRuntime().exec("taskkill /F /IM ChromeDriver.exe");

它工作得很好。

不要在特定页面上使用driver.close() ,让它在驱动程序工厂中使用以下代码:

//This closes the browser after each test class 

@AfterClass
public void tearDown()
{
    driver.quit();
}

它应该有帮助。

由于您正在单击打开新窗口的链接,因此最初我们必须存储父窗口的WindowHandle ,稍后我们将使用它来遍历回父窗口。 在新窗口打开后单击Terms of Use链接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());

根本原因可能在另一个地方。 此类问题通常发生在抛出意外异常的情况下,这会阻止您的框架干净地退出会话。

由于我们无法看到您如何管理 WebDriver 会话的全貌,这只是一个猜谜游戏。

驱动程序本身可以通过命令行taskkill ,例如taskkill (或您使用的任何操作系统),可以通过例如https://github.com/zeroturnaround/zt-exec库执行。 但这只是一种解决方法,它将隐藏您的架构的潜在弱点。

finally块中使用taskkill ,如下所示。 它将chromedriver.exe任务chromedriver.exe

finally {
    if(System.getProperty("os.name").contains("Windows")) {
            Process process = Runtime. getRuntime(). exec("taskkill /F /IM chromedriver.exe /T");
            process.destroy();
    }
}

taskkill /FI "IMAGENAME eq chromedriver.exe" /F可以为你施展魔法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM