弹出窗口自动关闭时,Codeception失败

时间:2015-03-16 16:52:53

标签: php selenium-webdriver webdriver codeception

我使用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');。所以我们需要先切换窗口,然后再断言。

2 个答案:

答案 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