imb*_*iye 9 session selenium webdriver python-3.x selenium-webdriver
由于某些未知原因,我的浏览器非常缓慢地打开了远程服务器的测试页。因此,我在考虑是否可以在退出脚本后重新连接到浏览器,但不执行webdriver.quit()此操作将使浏览器保持打开状态。这可能是HOOK或Webdriver句柄。我查找了硒API文档,但未找到任何功能。我正在使用Chrome 62,x64,Windows 7,硒3.8.0。能否解决这个问题,我将不胜感激。
不,Web Browser退出脚本后,您将无法重新连接到上一个会话。即使你能提取Session ID,Cookies和其他会议从以前的属性,Browsing Session你仍然无法通过这些属性为钩至WebDriver。
一种更干净的方法是调用webdriver.quit()然后跨越一个新的Browsing Session。
以前,已经进行了一些讨论并尝试重新连接WebDriver到现有的正在运行的浏览会话。您可以在以下质量检查中找到讨论:
硒<-> Webdriver会话由连接URL和session_id表示,您只需重新连接到现有的。
免责声明 -该方法正在使用硒的内部属性(某种程度上为“私有”),在新版本中可能会发生变化;您最好不要将其用于生产代码;最好不要将其用于远程SE(您的中心或诸如BrowserStack / Sauce Labs之类的提供程序),因为最后将说明警告/资源消耗。
启动Webdriver实例时,您需要获取上述属性;样品:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.google.com/')
# now Google is opened, the browser is fully functional; print the two properties
# command_executor._url (it's "private", not for a direct usage), and session_id
print(f'driver.command_executor._url: {driver.command_executor._url}')
print(f'driver.session_id: {driver.session_id}')
Run Code Online (Sandbox Code Playgroud)
现在有了这两个属性,另一个实例就可以连接了。“技巧”是启动Remote驱动程序,并提供_url上面的内容-因此它将连接到正在运行的硒过程:
driver2 = webdriver.Remote(command_executor=the_known_url)
# when the started selenium is a local one, the url is in the form 'http://127.0.0.1:62526'
Run Code Online (Sandbox Code Playgroud)
运行该命令后,您会看到一个新的浏览器窗口正在打开。
这是因为在启动驱动程序时,selenium库会自动为其启动一个新会话-现在您有1个具有2个会话(浏览器实例)的webdriver进程。
如果您导航到一个url,您将看到它在该新的浏览器实例上执行,而不是上一个开始所剩的那个-这不是所需的行为。
此时,需要完成两件事-a)关闭当前的SE会话(“新会话”),b)将该实例切换到上一个会话:
if driver2.session_id != the_known_session_id: # this is pretty much guaranteed to be the case
driver2.close() # this closes the session's window - it is currently the only one, thus the session itself will be auto-killed, yet:
driver2.quit() # for remote connections (like ours), this deletes the session, but does not stop the SE server
# take the session that's already running
driver2.session_id = the_known_session_id
# do something with the now hijacked session:
driver.get('https://www.bing.com/')
Run Code Online (Sandbox Code Playgroud)
就是这样-您现在已连接到先前/已经存在的会话,并具有其所有属性(cookie,LocalStorage等)。
顺便说一句,desired_capabilities在启动新的远程驱动程序时,您不必提供任何信息-这些是从您接管的现有会话中存储和继承的。
警告 -运行SE流程可能导致系统中的某些资源消耗。
每当启动但未关闭时(如代码的第一部分一样),它将一直停留在该位置,直到您手动将其杀死为止。我的意思是,例如在Windows中,您将看到一个“ chromedriver.exe”进程,完成该进程后必须手动终止。对于远程硒进程,不能通过已与其连接的驱动程序关闭它。
原因-每当您启动本地浏览器实例,然后调用其quit()方法时,它就有2个部分-第一个是从Selenium实例中删除会话(在第二个代码段中完成了此操作),并且另一种是停止本地服务(chrome / geckodriver)-通常正常。
问题是,对于远程会话,缺少第二部分-您的本地计算机无法控制远程进程,这就是该远程集线器的工作。因此,第二部分实际上是passpython语句-无操作。
如果您在远程集线器上启动了太多的硒服务,而又无法对其进行控制,那将导致该服务器的资源消耗。像BrowserStack这样的云提供商采取了相应的措施-他们正在关闭服务,直到最近60年代都没有活动,等等-这是您不希望做的事情。
至于本地SE服务-别忘了偶尔从您遗忘的孤立硒驱动程序中清理OS :)
| 归档时间: |
|
| 查看次数: |
5874 次 |
| 最近记录: |