【问题标题】:How to set cookies in phantomjs using selenium with python?如何使用 selenium 和 python 在 phantomjs 中设置 cookie?
【发布时间】:2016-06-01 20:41:06
【问题描述】:

它引发错误消息“只能为当前域设置 Cookie”,但我所做的只是将旧的 cookie 放入。有时我添加“正确”域,它会引发错误消息“无法设置曲奇饼”。 而且我在火狐上测试过,火狐也不能用。

from selenium import webdriver
driver = webdriver.PhantomJS(executable_path=phantompath)
driver.get('http://stackoverflow.com/')
driver.get_screenshot_as_file('1.png')
cookies = driver.get_cookies()
driver.delete_all_cookies()
driver.get_cookies()
for cookie in cookies:
    driver.add_cookie(cookie)

【问题讨论】:

    标签: python selenium cookies phantomjs


    【解决方案1】:

    PhantomJS 驱动程序不支持 cookie 字典中的所有键。解决此问题的一种方法是选择键:

    from selenium import webdriver
    
    driver = webdriver.PhantomJS()
    driver.get('http://stackoverflow.com/')
    
    cookies = driver.get_cookies()
    
    driver.delete_all_cookies()
    
    for cookie in cookies :
        driver.add_cookie({k: cookie[k] for k in ('name', 'value', 'domain', 'path', 'expiry')})
    

    【讨论】:

    • 在stackoverflow网站上可以使用,在其他网站就不行了。请问有没有通用的方法来克服这个问题?
    • 它适用于其他网站。请注意,在调用driver.add_cookie 之前,您首先需要使用driver.get('http://...') 设置域,并确保cookie 的域与当前页面中的域相同。
    • 是的,我运行这段代码没有错误,但是当我将driver.get('http://stackoverflow.com/')更改为driver.get('https://github.com/')时,它会引发KeyError: 'expiry'。它会在其他网站上引发"errorMessage":"Unable to set Cookie"
    • 我会删除域并检查密钥是否存在:driver.add_cookie({k: cookie[k] for k in ('name', 'value', 'path', 'expiry') if k in cookie})
    • 我删除了你所做的'域',但是这段代码还不能正确处理'github.com'网站,它引发"errorMessage":"Can only set Cookies for the current domain"
    【解决方案2】:

    您需要更改每个 cookie 的域参数。域字段的格式必须如下:

    driver = webdriver.PhantomJS()
    driver.get('http://www.baidu.com')
    driver.delete_all_cookies()
    
    for item in cookie_dictionary: 
        driver.add_cookie({
          'domain': '.baidu.com', # note the dot at the beginning
          'name': item['name'],
          'value': item['value'],
          'path': '/',
          'expires': None
        })
    
    driver.get('http://www.baidu.com')
    

    【讨论】:

    • @Pedro Castilho 谢谢
    • 作为上述@HiddenStrawberry 答案的补充,即使对于localhost 之类的值,域前面的点/句点也是必需的——因为我发现很难。 Chrome 和 Firefox 驱动程序会添加域设置为 localhost 的 cookie,但 PhantomJS 驱动程序只有在域设置为 .localhost 时才能成功添加 cookie。
    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2014-03-20
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多