【问题标题】:How to get cookie value from a WebDriver using selenium?如何使用 selenium 从 WebDriver 获取 cookie 值?
【发布时间】:2018-07-01 22:11:04
【问题描述】:

/我正在使用以下代码来获取 cookie 值,但我只得到第 1 部分和第 2 部分。但没有得到第 3 和第 4 部分(如您所见,为空)。 请帮我解决这个问题。我附上了我手动获取的 cookie 的屏幕截图/

 WebDriver driver;
        System.setProperty("webdriver.ie.driver",
                "C:\\Users\\MR049860\\Documents\\Selenium\\IEDriverServer\\IEDriverServer.exe");
        driver = new InternetExplorerDriver();
        driver.get("https://www.example.com");

        // Input Email id and Password If you are already Register
        driver.findElement(By.name("j_username")).sendKeys("publisher");
        driver.findElement(By.name("j_password")).sendKeys("Passw0rd");
        WebDriverWait wait = new WebDriverWait(driver, 5);
        WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("BtnButton__")));
        // WebElement ele = driver.findElement(By.id("ctllogonBtnButton__"));
        element.sendKeys(Keys.ENTER);
        // create file named Cookies to store Login Information     
        File file = new File("madhu.data");                         
        try     
        {     
            // Delete old file if exists
            file.delete();      
            file.createNewFile();           
            FileWriter fileWrite = new FileWriter(file);                            
            BufferedWriter Bwrite = new BufferedWriter(fileWrite);                          
            // loop for getting the cookie information      

            // loop for getting the cookie information      
            for(Cookie ck : driver.manage().getCookies())                           
            {           
                Bwrite.write((ck.getName()+";"+ck.getValue()+";"+ck.getDomain()+";"+ck.getPath()+";"+ck.getExpiry()+";"+ck.isSecure()));                                                                                                    
                Bwrite.newLine();             
            }           
            Bwrite.close();         
            fileWrite.close();  

        }
        catch(Exception ex)                 
        {       
            ex.printStackTrace();           
        }

输出:- ASPSESSIONIDSZQPRQCS;NFPFIAGDBMJNOMKPCPKESHDC;null;/;null;true

【问题讨论】:

  • getCookies 方法只返回当前域的 cookie。所以他们可能是空的。文件中是否只添加了一行?这意味着 Cookie 中只有一个 name=value 吗?但在图像中我可以看到有多个名称=值对。参考developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cookie 语法。您可能会看到值 JSESSIONID 作为名称和 2C36** 作为值。我观察到的一件主要事情是您附加了请求标头。但 getCookies 返回由 RESPONSE HEADER Set-Cookie 设置的 Cookie。
  • 请阅读为什么是screenshot of HTML or code or error is a bad idea。考虑使用基于格式化文本的相关 HTML、代码试验和错误堆栈跟踪来更新问题。

标签: java selenium cookies selenium-webdriver


【解决方案1】:

下面的代码可以用来获取cookie值 包实用程序;

import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class CookieUtility {

    public static InternetExplorerDriver getDriver() throws InterruptedException {

        InternetExplorerDriver driver;
        System.setProperty("webdriver.ie.driver",
                "C:\\Documents\\Selenium\\IEDriverServer\\IEDriverServer.exe");
        driver = new InternetExplorerDriver();
        driver.get("https://example.com");

        // Input Email id and Password If you are already Register
        driver.findElement(By.name("username")).sendKeys("password");
        driver.findElement(By.name("password")).sendKeys("Paswrd");
        WebDriverWait wait = new WebDriverWait(driver, 5);
        WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("logonButton")));
        // WebElement ele = driver.findElement(By.id("ctllogonBtnButton__"));
        element.sendKeys(Keys.ENTER);
        for (int i = 0; i < 2 && driver.findElements(By.id("textbox")).size() == 0; i++) {
            Thread.sleep(10000);
        }

        element.sendKeys(Keys.F5);

        return driver;
    }

    public static String[] getCookieValues(InternetExplorerDriver driver) throws InterruptedException {

        // create file named Cookies to store Login Information
        Set<Cookie> cks = driver.manage().getCookies();
        String[] cookieValues = new String[cks.size()];

        int i = 0;
        for (Cookie ck : cks) {
            cookieValues[i] = ck.getValue();
            i++;
        }
        i = 0;

        return cookieValues;
    }

    public static String getSessionId(InternetExplorerDriver driver) {

        String sessionId = driver.getSessionId().toString();
        return sessionId;

    }

    public static void main(String args[]) throws InterruptedException {

        InternetExplorerDriver driver = getDriver();

        String[] values = getCookieValues(driver);

        String sessionId = getSessionId(driver);
    }

    public static String getcookiestring(String sessionId, String cookie1, String cookie2, String cookie3) {
        String cookie = "JSESSIONID=" + sessionId + "; hi.session.co.entity=" + cookie2 + "; hi.session.id.identifier="
                + cookie1 + "; hi.session.client.identifier=" + cookie3;
        return cookie;

    }

}

【讨论】:

    【解决方案2】:

    您只能获取名称和值。不允许您获取其他域/路径或到期日期的 cookie。这就是网络浏览器的安全策略。

    【讨论】:

    • 有什么方法可以获取 Session id 标识符的值(请参考屏幕截图)。我需要这个值来实现自动化,所以如果我有任何方法可以克服这个问题,那将会很有帮助
    • 当然。您的代码应该能够处理它。问题是什么?是否抛出异常?
    • 它给出了部分输出。即我只得到 JSession 值。但其他值没有作为输出。代码工作正常,执行时没有错误或异常。
    • element.sendKeys(Keys.ENTER); 之后会发生什么。是否为登录过程添加了足够的等待时间?
    • 感谢帮助。页面加载需要一些时间,因此只打印了 Jsession。我添加了 100 等待时间,它起作用了
    猜你喜欢
    • 2013-07-17
    • 2012-05-07
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多