Server_AccessControl/vendor/codeception/base/tests/web/WebDriverTest.php
2020-10-06 14:27:47 +07:00

1129 lines
38 KiB
PHP

<?php
use Codeception\Step;
use Codeception\Util\Stub;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\WebDriverKeys;
require_once codecept_data_dir() . 'app/data.php';
require_once __DIR__ . '/../unit/Codeception/Module/TestsForBrowsers.php';
class WebDriverTest extends TestsForBrowsers
{
/**
* @var \Codeception\Module\WebDriver
*/
protected $module;
/**
* @var RemoteWebDriver
*/
protected $webDriver;
const MODULE_CLASS = 'Codeception\Module\WebDriver';
const WEBDRIVER_CLASS = 'Facebook\WebDriver\Remote\RemoteWebDriver';
public function _before()
{
$this->module = $this->getModule('WebDriver');
$this->webDriver = &$this->getModule('WebDriver')->webDriver;
}
public function _after()
{
data::clean();
}
public function testClickEventOnCheckbox()
{
$this->module->amOnPage('/form/checkbox');
$this->module->uncheckOption('#checkin');
$this->module->dontSee('ticked', '#notice');
$this->module->checkOption('#checkin');
$this->module->see('ticked', '#notice');
}
public function testAcceptPopup()
{
$this->notForPhantomJS();
$this->module->amOnPage('/form/popup');
$this->module->click('Confirm');
$this->module->acceptPopup();
$this->module->see('Yes', '#result');
}
public function testCancelPopup()
{
$this->notForPhantomJS();
$this->module->amOnPage('/form/popup');
$this->module->click('Confirm');
$this->module->cancelPopup();
$this->module->see('No', '#result');
}
public function testSelectByCss()
{
$this->module->amOnPage('/form/select');
$this->module->selectOption('form select[name=age]', '21-60');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('adult', $form['age']);
}
public function testSelectInvalidOptionForSecondSelectFails()
{
$this->shouldFail();
$this->module->amOnPage('/form/select_second');
$this->module->selectOption('#select2', 'Value2');
}
public function testSeeInPopup()
{
$this->notForPhantomJS();
$this->module->amOnPage('/form/popup');
$this->module->click('Alert');
$this->module->seeInPopup('Really?');
$this->module->cancelPopup();
}
public function testFailedSeeInPopup()
{
$this->notForPhantomJS();
$this->setExpectedException(
'\PHPUnit\Framework\AssertionFailedError',
'Failed asserting that \'Really?\' contains "Different text"'
);
$this->module->amOnPage('/form/popup');
$this->module->click('Alert');
$this->module->seeInPopup('Different text');
$this->module->cancelPopup();
}
public function testDontSeeInPopup()
{
$this->notForPhantomJS();
$this->module->amOnPage('/form/popup');
$this->module->click('Alert');
$this->module->dontSeeInPopup('Different text');
$this->module->cancelPopup();
}
public function testFailedDontSeeInPopup()
{
$this->notForPhantomJS();
$this->setExpectedException(
'\PHPUnit\Framework\AssertionFailedError',
'Failed asserting that \'Really?\' does not contain "Really?"'
);
$this->module->amOnPage('/form/popup');
$this->module->click('Alert');
$this->module->dontSeeInPopup('Really?');
$this->module->cancelPopup();
}
public function testScreenshot()
{
$this->module->amOnPage('/');
@unlink(\Codeception\Configuration::outputDir().'testshot.png');
$testName="debugTest";
$this->module->makeScreenshot($testName);
$this->assertFileExists(\Codeception\Configuration::outputDir().'debug/'.$testName.'.png');
@unlink(\Codeception\Configuration::outputDir().'debug/'.$testName.'.png');
$this->module->_saveScreenshot(\Codeception\Configuration::outputDir().'testshot.png');
$this->assertFileExists(\Codeception\Configuration::outputDir().'testshot.png');
@unlink(\Codeception\Configuration::outputDir().'testshot.png');
}
public function testSubmitForm()
{
$this->module->amOnPage('/form/complex');
$this->module->submitForm('form', [
'name' => 'Davert',
'age' => 'child',
'terms' => 'agree',
'description' => 'My Bio'
]);
$form = data::get('form');
$this->assertEquals('Davert', $form['name']);
$this->assertEquals('kill_all', $form['action']);
$this->assertEquals('My Bio', $form['description']);
$this->assertEquals('agree', $form['terms']);
$this->assertEquals('child', $form['age']);
}
public function testSubmitFormWithNumbers()
{
$this->module->amOnPage('/form/complex');
$this->module->submitForm('form', [
'name' => 'Davert',
'age' => 'child',
'terms' => 'agree',
'description' => 10
]);
$form = data::get('form');
$this->assertEquals('Davert', $form['name']);
$this->assertEquals('kill_all', $form['action']);
$this->assertEquals('10', $form['description']);
$this->assertEquals('agree', $form['terms']);
$this->assertEquals('child', $form['age']);
}
/**
* @dataProvider strictSelectorProvider
*/
public function testSubmitFormWithButtonAsStrictSelector(array $selector)
{
$this->module->amOnPage('/form/strict_selectors');
$this->module->submitForm('form', [
'name' => 'Davert',
'age' => 'child',
'terms' => 'agree',
'description' => 'My Bio'
], $selector);
$form = data::get('form');
$this->assertEquals('Davert', $form['name']);
$this->assertEquals('kill_all', $form['action']);
$this->assertEquals('My Bio', $form['description']);
$this->assertEquals('agree', $form['terms']);
$this->assertEquals('child', $form['age']);
}
public function strictSelectorProvider()
{
return [
'by id' => [['id' => 'submit_button']],
'by name' => [['name' => 'submit_button_name']],
'by css' => [['css' => 'form #submit_button']],
'by xpath' => [['xpath' => '//*[@id="submit_button"]']],
'by link' => [['link' => 'Submit']],
'by class' => [['class' => 'button']],
];
}
/**
* @dataProvider webDriverByProvider
*/
public function testSubmitFormWithButtonAsWebDriverBy(WebDriverBy $selector)
{
$this->module->amOnPage('/form/strict_selectors');
$this->module->submitForm('form', [
'name' => 'Davert',
'age' => 'child',
'terms' => 'agree',
'description' => 'My Bio'
], $selector);
$form = data::get('form');
$this->assertEquals('Davert', $form['name']);
$this->assertEquals('kill_all', $form['action']);
$this->assertEquals('My Bio', $form['description']);
$this->assertEquals('agree', $form['terms']);
$this->assertEquals('child', $form['age']);
}
public function webDriverByProvider()
{
return [
'by id' => [WebDriverBy::id('submit_button')],
'by name' => [WebDriverBy::name('submit_button_name')],
'by css selector' => [WebDriverBy::cssSelector('form #submit_button')],
'by xpath' => [WebDriverBy::xpath('//*[@id="submit_button"]')],
'by link text' => [WebDriverBy::linkText('Submit')],
'by class name' => [WebDriverBy::className('button')],
];
}
public function testRadioButtonByValue()
{
$this->module->amOnPage('/form/radio');
$this->module->selectOption('form', 'disagree');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('disagree', $form['terms']);
}
public function testRadioButtonByLabelOnContext()
{
$this->module->amOnPage('/form/radio');
$this->module->selectOption('form input', 'Get Off');
$this->module->seeOptionIsSelected('form input', 'disagree');
$this->module->dontSeeOptionIsSelected('form input', 'agree');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('disagree', $form['terms']);
}
public function testRadioButtonByLabel()
{
$this->module->amOnPage('/form/radio');
$this->module->checkOption('Get Off');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('disagree', $form['terms']);
}
public function testRawSelenium()
{
$this->module->amOnPage('/');
$this->module->executeInSelenium(function ($webdriver) {
$webdriver->findElement(WebDriverBy::id('link'))->click();
});
$this->module->seeCurrentUrlEquals('/info');
}
public function testKeys()
{
$this->module->amOnPage('/form/field');
$this->module->pressKey('#name', ['ctrl', 'a'], WebDriverKeys::DELETE);
$this->module->pressKey('#name', 'test', ['shift', '111']);
$this->module->pressKey('#name', '1');
$this->module->seeInField('#name', 'test!!!1');
}
public function testWait()
{
$this->module->amOnPage('/');
$time = time();
$this->module->wait(3);
$this->assertGreaterThanOrEqual($time+3, time());
}
public function testSelectInvalidOptionFails()
{
$this->shouldFail();
$this->module->amOnPage('/form/select');
$this->module->selectOption('#age', '13-22');
}
public function testAppendFieldSelect()
{
$this->module->amOnPage('/form/select_multiple');
$this->module->selectOption('form #like', 'eat');
$this->module->appendField('form #like', 'code');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEmpty(array_diff($form['like'], ["eat", "code"]));
}
public function testAppendFieldSelectFails()
{
$this->shouldFail();
$this->module->amOnPage('/form/select_multiple');
$this->module->appendField('form #like', 'code123');
}
public function testAppendFieldTextarea()
{
$this->module->amOnPage('/form/textarea');
$this->module->fillField('form #description', 'eat');
$this->module->appendField('form #description', ' code');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('eat code', $form['description']);
}
public function testAppendFieldTextareaFails()
{
$this->shouldFail();
$this->module->amOnPage('/form/textarea');
$this->module->appendField('form #description123', ' code');
}
public function testAppendFieldText()
{
$this->module->amOnPage('/form/field');
$this->module->appendField('form #name', ' code');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('OLD_VALUE code', $form['name']);
}
public function testAppendFieldTextFails()
{
$this->shouldFail();
$this->module->amOnPage('/form/field');
$this->module->appendField('form #name123', ' code');
}
public function testAppendFieldCheckboxByValue()
{
$this->module->amOnPage('/form/checkbox');
$this->module->appendField('form input[name=terms]', 'agree');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('agree', $form['terms']);
}
public function testAppendFieldCheckboxByValueFails()
{
$this->shouldFail();
$this->module->amOnPage('/form/checkbox');
$this->module->appendField('form input[name=terms]', 'agree123');
}
public function testAppendFieldCheckboxByLabel()
{
$this->module->amOnPage('/form/checkbox');
$this->module->appendField('form input[name=terms]', 'I Agree');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('agree', $form['terms']);
}
public function testAppendFieldCheckboxByLabelFails()
{
$this->shouldFail();
$this->module->amOnPage('/form/checkbox');
$this->module->appendField('form input[name=terms]', 'I Agree123');
}
public function testAppendFieldRadioButtonByValue()
{
$this->module->amOnPage('/form/radio');
$this->module->appendField('form input[name=terms]', 'disagree');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('disagree', $form['terms']);
}
public function testAppendFieldRadioButtonByValueFails()
{
$this->shouldFail();
$this->module->amOnPage('/form/radio');
$this->module->appendField('form input[name=terms]', 'disagree123');
}
public function testAppendFieldRadioButtonByLabel()
{
$this->module->amOnPage('/form/radio');
$this->module->appendField('form input[name=terms]', 'Get Off');
$this->module->click('Submit');
$form = data::get('form');
$this->assertEquals('disagree', $form['terms']);
}
public function testAppendFieldRadioButtonByLabelFails()
{
$this->shouldFail();
$this->module->amOnPage('/form/radio');
$this->module->appendField('form input[name=terms]', 'Get Off123');
}
public function testPauseExecution()
{
$this->module->amOnPage('/');
$this->module->pauseExecution();
}
// Issue https://github.com/Codeception/Codeception/pull/875
public function testFillPasswordOnFormSubmit()
{
$this->module->amOnPage('/form/complex');
$this->module->submitForm('form', [
'password' => '123456'
]);
$form = data::get('form');
$this->assertEquals('123456', $form['password']);
}
public function testEmptyFormSubmit()
{
$this->shouldFail();
$this->module->amOnPage('/form/complex');
$this->module->submitForm('form111', []);
}
public function testWebDriverByLocators()
{
$this->module->amOnPage('/login');
$this->module->seeElement(WebDriverBy::id('submit-label'));
$this->module->seeElement(WebDriverBy::name('password'));
$this->module->seeElement(WebDriverBy::className('optional'));
$this->module->seeElement(WebDriverBy::cssSelector('form.global_form_box'));
$this->module->seeElement(WebDriverBy::xpath(\Codeception\Util\Locator::tabIndex(4)));
$this->module->fillField(WebDriverBy::name('password'), '123456');
$this->module->amOnPage('/form/select');
$this->module->selectOption(WebDriverBy::name('age'), 'child');
$this->module->amOnPage('/form/checkbox');
$this->module->checkOption(WebDriverBy::name('terms'));
$this->module->amOnPage('/');
$this->module->seeElement(WebDriverBy::linkText('Test'));
$this->module->click(WebDriverBy::linkText('Test'));
$this->module->seeCurrentUrlEquals('/form/hidden');
}
public function testSeeVisible()
{
$this->module->amOnPage('/info');
$this->module->dontSee('Invisible text');
$this->module->dontSee('Invisible', '.hidden');
$this->module->seeInPageSource('Invisible text');
}
public function testSeeInvisible()
{
$this->shouldFail();
$this->module->amOnPage('/info');
$this->module->see('Invisible text');
}
public function testFailWebDriverByLocator()
{
$this->shouldFail();
$this->module->amOnPage('/form/checkbox');
$this->module->checkOption(WebDriverBy::name('age'));
}
// fails in PhpBrowser :(
public function testSubmitUnchecked()
{
$this->module->amOnPage('/form/unchecked');
$this->module->seeCheckboxIsChecked('#checkbox');
$this->module->uncheckOption('#checkbox');
$this->module->click('#submit');
;
$this->module->see('0', '#notice');
}
public function testCreateCeptScreenshotFail()
{
$fakeWd = Stub::make('\Facebook\WebDriver\Remote\RemoteWebDriver', [
'takeScreenshot' => Stub::once(function () {
}),
'getPageSource' => Stub::once(function () {
}),
'manage' => Stub::make('\Facebook\WebDriver\WebDriverOptions', [
'getAvailableLogTypes' => Stub::atLeastOnce(function () {
return [];
}),
]),
]);
$module = Stub::make(self::MODULE_CLASS, ['webDriver' => $fakeWd]);
$cept = (new \Codeception\Test\Cept('loginCept', 'loginCept.php'));
$module->_failed($cept, new \PHPUnit\Framework\AssertionFailedError());
}
public function testCreateCestScreenshotOnFail()
{
$fakeWd = Stub::make(self::WEBDRIVER_CLASS, [
'takeScreenshot' => Stub::once(function ($filename) {
PHPUnit_Framework_Assert::assertEquals(codecept_log_dir('stdClass.login.fail.png'), $filename);
}),
'getPageSource' => Stub::once(function () {
}),
'manage' => Stub::make('\Facebook\WebDriver\WebDriverOptions', [
'getAvailableLogTypes' => Stub::atLeastOnce(function () {
return [];
}),
]),
]);
$module = Stub::make(self::MODULE_CLASS, ['webDriver' => $fakeWd]);
$cest = new \Codeception\Test\Cest(new stdClass(), 'login', 'someCest.php');
$module->_failed($cest, new \PHPUnit\Framework\AssertionFailedError());
}
public function testCreateTestScreenshotOnFail()
{
$test = Stub::make('\Codeception\TestCase\Test', ['getName' => 'testLogin']);
$fakeWd = Stub::make(self::WEBDRIVER_CLASS, [
'takeScreenshot' => Stub::once(function ($filename) use ($test) {
PHPUnit_Framework_Assert::assertEquals(
codecept_log_dir(get_class($test).'.testLogin.fail.png'),
$filename
);
}),
'getPageSource' => Stub::once(function () {
}),
'manage' => Stub::make('\Facebook\WebDriver\WebDriverOptions', [
'getAvailableLogTypes' => Stub::atLeastOnce(function () {
return [];
}),
]),
]);
$module = Stub::make(self::MODULE_CLASS, ['webDriver' => $fakeWd]);
$module->_failed($test, new \PHPUnit\Framework\AssertionFailedError());
}
public function testWebDriverWaits()
{
$fakeWd = Stub::make(self::WEBDRIVER_CLASS, ['wait' => Stub::exactly(12, function () {
return new \Codeception\Util\Maybe();
})]);
$module = Stub::make(self::MODULE_CLASS, ['webDriver' => $fakeWd]);
$module->waitForElement(WebDriverBy::partialLinkText('yeah'));
$module->waitForElement(['id' => 'user']);
$module->waitForElement(['css' => '.user']);
$module->waitForElement('//xpath');
$module->waitForElementVisible(WebDriverBy::partialLinkText('yeah'));
$module->waitForElementVisible(['id' => 'user']);
$module->waitForElementVisible(['css' => '.user']);
$module->waitForElementVisible('//xpath');
$module->waitForElementNotVisible(WebDriverBy::partialLinkText('yeah'));
$module->waitForElementNotVisible(['id' => 'user']);
$module->waitForElementNotVisible(['css' => '.user']);
$module->waitForElementNotVisible('//xpath');
}
public function testWaitForElement()
{
$this->module->amOnPage('/form/timeout');
$this->module->waitForElement('#btn');
$this->module->click('Click');
$this->module->see('Hello');
}
public function testImplicitWait()
{
$this->module->_reconfigure(['wait' => 5]);
$this->module->amOnPage('/form/timeout');
$this->module->click('#btn');
$this->module->see('Hello');
}
public function testBug1467()
{
$this->module->amOnPage('/form/bug1467');
$this->module->selectOption('form[name=form2] input[name=first_test_radio]', 'Yes');
$this->module->selectOption('form[name=form2] input[name=second_test_radio]', 'No');
$this->module->seeOptionIsSelected('form[name=form2] input[name=first_test_radio]', 'Yes');
$this->module->seeOptionIsSelected('form[name=form2] input[name=second_test_radio]', 'No');
// shouldn't have touched form1 at all
$this->module->dontSeeOptionIsSelected('form[name=form1] input[name=first_test_radio]', 'No');
$this->module->dontSeeOptionIsSelected('form[name=form1] input[name=first_test_radio]', 'Yes');
$this->module->dontSeeOptionIsSelected('form[name=form1] input[name=second_test_radio]', 'No');
$this->module->dontSeeOptionIsSelected('form[name=form1] input[name=second_test_radio]', 'Yes');
}
/**
* @Issue 1598
*/
public function testWaitForTextBug1598()
{
$this->module->amOnPage('/form/bug1598');
$this->module->waitForText('12,345', 10, '#field');
}
public function testSeeElementMalformedWdLocator()
{
$this->setExpectedException('Codeception\Exception\MalformedLocatorException');
$this->module->amOnPage('/');
$this->module->seeElement(WebDriverBy::xpath('H---EY!'));
}
public function testBug1637()
{
$this->module->amOnPage('/form/bug1637');
// confirm that options outside a form are still selectable
$this->module->selectOption('input[name=first_test_radio]', 'Yes');
// confirm that it did what we expected and did not do anything else
$this->module->seeOptionIsSelected('input[name=first_test_radio]', 'Yes');
$this->module->dontSeeOptionIsSelected('input[name=first_test_radio]', 'No');
}
public function testBug2046()
{
$this->module->webDriver = null;
$this->module->_saveScreenshot(\Codeception\Configuration::outputDir().'testshot.png');
}
public function testSessionSnapshots()
{
$this->notForPhantomJS();
$this->module->amOnPage('/');
$this->module->setCookie('PHPSESSID', '123456', ['path' => '/']);
$this->module->saveSessionSnapshot('login');
$this->module->seeCookie('PHPSESSID');
$this->webDriver->manage()->deleteAllCookies();
$this->module->dontSeeCookie('PHPSESSID');
$this->module->loadSessionSnapshot('login');
$this->module->seeCookie('PHPSESSID');
}
public function testSessionSnapshotsAreDeleted()
{
$this->notForPhantomJS();
$this->module->amOnPage('/');
$this->module->setCookie('PHPSESSID', '123456', ['path' => '/']);
$this->module->saveSessionSnapshot('login');
$this->webDriver->manage()->deleteAllCookies();
$this->module->deleteSessionSnapshot('login');
$this->assertFalse($this->module->loadSessionSnapshot('login'));
$this->module->dontSeeCookie('PHPSESSID');
}
public function testSaveSessionSnapshotsExcludeInvalidCookieDomains()
{
$this->notForPhantomJS();
$fakeWdOptions = Stub::make('\Facebook\WebDriver\WebDriverOptions', [
'getCookies' => Stub::atLeastOnce(function () {
return [
[
'name' => 'PHPSESSID',
'value' => '123456',
'path' => '/',
],
[
'name' => '3rdParty',
'value' => '_value_',
'path' => '/',
'domain' => '.3rd-party.net',
]
];
}),
]);
$fakeWd = Stub::make(self::WEBDRIVER_CLASS, [
'manage' => Stub::atLeastOnce(function () use ($fakeWdOptions) {
return $fakeWdOptions;
}),
]);
// Mock the WebDriverOptions::getCookies() method on the first call to introduce a 3rd-party cookie
// which has to be ignored when saving a snapshot.
$originalWebDriver = $this->module->webDriver;
$this->module->webDriver = $fakeWd;
$this->module->seeCookie('PHPSESSID');
$this->module->seeCookie('3rdParty');
$this->module->saveSessionSnapshot('login');
// Restore the original WebDriver
$this->module->webDriver = $originalWebDriver;
$this->webDriver->manage()->deleteAllCookies();
$this->module->dontSeeCookie('PHPSESSID');
$this->module->dontSeeCookie('3rdParty');
$this->module->amOnPage('/');
$this->module->loadSessionSnapshot('login');
$this->module->seeCookie('PHPSESSID');
$this->module->dontSeeCookie('3rdParty');
}
public function testSeeInFieldTextarea()
{
$this->module->amOnPage('/form/textarea');
//make sure we see 'sunrise' which is the default text in the textarea
$this->module->seeInField('#description', 'sunrise');
if ($this->notForSelenium()) {
$this->module->seeInField('#whitespaces', ' no_whitespaces ');
}
$this->module->seeInField('#whitespaces', 'no_whitespaces');
//fill in some new text and see if we can see it
$textarea_value = 'test string';
$this->module->fillField('#description', $textarea_value);
$this->module->seeInField('#description', $textarea_value);
}
public function testSeeInFieldSelect()
{
$this->module->amOnPage('/form/select_second');
if ($this->notForSelenium()) {
$this->module->seeInField('#select2', ' no_whitespaces ');
}
$this->module->seeInField('#select2', 'no_whitespaces');
// select new option and check it
$option_value = 'select2_value1';
$this->module->selectOption('#select2', $option_value);
$this->module->seeInField('#select2', $option_value);
}
public function testAppendFieldDiv()
{
$this->notForPhantomJS();
$this->module->amOnPage('/form/div_content_editable');
//make sure we see 'sunrise' which is the default text in the textarea
$this->module->see('sunrise', '#description');
//fill in some new text and see if we can see it
$textarea_value = 'moonrise';
$this->module->appendField('#description', $textarea_value);
$this->module->see('sunrise' . $textarea_value, '#description');
}
public function testOpenPageException()
{
if (!$this->module->_getConfig('restart')) {
$this->markTestSkipped('works only on restarts');
}
parent::testOpenPageException();
}
public function testCookies()
{
$this->notForPhantomJS();
parent::testCookies();
}
public function testSendingCookies()
{
$this->notForPhantomJS();
parent::testSendingCookies();
}
public function testCookiesWithPath()
{
$this->notForPhantomJS();
parent::testCookiesWithPath();
}
protected function notForPhantomJS()
{
if ($this->module->_getConfig('browser') == 'phantomjs') {
$this->markTestSkipped('does not work for phantomjs');
}
}
protected function notForSelenium()
{
if ($this->module->_getConfig('browser') != 'phantom') {
$this->markTestSkipped('does not work for selenium');
}
}
public function testScrollTo()
{
$this->module->amOnPage('/form/example18');
$this->module->scrollTo('#clickme');
$this->module->click('Submit');
$this->module->see('Welcome to test app!');
}
/**
* @Issue 2921
*/
public function testSeeInFieldForTextarea()
{
$this->module->amOnPage('/form/bug2921');
$this->module->seeInField('foo', 'bar baz');
}
/**
* @Issue 4726
*/
public function testClearField()
{
$this->module->amOnPage('/form/textarea');
$this->module->fillField('#description', 'description');
$this->module->clearField('#description');
$this->module->dontSeeInField('#description', 'description');
}
public function testClickHashLink()
{
$this->module->amOnPage('/form/anchor');
$this->module->click('Hash Link');
$this->module->seeCurrentUrlEquals('/form/anchor#b');
}
/**
* @Issue 3865
*/
public function testClickNumericLink()
{
$this->module->amOnPage('/form/bug3865');
$this->module->click('222');
$this->module->see('Welcome to test app');
}
public function testClickHashButton()
{
$this->module->amOnPage('/form/anchor');
$this->module->click('Hash Button');
$this->module->seeCurrentUrlEquals('/form/anchor#c');
}
public function testSubmitHashForm()
{
$this->module->amOnPage('/form/anchor');
$this->module->click('Hash Form');
$this->module->seeCurrentUrlEquals('/form/anchor#a');
}
public function testSubmitHashFormTitle()
{
$this->module->amOnPage('/form/anchor');
$this->module->click('Hash Form Title');
$this->module->seeCurrentUrlEquals('/form/anchor#a');
}
public function testSubmitHashButtonForm()
{
$this->module->amOnPage('/form/anchor');
$this->module->click('Hash Button Form');
$this->module->seeCurrentUrlEquals('/form/anchor#a');
}
public function testJSErrorLoggingPositive()
{
// arrange
$this->module->_setConfig(['log_js_errors' => true]);
$cept = new \Codeception\Test\Cept('foo', 'bar');
// act
$this->module->amOnPage('/jserroronload');
$this->module->_failed($cept, 'anyFailMessage');
// assert
/* @var $steps Step[] */
$steps = $cept->getScenario()->getSteps();
$this->assertGreaterThan(0, count($steps));
$lastStep = end($steps);
$this->assertContains(
"TypeError",
$lastStep->getHtml()
);
}
public function testJSErrorLoggingNegative()
{
// arrange
$this->module->_setConfig(['log_js_errors' => false]);
$cept = new \Codeception\Test\Cept('foo', 'bar');
// act
$this->module->amOnPage('/jserroronload');
$this->module->_failed($cept, 'anyFailMessage');
// assert
/* @var $steps Step[] */
$steps = $cept->getScenario()->getSteps();
$this->assertCount(0, $steps);
}
public function testMoveMouseOver()
{
$this->module->amOnPage('/form/click');
$this->module->moveMouseOver(null, 123, 88);
$this->module->clickWithLeftButton(null, 0, 0);
$this->module->see('click, offsetX: 123 - offsetY: 88');
$this->module->moveMouseOver(null, 10, 10);
$this->module->clickWithLeftButton(null, 0, 0);
$this->module->see('click, offsetX: 133 - offsetY: 98');
$this->module->moveMouseOver('#element2');
$this->module->clickWithLeftButton(null, 0, 0);
$this->module->see('click, offsetX: 58 - offsetY: 158');
$this->module->moveMouseOver('#element2', 0, 0);
$this->module->clickWithLeftButton(null, 0, 0);
$this->module->see('click, offsetX: 8 - offsetY: 108');
}
public function testLeftClick()
{
$this->module->amOnPage('/form/click');
$this->module->clickWithLeftButton(null, 123, 88);
$this->module->see('click, offsetX: 123 - offsetY: 88');
$this->module->clickWithLeftButton('body');
$this->module->see('click, offsetX: 600 - offsetY: 384');
$this->module->clickWithLeftButton('body', 50, 75);
$this->module->see('click, offsetX: 58 - offsetY: 83');
$this->module->clickWithLeftButton('body div');
$this->module->see('click, offsetX: 58 - offsetY: 58');
$this->module->clickWithLeftButton('#element2', 70, 75);
$this->module->see('click, offsetX: 78 - offsetY: 183');
}
public function testRightClick()
{
// actually not supported in phantomjs see https://github.com/ariya/phantomjs/issues/14005
$this->notForPhantomJS();
$this->module->amOnPage('/form/click');
$this->module->clickWithRightButton(null, 123, 88);
$this->module->see('context, offsetX: 123 - offsetY: 88');
$this->module->clickWithRightButton('body');
$this->module->see('context, offsetX: 600 - offsetY: 384');
$this->module->clickWithRightButton('body', 50, 75);
$this->module->see('context, offsetX: 58 - offsetY: 83');
$this->module->clickWithRightButton('body div');
$this->module->see('context, offsetX: 58 - offsetY: 58');
$this->module->clickWithRightButton('#element2', 70, 75);
$this->module->see('context, offsetX: 78 - offsetY: 183');
}
public function testBrowserTabs()
{
$this->notForPhantomJS();
$this->module->amOnPage('/form/example1');
$this->module->openNewTab();
$this->module->amOnPage('/form/example2');
$this->module->openNewTab();
$this->module->amOnPage('/form/example3');
$this->module->openNewTab();
$this->module->amOnPage('/form/example4');
$this->module->openNewTab();
$this->module->amOnPage('/form/example5');
$this->module->closeTab();
$this->module->seeInCurrentUrl('example4');
$this->module->switchToPreviousTab(2);
$this->module->seeInCurrentUrl('example2');
$this->module->switchToNextTab();
$this->module->seeInCurrentUrl('example3');
$this->module->closeTab();
$this->module->seeInCurrentUrl('example2');
$this->module->switchToNextTab(2);
$this->module->seeInCurrentUrl('example1');
}
public function testPerformOnWithArray()
{
$asserts = PHPUnit_Framework_Assert::getCount();
$this->module->amOnPage('/form/example1');
$this->module->performOn('.rememberMe', [
'see' => 'Remember me next time',
'seeElement' => '#LoginForm_rememberMe',
'dontSee' => 'Login'
]);
$this->assertEquals(3, PHPUnit_Framework_Assert::getCount() - $asserts);
$this->module->see('Login');
}
public function testPerformOnWithCallback()
{
$asserts = PHPUnit_Framework_Assert::getCount();
$this->module->amOnPage('/form/example1');
$this->module->performOn('.rememberMe', function (\Codeception\Module\WebDriver $I) {
$I->see('Remember me next time');
$I->seeElement('#LoginForm_rememberMe');
$I->dontSee('Login');
});
$this->assertEquals(3, PHPUnit_Framework_Assert::getCount() - $asserts);
$this->module->see('Login');
}
public function testPerformOnWithBuiltArray()
{
$asserts = PHPUnit_Framework_Assert::getCount();
$this->module->amOnPage('/form/example1');
$this->module->performOn('.rememberMe', \Codeception\Util\ActionSequence::build()
->see('Remember me next time')
->seeElement('#LoginForm_rememberMe')
->dontSee('Login')
);
$this->assertEquals(3, PHPUnit_Framework_Assert::getCount() - $asserts);
$this->module->see('Login');
}
public function testPerformOnWithArrayAndSimilarActions()
{
$asserts = PHPUnit_Framework_Assert::getCount();
$this->module->amOnPage('/form/example1');
$this->module->performOn('.rememberMe', \Codeception\Util\ActionSequence::build()
->see('Remember me')
->see('next time')
->dontSee('Login')
);
$this->assertEquals(3, PHPUnit_Framework_Assert::getCount() - $asserts);
$this->module->see('Login');
}
public function testPerformOnFail()
{
$this->shouldFail();
$this->module->amOnPage('/form/example1');
$this->module->performOn('.rememberMe', \Codeception\Util\ActionSequence::build()
->seeElement('#LoginForm_rememberMe')
->see('Remember me tomorrow')
);
}
public function testPerformOnFail2()
{
$this->shouldFail();
$this->module->amOnPage('/form/example1');
$this->module->performOn('.rememberMe', ['see' => 'Login']);
}
public function testSwitchToIframe()
{
$this->module->amOnPage('iframe');
$this->module->switchToIFrame('content');
$this->module->see('Lots of valuable data here');
$this->module->switchToIFrame();
$this->module->see('Iframe test');
}
public function testGrabPageSourceWhenNotOnPage()
{
$this->setExpectedException(
'\Codeception\Exception\ModuleException',
'Current url is blank, no page was opened'
);
$this->module->grabPageSource();
}
public function testGrabPageSourceWhenOnPage()
{
$this->module->amOnPage('/minimal');
$sourceExpected =
<<<HTML
<!DOCTYPE html>
<html>
<head>
<title>
Minimal page
</title>
</head>
<body>
<h1>
Minimal page
</h1>
</body>
</html>
HTML
;
$sourceActualRaw = $this->module->grabPageSource();
// `Selenium` adds the `xmlns` attribute while `PhantomJS` does not do that.
$sourceActual = str_replace('xmlns="http://www.w3.org/1999/xhtml"', '', $sourceActualRaw);
$this->assertXmlStringEqualsXmlString($sourceExpected, $sourceActual);
}
public function testChangingCapabilities()
{
$this->notForPhantomJS();
$this->assertNotTrue($this->module->webDriver->getCapabilities()->getCapability('acceptInsecureCerts'));
$this->module->_closeSession();
$this->module->_capabilities(function($current) {
$current['acceptInsecureCerts'] = true;
return new DesiredCapabilities($current);
});
$this->assertNotTrue($this->module->webDriver->getCapabilities()->getCapability('acceptInsecureCerts'));
$this->module->_initializeSession();
$this->assertTrue($this->module->webDriver->getCapabilities()->getCapability('acceptInsecureCerts'));
}
}