Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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 酸洗Selenium Webdriver对象_Python_Selenium_Serialization_Selenium Webdriver_Pickle - Fatal编程技术网

Python 酸洗Selenium Webdriver对象

Python 酸洗Selenium Webdriver对象,python,selenium,serialization,selenium-webdriver,pickle,Python,Selenium,Serialization,Selenium Webdriver,Pickle,我想序列化并存储一个SeleniumWebDriver对象,以便稍后在代码的其他地方使用它。我想用泡菜来做这个。如果有另一种方法来保存webdriver对象的状态,那么我可以稍后再打开它,那就太好了(我不能只重新加载url,因为我正在查看的网站都是javascript,当前页面取决于我到目前为止点击的内容) 目前,我有这样的代码 import pickle from selenium import webdriver d = webdriver.PhantomJS() d.get(url) d

我想序列化并存储一个SeleniumWebDriver对象,以便稍后在代码的其他地方使用它。我想用泡菜来做这个。如果有另一种方法来保存webdriver对象的状态,那么我可以稍后再打开它,那就太好了(我不能只重新加载url,因为我正在查看的网站都是javascript,当前页面取决于我到目前为止点击的内容)

目前,我有这样的代码

import pickle
from selenium import webdriver

d = webdriver.PhantomJS()
d.get(url)
d.find_element_by_xpath(xpath).click()
p = pickle.dumps(d, pickle.HIGHEST_PROTOCOL)
# Stuff happens here.
new_driver = pickle.loads(p)
print new_driver.page_source.encode('utf-8', 'ignore')
当我运行此操作时,会出现以下错误(错误发生在我打印时,而不是之前):

返回self.driver.page\u source.encode('utf-8','ignore')
文件“/home/eric/dev/crawler-env/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py”,第436行,在第页的源代码中
返回self.execute(Command.GET_PAGE_SOURCE)['value']
文件“/home/eric/dev/crawler env/local/lib/python2.7/site packages/selenium/webdriver/remote/webdriver.py”,第163行,在execute中
响应=self.command\u executor.execute(driver\u command,params)
文件“/home/eric/dev/crawler env/local/lib/python2.7/site packages/selenium/webdriver/remote/remote_connection.py”,执行中的第349行
返回self.\u请求(url,方法=命令\u信息[0],数据=数据)
文件“/home/eric/dev/crawler env/local/lib/python2.7/site packages/selenium/webdriver/remote/remote_connection.py”,第396行,在请求中
响应=opener.open(请求)
文件“/usr/lib/python2.7/urllib2.py”,第404行,打开
响应=自身打开(请求,数据)
文件“/usr/lib/python2.7/urllib2.py”,第422行,打开
"开放",
文件“/usr/lib/python2.7/urllib2.py”,第382行,在调用链中
结果=func(*args)
文件“/usr/lib/python2.7/urllib2.py”,第1214行,在http\u open中
返回self.do_open(httplib.HTTPConnection,req)
文件“/usr/lib/python2.7/urllib2.py”,第1184行,打开
引发URL错误(err)
urllib2.URLError:
可以序列化我的webdriver对象吗?如果没有,我的选择是什么

更新:


进一步检查后,即使我再次执行类似于d.get(url)的操作而不是打印页面源代码,它也会给我同样的错误。当webdriver对象被pickle/unpickle时,它会发生什么情况吗?

据我使用量角器\C#架构所知:

基本用法可能具有欺骗性,这意味着在C#中使用ChromeDriver时,你会得到一个幕后所有麻烦的面具,但声明和初始化webDriver会创建并启动一个“服务器”(在量角器中是手动完成的)。webDriver使用此服务器的一些功能和状态


我认为webDriver不是一个对象,而是一个API。将此API表示为对象是为了便于使用,因此我认为您所要求的是不可能的。

我能够pickle selenium.webdriver.Remote对象。dill和pickle都没有为我序列化selenium.webdriver.Chrome对象,python在其中创建并运行浏览器进程。但是,如果我(1)运行独立的java selenium2 Web服务器,(2)在一个进程中,创建到该服务器的selenium.webdriver.Remote连接并将其pickle/dill到一个文件,(3)在另一个进程中,取消序列化远程实例并使用它,它们都可以工作

这导致能够关闭python进程,然后重新连接到现有的webdriver浏览器并发出新命令(可能来自不同的python脚本)。如果关闭selenium web浏览器,则需要从头创建一个新实例

server.py:

import pickle
import selenium.webdriver

EXECUTOR = 'http://127.0.0.1:4444/wd/hub'
FILENAME = '/tmp/pickle'

opt = selenium.webdriver.chrome.options.Options()
capabilities = opt.to_capabilities()
driver = selenium.webdriver.Remote(command_executor=EXECUTOR, desired_capabilities=capabilities)
fp = open(FILENAME, 'wb')
pickle.dump(driver, fp)
client.py:

import pickle

FILENAME = '/tmp/pickle'

driver = pickle.load(open(FILENAME, 'rb')
driver.get('http://www.google.com')
el = driver.find_element_by_id('lst-ib')
print(el)
注(2020-08-08):
以这种方式酸洗硒在最新的selenium(4.x)中停止工作。Pickle无法Pickle内部套接字对象。一个选项是在setup.py中的install_requires组件中添加一个'selenium=3.141.0'项,该组件仍然适用于我。

我真的认为这是不可行的。你能保持webdriver正常运行吗?某些东西是不可序列化的,比如套接字连接。由于WebDriver可能正在使用套接字连接(或其他类型的过程间调用)来连接web浏览器,因此无法对其进行序列化。@alecxe我正在考虑这样做,但我需要随时跳转到不同的网页,因此我无法执行以下操作:“转到第x页,单击y,单击z”等一下,然后回来说“点击w转到y页”-@robbrit如果我看一下webdriver的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我对python对象的构成不太了解,但对象是否比
\uuuu dict\uuuu
中的内容更重要?您可能想试试
dill
。它可以序列化大多数python对象,还可以序列化文件句柄和套接字连接。在酸洗时,
dill
不会“忘记”实例上动态添加的属性,因此,如果这就是问题所在,也不会成为问题。也许值得一试。Get
dill
此处
dill
还包括一套工具,帮助找出对象无法序列化的原因。
import pickle

FILENAME = '/tmp/pickle'

driver = pickle.load(open(FILENAME, 'rb')
driver.get('http://www.google.com')
el = driver.find_element_by_id('lst-ib')
print(el)