杀死Selenium / Java中的chromedriver进程

时间:2017-08-14 15:23:21

标签: java selenium jenkins automation selenium-chromedriver

我目前正在通过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#的答案。

谢谢

5 个答案:

答案 0 :(得分:1)

由于您点击了一个打开新窗口的链接,因此我们最初必须存储父窗口的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());

答案 1 :(得分:0)

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

//This closes the browser after each test class 

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

应该有所帮助。

答案 2 :(得分:0)

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

由于我们无法全面了解您如何管理WebDriver会话,因此它只是一个猜谜游戏。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我很新,还在学习。我最近发现我的可用内存即将用尽。直到那时,我才发现进程下有很多chromedriver.exe实例(对于FF,还有geckodriver.exe)。我用它来杀死我的ChromeDriver.exe实例。

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

它很好用。