Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何重新连接到使用selenium的webdriver打开的浏览器?_Python 3.x_Selenium_Session_Selenium Webdriver_Webdriver_Internet Explorer_Firefox_Google Chrome - Fatal编程技术网

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

,退出脚本后无法重新连接到上一个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进程可能会导致系统中的资源流失

无论何时启动一个,然后不关闭——就像在第一段代码中一样——它都将保持在那里,直到您手动杀死它。我的意思是,例如在Windows中,您将看到一个“chromedriver.exe”进程,一旦完成,您必须手动终止该进程。与远程selenium进程连接的驱动程序无法关闭它。
原因——每当您启动本地浏览器实例,然后调用其
quit()
方法时,它有两个部分——第一部分是从Selenium实例中删除会话(上面第二个代码段中所做的),另一部分是停止本地服务(chrome/geckodriver)——这通常可以正常工作

问题是,对于远程会话,缺少第二部分-您的本地计算机无法控制远程进程,这是远程中心的工作。所以第二部分实际上是一个
pass
python语句-一个no-op

如果您在一个远程集线器上启动了太多的selenium服务,并且无法对其进行控制,这将导致该服务器的资源流失。像BrowserStack这样的云提供商采取了措施来应对这种情况——他们在过去60年代关闭了没有活动的服务,等等——但这是你不想做的事情


至于本地SE服务,只是别忘了偶尔从您忘记的孤立的selenium驱动程序中清理操作系统:)

您的代码在哪里?您是否尝试过使用选项“user data dir”而不是webdriver每次创建一个新的用户目录来重用chrome现有的用户目录。chrome不会下载,而是使用缓存中的内容。@Grasshopper这是什么黑魔法?我使用了这个Chromeoption,它减少了大量的加载时间