我正在努力实现的目标
我正在尝试登录一个必须使用 Selenium headless 启用 cookie 的网站,我正在使用 PhantomJS 作为驱动程序。
问题
我首先使用 Selenium IDE 记录了该过程,使用 Firefox(不是 headless )它工作正常。然后我将代码导出到 Python,现在我无法登录,因为它抛出一个错误,提示“只能为当前域设置 Cookie”。我不知道为什么会遇到这个问题,是不是我在正确的域中?
代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import unittest, time, re
self.driver = webdriver.PhantomJS()
self.driver.implicitly_wait(30)
self.base_url = "https://login.example.com"
driver = self.driver
driver.get(self.base_url)
all_cookies = self.driver.get_cookies()
# It prints out all cookies and values just fine
for cookie in all_cookies
print cookie['name'] + " --> " + cookies['value']
# Set cookies to driver
for s_cookie in all_cookies:
c = { s_cookie['name'] : s_cookie['value']}
# This is where it's throwing an error saying "Can only set Cookies for current domain
driver.add_cookie(c)
...
我尝试过的
我试过将 cookie 保存在字典中,转到另一个域,返回到原始域并添加 cookie,然后尝试登录,但它仍然不起作用(如 this thread 中所建议)
感谢任何帮助。
最佳答案
调查每个 cookie 对。我遇到了类似的问题,一些 cookie 属于谷歌。您需要确保 cookie 仅添加到当前域并且也属于同一域。在那种情况下,您的异常是预期的。附带一提,如果我没记错的话,您不能使用 localhost
添加 cookie。更改为 IP 地址。此外,调查您获得的 cookie 的特殊域和过期信息。看,如果他们返回 null
编辑
我在 Gmail 上做了这个简单的测试来显示你做错了什么。乍一看,我没有注意到您正试图获取部分 cookie,一对,并将其添加到域中。由于 cookie 没有任何域、路径、过期等信息,它试图将 cookie 添加到当前域 (127.0.0.1) 并抛出一些不太有意义的误导性信息。注意:为了成为一个有效的 cookie,它必须具有您遗漏的正确域和过期信息。
import unittest
from selenium.webdriver.common.by import By
from selenium import webdriver
__author__ = 'Saifur'
class CookieManagerTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.PhantomJS("E:\\working\\selenium.python\\selenium\\resources\\phantomjs.exe")
self.driver.get("https://accounts.google.com/ServiceLogin?service=mail&continue=https://mail.google.com/mail/")
self.driver.find_element(By.ID, "Email").send_keys("userid")
self.driver.find_element(By.ID, "next").click()
self.driver.find_element(By.ID, "Passwd").send_keys("supersimplepassword")
self.driver.find_element(By.CSS_SELECTOR, "[type='submit'][value='Sign in']").click()
self.driver.maximize_window()
def test(self):
driver = self.driver
listcookies = driver.get_cookies()
for s_cookie in listcookies:
# this is what you are doing
c = {s_cookie['name']: s_cookie['value']}
print("*****The partial cookie info you are doing*****\n")
print(c)
# Should be done
print("The Full Cookie including domain and expiry info\n")
print(s_cookie)
# driver.add_cookie(s_cookie)
def tearDown(self):
self.driver.quit()
Console output:
D:\Python34\python.exe "D:\Program Files (x86)\JetBrains\PyCharm Educational Edition 1.0.1\helpers\pycharm\utrunner.py" E:\working\selenium.python\selenium\python\FirstTest.py::CookieManagerTest true Testing started at 9:59 AM ...
*******The partial cookie info you are doing*******
{'PREF': 'ID=*******:FF=0:LD=en:TM=*******:LM=*******:GM=1:S=*******'}
The Full Cookie including domain and expiry info
{'httponly': False, 'name': '*******', 'value': 'ID=*******:FF=0:LD=en:TM=*******:LM=1432393656:GM=1:S=iNakWMI5h_2cqIYi', 'path': '/', 'expires': 'Mon, 22 May 2017 15:07:36 GMT', 'secure': False, 'expiry': *******, 'domain': '.google.com'}
Notice: I just replaced some info with
*******
on purpose
关于python - Selenium:尝试使用 cookie 登录 - "Can only set cookies for current domain",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30292025/