【发布时间】:2020-04-18 12:38:46
【问题描述】:
首先,我正在使用 Django,并且正在构建一个 API。例如,我的路线类似于api/get-some-element。
browser_url = cache.get('user_%d.browser_url' % user_id)
is_browser_queued = cache.get('user_%d.browser_queued' % user_id)
browser_session_id = cache.get('user_%d.browser_session_id' % user_id) # session id of the main chrome
if browser_url:
capabilities = DesiredCapabilities.CHROME.copy()
driver = webdriver.Remote(
command_executor=browser_url,
desired_capabilities=capabilities,
options=options,
)
driver.session_id = browser_session_id
return driver
if not is_browser_queued:
run_browser.delay(user_id) # launch main chrome
cache.set('user_%d.browser_queued' % user_id, True, None)
在第一次访问该路由时,它将向 Celery 发送一个任务以启动 Selenium Headless Chrome(主 chrome)。为什么我用芹菜?因为我需要让 Chrome 始终运行。 (我知道更好的方法,这就是我所知道的)。
然后,对于该路由上的下一次访问,它将以Waiting chrome to launched. 响应,直到 Celery 任务被执行(chrome 正确启动)。
主 chrome 启动后,它会立即启动 Selenium Headless Remote Driver(没有 Celery),这个远程驱动的目的是访问主 chrome。然后,它只是从网站中抓取一些元素。
但是,完成后,远程驱动程序仍在运行。如何阻止它?
我知道诸如driver.quit() 或driver.close() 之类的命令。但是,据我所知,它将命令发送到主 chrome,而不是远程驱动程序启动的 chrome。这不是我想要的。我不想退出主chrome,只退出远程驱动程序启动的chrome。
【问题讨论】:
-
假设您的两个 chrome 都使用相同的 chromedriver(server) 打开。存储由您所指的“远程驱动程序”创建的会话 ID。 someremotesession = driver.session_id 。在此行之前 driver.session_id = browser_session_id 。在再次调用 quit 之前更改 driver.session_id = someremotesession 并调用 quit() 。您的“远程驱动程序”chrome 应该退出。
-
@RahulL 你是对的。这就是我现在所做的(我的意思是在你提出那个解决方案之前)。
-
对不起任何人,我想我自己已经得到了答案。下次我会发布解决方案..
标签: python django selenium google-chrome celery