处理具有相同 URL 的两个不同页面


Handling two different pages with the same URL

我正在开发一个使用Selenium自动登录网站的程序。在某些情况下,如果网站不记得浏览器,它会要求您回答一个秘密问题,然后再将您带到密码页面。最初,我以为我会用一个If语句来处理这个问题,该语句根据我知道在我被定向到秘密问题页面时生成的特定 URL 检查当前 URL。我遇到的问题是,秘密问题页面的 URL 和密码页面的 URL 是相同的。在这种情况下,有没有办法通过 URL 区分这两个页面,或者我需要找到替代方法?

如果 URL 完全相同,

则不会有任何差异可供比较,因此您将无法根据 URL 判断页面内容。

通常有一个页面,一个URL,显示不同的内容,由Selenium看不到的后端代码决定。您将需要比较两个页面之间不同的内容,例如仅出现在一页上的元素。

假设您不在乎是否显示密码或秘密问题,您只想让Selenium通过登录过程,一个简单的解决方案是使用if/else语句检查出现哪个表单,然后尝试填写存在的表单。

if ($this->isElementPresent($password_form)) {
    // enter the password;
} elseif ($this->isElementPresent($secret_question)) {
    // answer the secret question;
} else {
    throw new Exception('Could not find password form or secret question on the login page. [url]');
}

对于可用于标识的每个表单,实际的表单元素很可能具有不同的 ID 或名称,或者密码/秘密答案的输入将具有不同的名称。(如果所有其他方法都失败了,您可以在页面上查找文本,说明是否输入密码或秘密问题。

Waaiit a miiinuute.你搞错了。

在编写测试时,您应该为相同的输入明确定义(预期)输出/行为。

因此,在您的情况下,您应该进行 2 项测试:

  • 执行使您的应用程序忘记浏览器所需的所有操作(清除cookie,更改浏览器签名等),并检查您是否获得"秘密问题"页面
  • 执行所有必要的操作,以确保您的请求代表已知浏览器并检查您是否在登录页面上

类似的东西

testLogin_unknownBrowser_showsSecretQuestion:
    ->clearCookies
    ->findElement(byId 'secretQuestion')
testLogin_knownBrowser_showsLogin:
    ->setCookies
    ->findElement(byId 'username')
    ->findElement(byId 'password')

此时,如果其中一个测试失败,很容易找出问题所在。

理想情况下,您不包含任何魔法,并保持测试尽可能清晰。

您可能希望在 BaseTestCase 中抽象出"执行所有登录操作",并在多种情况下使用它,当您只想登录并测试其他内容而不经常解决"我得到了什么屏幕"问题时。