Python 3.x 如何重新连接到使用selenium的webdriver打开的浏览器?
由于一些未知的原因,我的浏览器打开远程服务器的测试页面的速度非常慢。因此,我在想,如果退出脚本后可以重新连接到浏览器,但不执行Python 3.x 如何重新连接到使用selenium的webdriver打开的浏览器?,python-3.x,selenium,session,selenium-webdriver,webdriver,internet-explorer,firefox,google-chrome,Python 3.x,Selenium,Session,Selenium Webdriver,Webdriver,Internet Explorer,Firefox,Google Chrome,由于一些未知的原因,我的浏览器打开远程服务器的测试页面的速度非常慢。因此,我在想,如果退出脚本后可以重新连接到浏览器,但不执行webdriver.quit()这将使浏览器保持打开状态。它可能是一种钩子或webdriver句柄。 我已经查找了selenium API文档,但没有找到任何函数。 我使用的是Chrome62,x64,Windows7,Selenium3.8.0。 我将非常感激这个问题是否能解决。不必深入探讨为什么你认为打开浏览器窗口可以解决速度慢的问题,你真的不需要手柄来解决这个问题。
webdriver.quit()
这将使浏览器保持打开状态。它可能是一种钩子或webdriver句柄。
我已经查找了selenium API文档,但没有找到任何函数。
我使用的是Chrome62,x64,Windows7,Selenium3.8.0。
我将非常感激这个问题是否能解决。不必深入探讨为什么你认为打开浏览器窗口可以解决速度慢的问题,你真的不需要手柄来解决这个问题。只需在不关闭会话的情况下继续运行测试,或者换句话说,不调用
driver.quit()
,正如您所提到的那样。这里的问题是,框架有自己的运行程序吗?喜欢黄瓜吗
在任何情况下,都必须有一些“设置”和“清理”代码。因此,您需要做的是确保在“清理”阶段,浏览器返回其初始状态。这意味着:
- 显示空白页
- 将删除会话的Cookie
- 如果不深入了解为什么您认为保持浏览器窗口打开可以解决速度慢的问题,那么您实际上不需要手柄来实现这一点。只需在不关闭会话的情况下继续运行测试,或者换句话说,不调用
driver.quit()
,正如您所提到的那样。这里的问题是,框架有自己的运行程序吗?喜欢黄瓜吗
在任何情况下,都必须有一些“设置”和“清理”代码。因此,您需要做的是确保在“清理”阶段,浏览器返回其初始状态。这意味着:
- 显示空白页
- 将删除会话的Cookie
会话ID
、Cookies
和其他会话属性,您仍然无法将这些属性作为钩子传递到
更简洁的方法是调用webdriver.quit()
,然后跨越新的浏览上下文
深潜 关于将WebDriver重新连接到现有运行的浏览上下文,已经有很多讨论和尝试。在讨论中,Simon Stewart[Creator WebDriver]明确提到:
- 重新连接到现有浏览上下文是特定于浏览器的功能,因此无法以通用方式实现
- 使用,可以在操作系统中的打开窗口上进行迭代,并找到要连接的正确IE进程
- 并且需要在特定的模式和配置下启动,这实际上意味着 附加到正在运行的实例在技术上是不可能的
tl;博士
否,退出脚本后无法重新连接到上一个Web浏览会话。即使您能够从以前的浏览上下文中提取
会话ID
、Cookies
和其他会话属性,您仍然无法将这些属性作为钩子传递到
更简洁的方法是调用webdriver.quit()
,然后跨越新的浏览上下文
深潜 关于将WebDriver重新连接到现有运行的浏览上下文,已经有很多讨论和尝试。在讨论中,Simon Stewart[Creator WebDriver]明确提到:
- 重新连接到现有浏览上下文是特定于浏览器的功能,因此无法以通用方式实现
- 使用,可以在操作系统中的打开窗口上进行迭代,并找到要连接的正确IE进程
- 并且需要在特定的模式和配置下启动,这实际上意味着 附加到正在运行的实例在技术上是不可能的
tl;博士 是的,这其实很容易做到。 selenium webdriver会话由连接url和会话id表示,您只需重新连接到现有会话即可 免责声明-该方法使用selenium内部属性(“私有”),在新版本中可能会发生变化;最好不要将其用于生产代码;最好不要用于远程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}')
这两个属性现在已知,另一个实例可以连接;“诀窍”是启动一个远程
驱动程序,并提供上面的\u url
——因此它将连接到正在运行的selenium进程:
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'
运行后,您将看到一个新的浏览器窗口被打开。这是因为在启动驱动程序时,selenium库会自动为其启动一个新会话——现在您有了一个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/')
也就是说,您现在已经连接到上一个/已经存在的会话,以及它的所有属性(cookies、LocalStorage等)
顺便说一下,在启动新的远程驱动程序时,您不必提供所需的\u功能
——这些功能是从您接管的现有会话中存储和继承的
警告-运行SE进程可能导致