我有一个泡菜,里面有我通过以下命令创建的cookie
def doLogin(driver): #do login stuff pickle.dump(driver.get_cookies(), open("cookies.pkl", "wb"))
我有示例代码来获取Cookie
driver = webdriver.PhantomJS() self.doLogin(driver) driver.delete_all_cookies() for cookie in pickle.load(open("cookies.pkl", "rb")): driver.add_cookie(cookie)
我可以看到它很好地创建了cookie,因为如果print可以的话,add_cookie()可以完成可疑的操作
print
这给出了以下异常
WebDriverException: Message: {“errorMessage”:”Unable to set Cookie”,”request”:{“headers”:{“Accept”:”application/json”,”Accept-Encoding”:”identity”,”Connection”:”close”,”Content-Length”:”219”,”Content-Type”:”application/json;charset=UTF-8”,”Host”:”127.0.0.1:50738”,”User-Agent”:”Python-urllib/2.7”},”httpVersion”:”1.1”,”method”:”POST”,”post”:”{"sessionId": "391db430-154a-11e6-8a0a-ef59204729f5", "cookie": {"domain": "secretWebsite", "name": "JSESSIONID", "value": "8332B6099FA3BBBC82893D4C7E6E918B", "path": "Also a secret", "httponly": false, "secure": true}}”,”url”:”/cookie”,”urlParsed”:{“anchor”:”“,”query”:”“,”file”:”cookie”,”directory”:”/”,”path”:”/cookie”,”relative”:”/cookie”,”port”:”“,”host”:”“,”password”:”“,”user”:”“,”userInfo”:”“,”authority”:”“,”protocol”:”“,”source”:”/cookie”,”queryKey”:{},”chunks”:[“cookie”]},”urlOriginal”:”/session/391db430-154a-11e6-8a0a-ef59204729f5/cookie”}} Screenshot: available via screen
要工作,我只需要将webdriver更改为Firefox
这是一个已知的PhantomJS问题吗?
似乎PhantomJS驱动程序不支持某些键/值。为了克服这个问题,我将最重要的注入execute_script:
execute_script
def save_cookies(driver, file_path): LINE = "document.cookie = '{name}={value}; path={path}; domain={domain}; expires={expires}';\n" with open(file_path, 'w') as file : for cookie in driver.get_cookies() : file.write(LINE.format(**cookie)) def load_cookies(driver, file_path): with open(file_path, 'r') as file: driver.execute_script(file.read()) from selenium import webdriver driver = webdriver.PhantomJS() # load the domain driver.get("https://stackoverflow.com/users/login") # save the cookies to a file save_cookies(driver, r"cookies.js") # delete all the cookies driver.delete_all_cookies() # load the cookies from the file load_cookies(driver, r"cookies.js")