我使用Codeception和WebDriver进行了非常简单的验收测试。它使用Hybridauth测试登录("通过.." *某些社交网络登录)。
代码:
$I = $i = new AcceptanceTester($scenario);
$I->wantTo('Register using VK account (hybridauth) and check that friends list is loaded');
$I->amOnPage('/');
$I->see('VKontakte');
$I->click("VKontakte");
$__HANDLES= null;
$I->executeInSelenium(function (\WebDriver $webdriver) {
GLOBAL $__HANDLES;
$__HANDLES = $webdriver->getWindowHandles();
$webdriver->switchTo()->window(end($__HANDLES));
}); // VK's popup loaded
codecept_debug($I->grabTextFrom('#install_allow'));
$I->seeElement('.box_login');
$I->fillField('email', '******');
$I->fillField('pass', '******');
$I->click($I->grabTextFrom('#install_allow'));
$I->dontSeeElement('.oauth_error');
此测试中的每个行都已成功执行,但最后Codeception会抛出一个抱怨"没有窗口的异常":
[NoSuchWindowException]
Window not found. The browser window may have been closed.
Build info: version: '2.45.0', revision: '5017cb8', time: '2015-02-26 23:59:50'
System info: host: '***', ip: '***', os.name: 'Linux', os.arch: 'amd64', os.version: '3.2.0-4-amd64', java.version: '1.7.0_65'
Driver info: driver.version: unknown

问题是 - 如何管理这种情况以使测试顺利进行? $I->switchToWindow();
没有帮助。
***更新:
解决。答案很简单:窗口关闭时会触发$I->dontSeeElement('.oauth_error');
。所以我们需要先切换窗口,然后再断言。
答案 0 :(得分:0)
解决。答案很简单:窗口关闭时会触发$I->dontSeeElement('.oauth_error');
。所以我们需要先切换窗口,然后再断言。
答案 1 :(得分:0)
我们在OAuth2身份验证方面遇到了同样的问题。
我们注入Javascript以给Main窗口一个已知的名称,然后我们可以在PopUp消失后切换窗口并且Webdriver丢失了他的引用。
$I->executeJS('old_window_name = window.name; window.name="mainwindow"');
因此,这是处理PopUp登录的完整用户步骤方法
public function openLoginPopup ()
{
$I = $this;
$I->amOnPage(\MainMenuPage::$URL);
$I->doWait();
$I->executeJS('old_window_name = window.name; window.name="mainwindow"');
$I->click(\MainMenuPage::$loginButtonLocator);
$I->switchToWindow(\LoginPage::$windowName);
}
public function fillLoginForm ($username, $password)
{
$I = $this;
$I->fillField('_username', $username);
$I->fillField('_password', $password);
}
public function submitLoginData ()
{
$I = $this;
$I->click(\LoginPage::$loginButtonLocator);
$I->switchToWindow('mainwindow');
$I->executeJS('window.name=old_window_name');
}
HTH