有没有办法让selenium存储cookie,所以我可以在java代码中调用它?

时间:2013-05-15 22:04:42

标签: java selenium automation qa

所以,基本上我正在使用selenium来自动化针对Web应用程序的测试。

  1. 我使用从Selenium IDE导入的Java基本步骤,然后我添加了一些额外的Java代码。
  2. 然后我将它发送到Selenium服务器以执行自动化步骤。
  3. 以下是代码分为两部分的内容:

    第1部分:
    这基本上是登录Web应用程序的一些步骤。 它有用户名和密码,它将带POSTDATA的POST发送到服务器。 这里的所有内容都是通过Selenium完成的,你可以看到它在运行测试时完成,在Selenium自动完成的Web浏览器中完成。

    第2部分:
    这基本上是一些步骤,使用POST和POSTDATA将数据库中的用户名发送到服务器上的php文件。 (为了正确发送此POST,需要使用第1部分中的Web应用程序进行身份验证。) 这里的一切都是通过Java完成的。

    问题:
    所以我遇到的问题是第1部分和第2部分似乎被视为互斥。一旦我使用Selenium对Web应用程序进行身份验证,普通Java代码就不会使用该会话。我不得不从HTTP Headers复制cookie,直接将它插入第1部分第2部分的POST中。这似乎是一个非常手动的过程,让第2部分工作。

    所以我想知道在第1部分中是否有一种方法让Selenium在验证和登录后将cookie存储在某处。 (可能将cookie存储到对象或其他内容中)

    因此,在第2部分中,我可以使用Java调用该对象并将cookie填入必填字段,并完成对Web应用程序的第二次POST,而无需手动为其提供有效的cookie。

1 个答案:

答案 0 :(得分:2)

登录后,相应的cookie已发送到客户端浏览器,然后您可以使用JavaScriptExecuter将该cookie的值传递给Java。

以下是我设置JavaScriptExecuter的方法(你的看起来可能有些不同):

//setup
ProfilesIni profile = new ProfilesIni();
FirefoxProfile ffprofile = profile.getProfile("SELENIUM");
driver = new FirefoxDriver(ffprofile);
js = (JavascriptExecutor) driver;

这是一个包含JavaScript的String,用于读取cookie。您只需要为每个页面将其添加到页面(执行它)一次。

private final String readCookieFunction  = 
    "function readCookie(name) { " +
    "// name is the cookie you want to read - returns the value of specified cookie " +
    "var nameEQ = name + '='; " +
    "var ca = document.cookie.split(';'); " +
    "for ( var i = 0; i < ca.length; i++) { " +
    "var c = ca[i]; " +
    "while (c.charAt(0) == ' ') " +
    "c = c.substring(1, c.length); " +
    "if (c.indexOf(nameEQ) == 0) " +
    "return c.substring(nameEQ.length, c.length); " +
    "} " +
    "return null; " +
    "} ";

所以,如果你重新打开或刷新页面,你需要在执行以下实际调用该函数的JS之前再次添加/执行它:

private final String readCookie = "return readCookie(name);"

这里,JavaScript变量“name”是你的cookie的名字 - 一个字符串 - 所以如果你的测试网站是stackoverflow,那么上面的JS会看起来像这样:

private final String readCookie = "return readCookie('stackoverflow.com');"

无论如何,在初始设置之后,获取cookie的值很简单。 部分测试可能如下所示:

// Add the function to the page's JS
js.executeScript(readCookieFunction);
// Call that function to get the cookie's value from the page into Java
String cookieValue = (String) js.executeScript(readCookie);