使用相同的URL处理两个不同的页面

时间:2016-01-16 06:44:12

标签: php url selenium

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

2 个答案:

答案 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次测试:

  • 执行使您的应用忘记浏览器所需的所有内容(清除Cookie,更改浏览器签名等)并检查您是否收到了“秘密问题”#39;页面
  • 执行确保您的请求代表已知浏览器并检查您登录页面所需的所有内容

这样的东西
testLogin_unknownBrowser_showsSecretQuestion:
    ->clearCookies
    ->findElement(byId 'secretQuestion')

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

此时,如果您的某个测试失败,很容易找出问题。

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

您可能希望抽象出所有要登录的内容'在一个BaseTestCase中,当你只是想登录并测试其他东西而不是经常解决我得到的屏幕时,在多种情况下使用它。问题。