我正在开发一个使用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 中抽象出"执行所有登录操作",并在多种情况下使用它,当您只想登录并测试其他内容而不经常解决"我得到了什么屏幕"问题时。