chromedriver.quit()之后的多个chrome进程

时间:2017-01-19 14:34:11

标签: django selenium-webdriver selenium-chromedriver

我正在运行一个Django服务,该服务启动了一个chromedriver for selenium并在网站上搜索数据。 Django服务由另一个Java服务通过HTTP调用。

以下是代码:

views.py

get_data(browser)
    try:
        .
        .
        .
        for i in range(1,6):
            try:
                .
                .
                .
             return "success data"
             except NoSuchElementException:
                 browser.back()
         raise Exception("No results found")
    except Exception as e:
         print str(e)
         raise

scraper.py

public void MyProcess(FileItem file)
{
    List<string> lines = file.GetLines(); //some process to get the lines to handle
    long cntr = 0; //The counter to track

    Parallel.ForEach(lines, crntLine =>
    {
       Console.Writeline(String.Format("Currently finished {0} out of {1} lines",cntr,lines.Count());
       InterLocked.Increment(ref cntr);

       //...Code to process crntLine here

    });
}

问题是,在java服务完成所有调用并且整个过程完成之后,RAM中孤立的25到50个chrome进程占用超过1 GB。我在这里做错了吗?

3 个答案:

答案 0 :(得分:5)

这是一个老问题。虽然很脏,但对我来说有用的是在退出之前加一个睡眠:

time.sleep(5)
browser.quit()

答案 1 :(得分:0)

请在尝试/除外退出和环绕代码前关闭。

try:
    browser.quit()
except WebDriverException:
    pass

答案 2 :(得分:0)

想要扩展@Serge B给出的答案。

在browser.close()上使用browser.quit()确实更好,因为当第一个窗口关闭所有窗口(以及所有进程)时,最后一个窗口可能只关闭当前窗口。

我仍然认为你不会通过这样做来解决你的问题。

我遇到了同样的问题 - 驱动程序在Java进程运行时没有关闭。我在使用TeamCity运行测试时遇到了它。请尝试在没有您使用的Java服务的情况下运行您的代码,并确保它是问题所在。

如果是问题,那么我建议用Python方法杀死所有进程。这是我使用的解决方案,它对我有用。不幸的是我在那时使用了C#,下一个代码帮助了我https://stackoverflow.com/a/35692319/4019586,但它不是你现在可以使用的。

我不知道如何在Python上做到这一点,但这可能是一个解决方案。 我认为使用Python可以使用https://stackoverflow.com/a/6278951/4019586

所以积极的一面是你做的都是正确的!)这只是Selenium中的一个错误。