1

所以,基本上我使用 selenium 来自动测试一个 web 应用程序。

  1. 我正在使用从 Selenium IDE 中导入的 Java 的基本步骤,然后我添加了一些额外的 Java 代码。
  2. 然后我将它发送到 Selenium 服务器以执行自动化步骤。

以下是将代码分解为两部分的内容:

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

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

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

所以我想知道第 1 部分中是否有办法让 Selenium 在验证和登录后将 cookie 存储在某个地方。(也许将cookie存储到对象或其他东西中)

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

4

1 回答 1

2

登录后,适当的 cookie 已发送到客户端浏览器,然后您可以使用 JavaScriptExecuter 获取该 cookie 的值到您的 Java。

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

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

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

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);
于 2013-05-15T23:40:31.780 回答