Selenium: Trying to log in with cookies - “Can only set cookies for current domain”

后端 未结 3 1782
刺人心
刺人心 2020-12-10 04:20

What I am trying to achieve

I am trying to log in to a website where cookies must be enabled using Selenium headless, I am using PhantomJS for drive

3条回答
  •  暖寄归人
    2020-12-10 04:45

    Some webpages use too many keys in the cookies not supported by webdriver, then you get an "errorMessage":"Can only set Cookies for the current domain", even though you are 100% sure that you are setting cookies for the current domain. An example of such webpage is "https://stackoverflow.com/". In this case, you need to make sure that only the required keys are added to the cookies, as mentioned in some previous posts.

    driver.add_cookie({k: cookie[k] for k in   ('name', 'value', 'domain', 'path', 'expiry') if k in cookie}) 
    

    In constrast, some webpages use too few keys in the cookies, that are required by webdriver, then you get an "errorMessage":"Can only set Cookies for the current domain", after you fix the first problem. An example of such webpage is "https://github.com/". You need to add key 'expiry' to the cookies for this webpage.

        for k in ('name', 'value', 'domain', 'path', 'expiry'):
            if k not in list(cookie.keys()):
                if k == 'expiry':
                    cookie[k] = 1475825481
    

    Putting them all together, the complete code is as below:

    # uncommented one of the following three URLs to test
    #targetURL = "http://pythonscraping.com"
    targetURL = "https://stackoverflow.com/"
    #targetURL = "https://github.com/"
    
    from selenium import webdriver
    driver = webdriver.PhantomJS()
    driver.get(targetURL)
    driver.implicitly_wait(1)
    #print(driver.get_cookies())
    
    savedCookies = driver.get_cookies()
    driver2 = webdriver.PhantomJS()
    driver2.get(targetURL)
    driver2.implicitly_wait(1)
    driver2.delete_all_cookies()
    
    for cookie in savedCookies:
        # fix the 2nd problem
        for k in ('name', 'value', 'domain', 'path', 'expiry'):
            if k not in list(cookie.keys()):
                if k == 'expiry':
                    cookie[k] = 1475825481
        # fix the 1st problem
        driver2.add_cookie({k: cookie[k] for k in ('name', 'value', 'domain', 'path', 'expiry') if k in cookie})    
    print(cookie)   
    
    driver2.get(targetURL)
    driver2.implicitly_wait(1)
    

提交回复
热议问题