在做selenium自动化脚本的时候,我们可能会对间隔一段时间就重新触发访问网站的流程,这个过程每次都会打开新的浏览器。长期下去我们的服务器内存会被占用调很大一部分。
如果我们可以在第一次打开浏览器的时候记录一次浏览器session,那么在下次调用脚本的时候就可以先去获取session,然后还是操作之前打开的浏览器。
class ReuseChrome(Remote):
def __init__(self, command_executor, session_id):
self.r_session_id = session_id
Remote.__init__(self, command_executor=command_executor, desired_capabilities={}, keep_alive=False)
def start_session(self, capabilities, browser_profile=None):
"""
重写start_session方法
"""
if not isinstance(capabilities, dict):
raise InvalidArgumentException("Capabilities must be a dictionary")
if browser_profile:
if "moz:firefoxOptions" in capabilities:
capabilities["moz:firefoxOptions"]["profile"] = browser_profile.encoded
else:
capabilities.update({'firefox_profile': browser_profile.encoded})
self.capabilities = options.Options().to_capabilities()
self.session_id = self.r_session_id
self.w3c = False
通过上面的方法我们可以获取到,上次操作浏览器的driver对象,如果上次打开的浏览器没有关闭,就还是可以继续在上次打开的页面上操作元素
driver = ReuseChrome(command_executor=executor_url, session_id=session_id)
# 新建 若是浏览器退出 此处抛异常
driver.execute_script("document.getElementsByClassName('bs-bars pull-left')[0].children[0].children[0].click()")
# 销售号
driver.execute_script(
'return document.getElementsByClassName("form-control input-medium")[0]').send_keys(
str(signInfo['salesNumber']))
driver.find_element_by_xpath(
'/html/body/div[1]/div/table/tbody/tr[2]/td[2]/div/table/tbody/tr[3]/td/div/button[1]').click()
time.sleep(5)
在第一次访问的时候保存session 和访问地址
def beginRun(config,signInfo):
global driver
chromeOptions = option()
chromeOptions.add_experimental_option('excludeSwitches', ['enable-automation'])
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': downLoadPath}
chromeOptions.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(executable_path=chromeDriverPath, chrome_options=chromeOptions)
driver.delete_all_cookies()
session_id = driver.session_id
executor_url = driver.command_executor._url