尽管使用了driver.close()和driver.quit(),为什么Chrome.exe和chromedriver.exe仍会出现在计算机的内存中?

时间:2017-11-09 18:13:37

标签: python python-2.7 selenium selenium-chromedriver chromium

我成功编写的代码在浏览网站时发挥作用,该网站具有在URL中格式化的适当日期和时间,从基础HTML源代码中获取表格,并将结果附加到缓存。

这个python文件运行了几十次(有很多代理ID,我需要抓取它的信息);然而,在脚本运行之后,数十个chrome.exechromedriver.exe实例仍然出现在计算机的内存中(这在计算机的“资源监视器”中可见。)

以下是我的代码。我已使用driver.quit()以及driver.close(),甚至两者一起使用(首先是driver.close())。

driver.quit()是不是应该关闭计算机系统中的实例?他们为什么出现在记忆中?这个问题有解决方案吗?

如果我能提供任何进一步的信息,请告诉我。先感谢您。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from datetime import datetime, timedelta
import credentials_page

def get_updated_url(agent_id_num):
    now = datetime.utcnow()
    today = datetime(now.year, now.month, now.day)
    yesterday = today - timedelta(days=1)
    previous_date_string = str(yesterday)[:10]
    return 'https://examplewebsite.com/agentId/'+agent_id_num+'/orderBy/ASC/startDate/'+previous_date_string+'%204:00%20AM/endDate/'+previous_date_string+'%2010:30%20PM'

def login_entry(username, password, browser): # logs into website
    login_email = browser.find_element_by_id('UserName')
    login_email.send_keys(username)
    login_password = browser.find_element_by_id('Password')
    login_password.send_keys(password)
    submit_elem = browser.find_element_by_xpath("//button[contains(text(), 'Log in')]")
    submit_elem.click()

def get_element(xpath, browser): # grabs element, turns it into needed table in raw HTML format
    table_of_interest = browser.find_element_by_xpath(xpath)
    # this has a type of <class 'selenium.webdriver.remote.webelement.WebElement'>
    return str('<table>'+table_of_interest.get_attribute('innerHTML')+'</table>')

def record_source_code(destination_cache, get_element_html): # takes element HTML and writes it to cache
    code_destination = open(destination_cache, 'w')
    code_destination.write(repr(get_element_html))
    code_destination.close()

def main_function(agent_id):
    driver = webdriver.Chrome()
    # figure out strings for start_date, end_date
    url = get_updated_url(agent_id)
    driver.get(url)
    #login
    login_entry(credentials_page.website_username, credentials_page.website_password, driver)
    # first test to see if "not found"
    if len(driver.find_elements_by_xpath("//*[text()='Not Found']"))>0:
        logoff_elem = driver.find_element_by_xpath("//*[contains(text(), 'Log off')]")
        logoff_elem.click()
        driver.quit()
        return False
    else:
        #grab table needed
        WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH,'/html/body/div/div/div[2]/div[2]/table/tbody')))
        table_html = get_element('/html/body/div/div/div[2]/div[2]/table/tbody', driver)
        driver.quit()
        record_source_code('results_cache.html', table_html)
        return True

1 个答案:

答案 0 :(得分:0)

我认为根本原因是你的代码没有处理异常。因此,当发生异常时,它不会退出。尝试/捕获应该有所帮助。

def main_function(agent_id):
    driver = webdriver.Chrome()
    # figure out strings for start_date, end_date
    url = get_updated_url(agent_id)
    try:
        driver.get(url)
        #login
        login_entry(credentials_page.website_username, credentials_page.website_password, driver)
        # first test to see if "not found"
        if len(driver.find_elements_by_xpath("//*[text()='Not Found']"))>0:
            logoff_elem = driver.find_element_by_xpath("//*[contains(text(), 'Log off')]")
            logoff_elem.click()
            driver.quit()
            return False
        else:
            #grab table needed
            WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH,'/html/body/div/div/div[2]/div[2]/table/tbody')))
            table_html = get_element('/html/body/div/div/div[2]/div[2]/table/tbody', driver)
            driver.quit()
            record_source_code('results_cache.html', table_html)
            return True
    except:
        drier.quit() #<-- Try/catch and close it