Приемочный тест Codeception для принятия всплывающего окна

В настоящее время я использую Codeception 2.2 для тестирования приложения. Шаги, которые у меня есть до сих пор, приведены ниже:

<?php 
$I = new AcceptanceTester($scenario);
$I->wantTo('perform actions and see result');
$I->amOnPage('/index.php');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Sign in');
$I->amOnPage('/index.php?module=CustomReports&view=Edit');
$I->fillField('relatedclient', '******');
$I->fillField('policynumber', '****');
$I->click('Save');
$I->see('You are being redirected to the clients isa report.');
$I->click('OK');    // This is where it fails
$I->see('Client ISA Statement');
?>

В настоящее время я использую PHP со встроенным JS, и именно здесь возникает ошибка. Мне интересно, как я могу принять window.alert, чтобы перейти на следующую страницу. Я пробовал $I->click('OK'), но это не работает.

Спасибо


person Diddy    schedule 20.04.2017    source источник


Ответы (5)


Это действительно запутанная вещь в кодировании. Вы можете попробовать это с

$I->acceptPopup()

К сожалению, может быть, что это не работает. Это вызвано драйверами selenium2. Иногда они не могут понять, когда браузеры выдают предупреждения. Я видел действительно очень запутанные вещи относительно этих предупреждений.

person jiGL    schedule 20.04.2017

Попробуйте этот подход:

    $I = $this->tester;

    $I->amGoingTo("check whether any JS alert appears and accept it");
    $I->executeInSelenium(function (\Facebook\WebDriver\WebDriver $webdriver) {
        try {
            $webdriver->wait(1.5, 200)->until(
                WebDriverExpectedCondition::alertIsPresent()
            );
            $webdriver->switchTo()->alert()->accept();

        } catch (Exception $e) {
            echo("###ERROR: oops, didnt manage to find the alert. Exception: '" . $e->getTraceAsString() . "' 
            Please contact test developers for investgation");
        }
    });
    if (strlen($this->errorMessage) > 0) {
        $I->comment($this->errorMessage);
    }

Надеюсь, это поможет Вам. С уважением,

person eugene.polschikov    schedule 17.05.2018

Еще одна вещь, которая может сработать, — использовать более конкретный селектор для кнопки «ОК».

Вот тот, который сработал для меня:

$I->click("//button[contains(@class, 'x-btn-text') and text() = 'OK']");

В этом случае «кнопка» — это тег HTML, который я хочу щелкнуть, «x-btn-text» — это класс кнопки, а «ОК» — это текст внутри тега.

Если у кнопки уникальный идентификатор (или вы можете его добавить), все намного проще:

<button id="button_id" type="button">OK</button>

$I->click('#button_id');

Обратите внимание, что это может не сработать, если вы не используете WebDriver для приемочного теста.

person Bob Ray    schedule 26.01.2019

Попробуйте это

 try {
    $I->click('i.e. CLOSE BUTTON OF YOUR POPUP ELEMENT');
    } catch (\PHPUnit_Framework_Exception $e) {
       // failed assertion handled
    }   
person QATesting    schedule 05.02.2019

Вот что наконец сработало:

$I->waitForElementVisible("//button[contains(@class, 'x-btn-text') and text() = 'Yes']");
$I->click("//button[contains(@class, 'x-btn-text') and text() = 'Yes']");
person Bob Ray    schedule 05.02.2019