我正在开发一个使用Selenium自动登录网站的程序。在某些情况下,如果网站不记得浏览器,它会要求您在进入密码页面之前回答一个秘密问题。最初我以为我会用If
语句处理这个问题,该语句根据我知道在我被引导到秘密问题页面时生成的特定URL来检查当前URL。我遇到的问题是,秘密问题页面的URL和密码页面的URL是相同的。在这种情况下,有没有办法通过URL区分这两个页面,还是需要找到替代方法?
答案 0 :(得分:0)
如果网址完全相同,您将无法比较任何差异,因此您将无法根据网址确定网页内容的内容。
通常有一个页面,一个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或名称,或者密码/机密答案的输入将具有不同的名称。 (如果所有其他方法都失败了,您可以在页面上查找是否输入密码或密码问题的文本。)
答案 1 :(得分:0)
Waaiit miiinuute。你错了。
编写测试时,您应该为同一输入明确定义(预期)输出/行为。
因此,在您的情况下,您应该进行2次测试:
像
这样的东西testLogin_unknownBrowser_showsSecretQuestion:
->clearCookies
->findElement(byId 'secretQuestion')
testLogin_knownBrowser_showsLogin:
->setCookies
->findElement(byId 'username')
->findElement(byId 'password')
此时,如果您的某个测试失败,很容易找出问题。
理想情况下,您不会包含任何魔法,并尽可能保持您的测试。
您可能希望抽象出所有要登录的内容'在一个BaseTestCase中,当你只是想登录并测试其他东西而不是经常解决我得到的屏幕时,在多种情况下使用它。问题。