【问题标题】:Codeception fails when popup is closed automatically自动关闭弹出窗口时 Codeception 失败
【发布时间】:2015-03-16 16:52:52
【问题描述】:

我使用 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'); 在窗口已经关闭时被触发。所以我们需要先切换窗口,然后才断言一些东西。

【问题讨论】:

    标签: php selenium-webdriver webdriver codeception


    【解决方案1】:

    我们在 OAuth2 身份验证方面遇到了同样的问题。

    我们注入Javascript给主窗口一个已知的名字,然后我们可以在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

    【讨论】:

    • 感谢您的回答。就我而言,一切都很好,除了我尝试使用已经关闭的窗口进行操作(参见代码中的最后一行)。所以我只是摆脱了那个操作,而是切换到主窗口。
    【解决方案2】:

    已解决。答案很简单:$I->dontSeeElement('.oauth_error'); 在窗口已经关闭时被触发。所以我们需要先切换窗口,然后才断言一些东西。

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多