From f26783c20370573dd75400418a7d50e02556bd8a Mon Sep 17 00:00:00 2001 From: Gintautas Miselis Date: Wed, 30 Dec 2020 16:39:37 +0200 Subject: [PATCH] Replace ZF2 module with Laminas module --- RoboFile.php | 1 + _includes/modules.html | 4 +- composer.json | 4 +- docs/modules/Laminas.md | 1586 +++++++++++++++++++++++++++++++++++++++ docs/modules/ZF2.md | 1584 +------------------------------------- 5 files changed, 1592 insertions(+), 1587 deletions(-) create mode 100644 docs/modules/Laminas.md mode change 100644 => 120000 docs/modules/ZF2.md diff --git a/RoboFile.php b/RoboFile.php index b7b41df69..2bd6b9e8a 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -149,6 +149,7 @@ public function buildDocsModules() //Page of old module displays content of new module $this->taskFilesystemStack()->symlink('Mezzio.md', 'docs/modules/ZendExpressive.md')->run(); $this->taskFilesystemStack()->symlink('Laravel.md', 'docs/modules/Laravel5.md')->run(); + $this->taskFilesystemStack()->symlink('Laminas.md', 'docs/modules/ZF2.md')->run(); } private function postProcessModuleDocFile($documentationFile, $name, $source) diff --git a/_includes/modules.html b/_includes/modules.html index b62bfac43..064f069d6 100644 --- a/_includes/modules.html +++ b/_includes/modules.html @@ -7,6 +7,7 @@
  • Doctrine2
  • FTP
  • Filesystem
  • +
  • Laminas
  • Laravel
  • Lumen
  • Memcache
  • @@ -22,5 +23,4 @@
  • SOAP
  • Symfony
  • WebDriver
  • -
  • Yii2
  • -
  • ZF2
  • \ No newline at end of file +
  • Yii2
  • \ No newline at end of file diff --git a/composer.json b/composer.json index 8cdd301c8..94673a0b2 100644 --- a/composer.json +++ b/composer.json @@ -15,6 +15,7 @@ "codeception/module-doctrine2": "*", "codeception/module-filesystem": "*", "codeception/module-ftp": "*", + "codeception/module-laminas": "*", "codeception/module-laravel": "*", "codeception/module-lumen": "*", "codeception/module-memcache": "*", @@ -31,11 +32,10 @@ "codeception/module-symfony": "*", "codeception/module-webdriver": "*", "codeception/module-yii2": "*", - "codeception/module-zf2": "*", "codeception/util-robohelpers": "dev-master" }, "require-dev": { "symfony/event-dispatcher": "4.4.*", - "consolidation/robo": "^2.0" + "consolidation/robo": "^3.0.0-alpha3" } } diff --git a/docs/modules/Laminas.md b/docs/modules/Laminas.md new file mode 100644 index 000000000..e4c1fd733 --- /dev/null +++ b/docs/modules/Laminas.md @@ -0,0 +1,1586 @@ +--- +layout: doc +title: Laminas - Codeception - Documentation +--- + + + +
    Changelogsource3.12.51.8
    + +# Laminas +### Installation + +If you use Codeception installed using composer, install this module with the following command: + +{% highlight yaml %} +composer require --dev codeception/module-laminas + +{% endhighlight %} + +Alternatively, you can enable `Laminas` module in suite configuration file and run + +{% highlight yaml %} +codecept init upgrade4 + +{% endhighlight %} + +This module was bundled with Codeception 2 and 3, but since version 4 it is necessary to install it separately. +Some modules are bundled with PHAR files. +Warning. Using PHAR file and composer in the same project can cause unexpected errors. + +### Description + + + +This module allows you to run tests inside the Laminas Project. +Uses `tests/application.config.php` config file by default. + +Note: services part and Doctrine integration is not compatible with Laminas yet + +### Status + +* Maintainer: **Naktibalda** +* Stability: **stable** + +### Config + +* config: relative path to config file (default: `tests/application.config.php`) +* em_service: 'Doctrine\ORM\EntityManager' - use the stated EntityManager to pair with Doctrine Module. + +### Public Properties +* application - instance of `\Laminas\Mvc\ApplicationInterface` +* db - instance of `\Laminas\Db\Adapter\AdapterInterface` +* client - BrowserKit client + +### Parts + +* services - allows to use grabServiceFromContainer and addServiceToContainer with WebDriver or PhpBrowser modules. + +Usage example: + +{% highlight yaml %} + +actor: AcceptanceTester +modules: + enabled: + - Laminas: + part: services + - Doctrine2: + depends: Laminas + - WebDriver: + url: http://your-url.com + browser: phantomjs + +{% endhighlight %} + +### Actions + +#### _findElements + +*hidden API method, expected to be used from Helper classes* + +Locates element using available Codeception locator types: + +* XPath +* CSS +* Strict Locator + +Use it in Helpers or GroupObject or Extension classes: + +{% highlight php %} + +getModule('Laminas')->_findElements('.items'); +$els = $this->getModule('Laminas')->_findElements(['name' => 'username']); + +$editLinks = $this->getModule('Laminas')->_findElements(['link' => 'Edit']); +// now you can iterate over $editLinks and check that all them have valid hrefs + +{% endhighlight %} + +WebDriver module returns `Facebook\WebDriver\Remote\RemoteWebElement` instances +PhpBrowser and Framework modules return `Symfony\Component\DomCrawler\Crawler` instances + + * `param` $locator + * `return` array of interactive elements + + +#### _getResponseContent + +*hidden API method, expected to be used from Helper classes* + +Returns content of the last response +Use it in Helpers when you want to retrieve response of request performed by another module. + +{% highlight php %} + +assertStringContainsString($text, $this->getModule('Laminas')->_getResponseContent(), "response contains"); +} +?> + +{% endhighlight %} + + * `return` string +@throws ModuleException + + +#### _loadPage + +*hidden API method, expected to be used from Helper classes* + +Opens a page with arbitrary request parameters. +Useful for testing multi-step forms on a specific step. + +{% highlight php %} + +getModule('Laminas')->_loadPage('POST', '/checkout/step2', ['order' => $orderId]); +} +?> + +{% endhighlight %} + + * `param` $method + * `param` $uri + * `param array` $parameters + * `param array` $files + * `param array` $server + * `param null` $content + + +#### _request + +*hidden API method, expected to be used from Helper classes* + +Send custom request to a backend using method, uri, parameters, etc. +Use it in Helpers to create special request actions, like accessing API +Returns a string with response body. + +{% highlight php %} + +getModule('Laminas')->_request('POST', '/api/v1/users', ['name' => $name]); + $user = json_decode($userData); + return $user->id; +} +?> + +{% endhighlight %} +Does not load the response into the module so you can't interact with response page (click, fill forms). +To load arbitrary page for interaction, use `_loadPage` method. + + * `param` $method + * `param` $uri + * `param array` $parameters + * `param array` $files + * `param array` $server + * `param null` $content + * `return` mixed|Crawler +@throws ExternalUrlException +@see `_loadPage` + + +#### _savePageSource + +*hidden API method, expected to be used from Helper classes* + +Saves page source of to a file + +{% highlight php %} + +$this->getModule('Laminas')->_savePageSource(codecept_output_dir().'page.html'); + +{% endhighlight %} + * `param` $filename + + +#### addServiceToContainer + +Adds service to a Laminas container + + * `[Part]` services + + * `param string` $name + * `param object` $service + + * `return` void + + +#### amHttpAuthenticated + +Authenticates user for HTTP_AUTH + + * `param` $username + * `param` $password + + +#### amOnPage + +Opens the page for the given relative URI. + +{% highlight php %} + +amOnPage('/'); +// opens /register page +$I->amOnPage('/register'); + +{% endhighlight %} + + * `param string` $page + + +#### amOnRoute + +Opens web page using route name and parameters. +{% highlight php %} + +amOnRoute('posts.create'); +$I->amOnRoute('posts.show', array('id' => 34)); +?> + +{% endhighlight %} + + * `param string` $routeName + * `param array` $params + + * `return` void + + +#### attachFile + +Attaches a file relative to the Codeception `_data` directory to the given file upload field. + +{% highlight php %} + +attachFile('input[@type="file"]', 'prices.xls'); +?> + +{% endhighlight %} + + * `param` $field + * `param` $filename + + +#### checkOption + +Ticks a checkbox. For radio buttons, use the `selectOption` method instead. + +{% highlight php %} + +checkOption('#agree'); +?> + +{% endhighlight %} + + * `param` $option + + +#### click + +Perform a click on a link or a button, given by a locator. +If a fuzzy locator is given, the page will be searched for a button, link, or image matching the locator string. +For buttons, the "value" attribute, "name" attribute, and inner text are searched. +For links, the link text is searched. +For images, the "alt" attribute and inner text of any parent links are searched. + +The second parameter is a context (CSS or XPath locator) to narrow the search. + +Note that if the locator matches a button of type `submit`, the form will be submitted. + +{% highlight php %} + +click('Logout'); +// button of form +$I->click('Submit'); +// CSS button +$I->click('#form input[type=submit]'); +// XPath +$I->click('//form/*[@type="submit"]'); +// link in context +$I->click('Logout', '#nav'); +// using strict locator +$I->click(['link' => 'Login']); +?> + +{% endhighlight %} + + * `param` $link + * `param` $context + + +#### deleteHeader + +Deletes the header with the passed name. Subsequent requests +will not have the deleted header in its request. + +Example: +{% highlight php %} + +haveHttpHeader('X-Requested-With', 'Codeception'); +$I->amOnPage('test-headers.php'); +// ... +$I->deleteHeader('X-Requested-With'); +$I->amOnPage('some-other-page.php'); +?> + +{% endhighlight %} + + * `param string` $name the name of the header to delete. + + +#### dontSee + +Checks that the current page doesn't contain the text specified (case insensitive). +Give a locator as the second parameter to match a specific region. + +{% highlight php %} + +dontSee('Login'); // I can suppose user is already logged in +$I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page +$I->dontSee('Sign Up','//body/h1'); // with XPath +$I->dontSee('Sign Up', ['css' => 'body h1']); // with strict CSS locator + +{% endhighlight %} + +Note that the search is done after stripping all HTML tags from the body, +so `$I->dontSee('strong')` will fail on strings like: + + - `

    I am Stronger than thou

    ` + - `` + +But will ignore strings like: + + - `Home` + - `
    Home` + - `` + +For checking the raw source code, use `seeInSource()`. + + * `param string` $text + * `param array|string` $selector optional + + +#### dontSeeCheckboxIsChecked + +Check that the specified checkbox is unchecked. + +{% highlight php %} + +dontSeeCheckboxIsChecked('#agree'); // I suppose user didn't agree to terms +$I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user didn't check the first checkbox in form. +?> + +{% endhighlight %} + + * `param` $checkbox + + +#### dontSeeCookie + +Checks that there isn't a cookie with the given name. +You can set additional cookie params like `domain`, `path` as array passed in last argument. + + * `param` $cookie + + * `param array` $params + + +#### dontSeeCurrentUrlEquals + +Checks that the current URL doesn't equal the given string. +Unlike `dontSeeInCurrentUrl`, this only matches the full URL. + +{% highlight php %} + +dontSeeCurrentUrlEquals('/'); +?> + +{% endhighlight %} + + * `param string` $uri + + +#### dontSeeCurrentUrlMatches + +Checks that current url doesn't match the given regular expression. + +{% highlight php %} + +dontSeeCurrentUrlMatches('~^/users/(\d+)~'); +?> + +{% endhighlight %} + + * `param string` $uri + + +#### dontSeeElement + +Checks that the given element is invisible or not present on the page. +You can also specify expected attributes of this element. + +{% highlight php %} + +dontSeeElement('.error'); +$I->dontSeeElement('//form/input[1]'); +$I->dontSeeElement('input', ['name' => 'login']); +$I->dontSeeElement('input', ['value' => '123456']); +?> + +{% endhighlight %} + + * `param` $selector + * `param array` $attributes + + +#### dontSeeInCurrentUrl + +Checks that the current URI doesn't contain the given string. + +{% highlight php %} + +dontSeeInCurrentUrl('/users/'); +?> + +{% endhighlight %} + + * `param string` $uri + + +#### dontSeeInField + +Checks that an input field or textarea doesn't contain the given value. +For fuzzy locators, the field is matched by label text, CSS and XPath. + +{% highlight php %} + +dontSeeInField('Body','Type your comment here'); +$I->dontSeeInField('form textarea[name=body]','Type your comment here'); +$I->dontSeeInField('form input[type=hidden]','hidden_value'); +$I->dontSeeInField('#searchform input','Search'); +$I->dontSeeInField('//form/*[@name=search]','Search'); +$I->dontSeeInField(['name' => 'search'], 'Search'); +?> + +{% endhighlight %} + + * `param` $field + * `param` $value + + +#### dontSeeInFormFields + +Checks if the array of form parameters (name => value) are not set on the form matched with +the passed selector. + +{% highlight php %} + +dontSeeInFormFields('form[name=myform]', [ + 'input1' => 'non-existent value', + 'input2' => 'other non-existent value', +]); +?> + +{% endhighlight %} + +To check that an element hasn't been assigned any one of many values, an array can be passed +as the value: + +{% highlight php %} + +dontSeeInFormFields('.form-class', [ + 'fieldName' => [ + 'This value shouldn\'t be set', + 'And this value shouldn\'t be set', + ], +]); +?> + +{% endhighlight %} + +Additionally, checkbox values can be checked with a boolean. + +{% highlight php %} + +dontSeeInFormFields('#form-id', [ + 'checkbox1' => true, // fails if checked + 'checkbox2' => false, // fails if unchecked +]); +?> + +{% endhighlight %} + + * `param` $formSelector + * `param` $params + + +#### dontSeeInSource + +Checks that the current page contains the given string in its +raw source code. + +{% highlight php %} + +dontSeeInSource('

    Green eggs & ham

    '); + +{% endhighlight %} + + * `param` $raw + + +#### dontSeeInTitle + +Checks that the page title does not contain the given string. + + * `param` $title + + + +#### dontSeeLink + +Checks that the page doesn't contain a link with the given string. +If the second parameter is given, only links with a matching "href" attribute will be checked. + +{% highlight php %} + +dontSeeLink('Logout'); // I suppose user is not logged in +$I->dontSeeLink('Checkout now', '/store/cart.php'); +?> + +{% endhighlight %} + + * `param string` $text + * `param string` $url optional + + +#### dontSeeOptionIsSelected + +Checks that the given option is not selected. + +{% highlight php %} + +dontSeeOptionIsSelected('#form input[name=payment]', 'Visa'); +?> + +{% endhighlight %} + + * `param` $selector + * `param` $optionText + + + +#### dontSeeResponseCodeIs + +Checks that response code is equal to value provided. + +{% highlight php %} + +dontSeeResponseCodeIs(200); + +// recommended \Codeception\Util\HttpCode +$I->dontSeeResponseCodeIs(\Codeception\Util\HttpCode::OK); + +{% endhighlight %} + * `param` $code + + +#### fillField + +Fills a text field or textarea with the given string. + +{% highlight php %} + +fillField("//input[@type='text']", "Hello World!"); +$I->fillField(['name' => 'email'], 'jon@mail.com'); +?> + +{% endhighlight %} + + * `param` $field + * `param` $value + + +#### grabAttributeFrom + +Grabs the value of the given attribute value from the given element. +Fails if element is not found. + +{% highlight php %} + +grabAttributeFrom('#tooltip', 'title'); +?> + +{% endhighlight %} + + * `param` $cssOrXpath + * `param` $attribute + + + +#### grabCookie + +Grabs a cookie value. +You can set additional cookie params like `domain`, `path` in array passed as last argument. +If the cookie is set by an ajax request (XMLHttpRequest), there might be some delay caused by the browser, so try `$I->wait(0.1)`. + + * `param` $cookie + + * `param array` $params + + +#### grabFromCurrentUrl + +Executes the given regular expression against the current URI and returns the first capturing group. +If no parameters are provided, the full URI is returned. + +{% highlight php %} + +grabFromCurrentUrl('~^/user/(\d+)/~'); +$uri = $I->grabFromCurrentUrl(); +?> + +{% endhighlight %} + + * `param string` $uri optional + + + +#### grabMultiple + +Grabs either the text content, or attribute values, of nodes +matched by $cssOrXpath and returns them as an array. + +{% highlight html %} + +First +Second +Third + +{% endhighlight %} + +{% highlight php %} + +grabMultiple('a'); + +// would return ['#first', '#second', '#third'] +$aLinks = $I->grabMultiple('a', 'href'); +?> + +{% endhighlight %} + + * `param` $cssOrXpath + * `param` $attribute + * `return` string[] + + +#### grabPageSource + +Grabs current page source code. + +@throws ModuleException if no page was opened. + + * `return` string Current page source code. + + +#### grabServiceFromContainer + +Grabs a service from a Laminas container. +Recommended to use for unit testing. +{% highlight php %} + +grabServiceFromContainer('Doctrine\ORM\EntityManager'); +?> + +{% endhighlight %} + * `[Part]` services + + * `param string` $service + + + +#### grabTextFrom + +Finds and returns the text contents of the given element. +If a fuzzy locator is used, the element is found using CSS, XPath, +and by matching the full page source by regular expression. + +{% highlight php %} + +grabTextFrom('h1'); +$heading = $I->grabTextFrom('descendant-or-self::h1'); +$value = $I->grabTextFrom('~ + +{% endhighlight %} + + * `param` $cssOrXPathOrRegex + + + +#### grabValueFrom + + * `param` $field + + * `return` array|mixed|null|string + + +#### haveHttpHeader + +Sets the HTTP header to the passed value - which is used on +subsequent HTTP requests through PhpBrowser. + +Example: +{% highlight php %} + +haveHttpHeader('X-Requested-With', 'Codeception'); +$I->amOnPage('test-headers.php'); +?> + +{% endhighlight %} + +To use special chars in Header Key use HTML Character Entities: +Example: +Header with underscore - 'Client_Id' +should be represented as - 'Client_Id' or 'Client_Id' + +{% highlight php %} + +haveHttpHeader('Client_Id', 'Codeception'); +?> + +{% endhighlight %} + + * `param string` $name the name of the request header + * `param string` $value the value to set it to for subsequent + requests + + +#### haveServerParameter + +Sets SERVER parameter valid for all next requests. + +{% highlight php %} + +$I->haveServerParameter('name', 'value'); + +{% endhighlight %} + * `param` $name + * `param` $value + + +#### makeHtmlSnapshot + +Saves current page's HTML into a temprary file. +Use this method in debug mode within an interactive pause to get a source code of current page. + +{% highlight php %} + +makeHtmlSnapshot('edit_page'); +// saved to: tests/_output/debug/edit_page.html +$I->makeHtmlSnapshot(); +// saved to: tests/_output/debug/2017-05-26_14-24-11_4b3403665fea6.html + +{% endhighlight %} + + * `param null` $name + + +#### moveBack + +Moves back in history. + + * `param int` $numberOfSteps (default value 1) + + +#### resetCookie + +Unsets cookie with the given name. +You can set additional cookie params like `domain`, `path` in array passed as last argument. + + * `param` $cookie + + * `param array` $params + + +#### see + +Checks that the current page contains the given string (case insensitive). + +You can specify a specific HTML element (via CSS or XPath) as the second +parameter to only search within that element. + +{% highlight php %} + +see('Logout'); // I can suppose user is logged in +$I->see('Sign Up', 'h1'); // I can suppose it's a signup page +$I->see('Sign Up', '//body/h1'); // with XPath +$I->see('Sign Up', ['css' => 'body h1']); // with strict CSS locator + +{% endhighlight %} + +Note that the search is done after stripping all HTML tags from the body, +so `$I->see('strong')` will return true for strings like: + + - `

    I am Stronger than thou

    ` + - `` + +But will *not* be true for strings like: + + - `Home` + - `
    Home` + - `` + +For checking the raw source code, use `seeInSource()`. + + * `param string` $text + * `param array|string` $selector optional + + +#### seeCheckboxIsChecked + +Checks that the specified checkbox is checked. + +{% highlight php %} + +seeCheckboxIsChecked('#agree'); // I suppose user agreed to terms +$I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user agreed to terms, If there is only one checkbox in form. +$I->seeCheckboxIsChecked('//form/input[@type=checkbox and @name=agree]'); +?> + +{% endhighlight %} + + * `param` $checkbox + + +#### seeCookie + +Checks that a cookie with the given name is set. +You can set additional cookie params like `domain`, `path` as array passed in last argument. + +{% highlight php %} + +seeCookie('PHPSESSID'); +?> + +{% endhighlight %} + + * `param` $cookie + * `param array` $params + + +#### seeCurrentRouteIs + +Checks that current url matches route. +{% highlight php %} + +seeCurrentRouteIs('posts.index'); +$I->seeCurrentRouteIs('posts.show', ['id' => 8])); +?> + +{% endhighlight %} + + * `param string` $routeName + * `param array` $params + + * `return` void + + +#### seeCurrentUrlEquals + +Checks that the current URL is equal to the given string. +Unlike `seeInCurrentUrl`, this only matches the full URL. + +{% highlight php %} + +seeCurrentUrlEquals('/'); +?> + +{% endhighlight %} + + * `param string` $uri + + +#### seeCurrentUrlMatches + +Checks that the current URL matches the given regular expression. + +{% highlight php %} + +seeCurrentUrlMatches('~^/users/(\d+)~'); +?> + +{% endhighlight %} + + * `param string` $uri + + +#### seeElement + +Checks that the given element exists on the page and is visible. +You can also specify expected attributes of this element. + +{% highlight php %} + +seeElement('.error'); +$I->seeElement('//form/input[1]'); +$I->seeElement('input', ['name' => 'login']); +$I->seeElement('input', ['value' => '123456']); + +// strict locator in first arg, attributes in second +$I->seeElement(['css' => 'form input'], ['name' => 'login']); +?> + +{% endhighlight %} + + * `param` $selector + * `param array` $attributes +@return + + +#### seeInCurrentUrl + +Checks that current URI contains the given string. + +{% highlight php %} + +seeInCurrentUrl('home'); +// to match: /users/1 +$I->seeInCurrentUrl('/users/'); +?> + +{% endhighlight %} + + * `param string` $uri + + +#### seeInField + +Checks that the given input field or textarea *equals* (i.e. not just contains) the given value. +Fields are matched by label text, the "name" attribute, CSS, or XPath. + +{% highlight php %} + +seeInField('Body','Type your comment here'); +$I->seeInField('form textarea[name=body]','Type your comment here'); +$I->seeInField('form input[type=hidden]','hidden_value'); +$I->seeInField('#searchform input','Search'); +$I->seeInField('//form/*[@name=search]','Search'); +$I->seeInField(['name' => 'search'], 'Search'); +?> + +{% endhighlight %} + + * `param` $field + * `param` $value + + +#### seeInFormFields + +Checks if the array of form parameters (name => value) are set on the form matched with the +passed selector. + +{% highlight php %} + +seeInFormFields('form[name=myform]', [ + 'input1' => 'value', + 'input2' => 'other value', +]); +?> + +{% endhighlight %} + +For multi-select elements, or to check values of multiple elements with the same name, an +array may be passed: + +{% highlight php %} + +seeInFormFields('.form-class', [ + 'multiselect' => [ + 'value1', + 'value2', + ], + 'checkbox[]' => [ + 'a checked value', + 'another checked value', + ], +]); +?> + +{% endhighlight %} + +Additionally, checkbox values can be checked with a boolean. + +{% highlight php %} + +seeInFormFields('#form-id', [ + 'checkbox1' => true, // passes if checked + 'checkbox2' => false, // passes if unchecked +]); +?> + +{% endhighlight %} + +Pair this with submitForm for quick testing magic. + +{% highlight php %} + + 'value', + 'field2' => 'another value', + 'checkbox1' => true, + // ... +]; +$I->submitForm('//form[@id=my-form]', $form, 'submitButton'); +// $I->amOnPage('/path/to/form-page') may be needed +$I->seeInFormFields('//form[@id=my-form]', $form); +?> + +{% endhighlight %} + + * `param` $formSelector + * `param` $params + + +#### seeInSource + +Checks that the current page contains the given string in its +raw source code. + +{% highlight php %} + +seeInSource('

    Green eggs & ham

    '); + +{% endhighlight %} + + * `param` $raw + + +#### seeInTitle + +Checks that the page title contains the given string. + +{% highlight php %} + +seeInTitle('Blog - Post #1'); +?> + +{% endhighlight %} + + * `param` $title + + + +#### seeLink + +Checks that there's a link with the specified text. +Give a full URL as the second parameter to match links with that exact URL. + +{% highlight php %} + +seeLink('Logout'); // matches Logout +$I->seeLink('Logout','/logout'); // matches Logout +?> + +{% endhighlight %} + + * `param string` $text + * `param string` $url optional + + +#### seeNumberOfElements + +Checks that there are a certain number of elements matched by the given locator on the page. + +{% highlight php %} + +seeNumberOfElements('tr', 10); +$I->seeNumberOfElements('tr', [0,10]); // between 0 and 10 elements +?> + +{% endhighlight %} + * `param` $selector + * `param mixed` $expected int or int[] + + +#### seeOptionIsSelected + +Checks that the given option is selected. + +{% highlight php %} + +seeOptionIsSelected('#form input[name=payment]', 'Visa'); +?> + +{% endhighlight %} + + * `param` $selector + * `param` $optionText + + + +#### seePageNotFound + +Asserts that current page has 404 response status code. + + +#### seeResponseCodeIs + +Checks that response code is equal to value provided. + +{% highlight php %} + +seeResponseCodeIs(200); + +// recommended \Codeception\Util\HttpCode +$I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); + +{% endhighlight %} + + * `param` $code + + +#### seeResponseCodeIsBetween + +Checks that response code is between a certain range. Between actually means [from <= CODE <= to] + + * `param` $from + * `param` $to + + +#### seeResponseCodeIsClientError + +Checks that the response code is 4xx + + +#### seeResponseCodeIsRedirection + +Checks that the response code 3xx + + +#### seeResponseCodeIsServerError + +Checks that the response code is 5xx + + +#### seeResponseCodeIsSuccessful + +Checks that the response code 2xx + + +#### selectOption + +Selects an option in a select tag or in radio button group. + +{% highlight php %} + +selectOption('form select[name=account]', 'Premium'); +$I->selectOption('form input[name=payment]', 'Monthly'); +$I->selectOption('//form/select[@name=account]', 'Monthly'); +?> + +{% endhighlight %} + +Provide an array for the second argument to select multiple options: + +{% highlight php %} + +selectOption('Which OS do you use?', array('Windows','Linux')); +?> + +{% endhighlight %} + +Or provide an associative array for the second argument to specifically define which selection method should be used: + +{% highlight php %} + +selectOption('Which OS do you use?', array('text' => 'Windows')); // Only search by text 'Windows' +$I->selectOption('Which OS do you use?', array('value' => 'windows')); // Only search by value 'windows' +?> + +{% endhighlight %} + + * `param` $select + * `param` $option + + +#### sendAjaxGetRequest + +Sends an ajax GET request with the passed parameters. +See `sendAjaxPostRequest()` + + * `param` $uri + * `param` $params + + +#### sendAjaxPostRequest + +Sends an ajax POST request with the passed parameters. +The appropriate HTTP header is added automatically: +`X-Requested-With: XMLHttpRequest` +Example: +{% highlight php %} + +sendAjaxPostRequest('/add-task', ['task' => 'lorem ipsum']); + +{% endhighlight %} +Some frameworks (e.g. Symfony) create field names in the form of an "array": +`` +In this case you need to pass the fields like this: +{% highlight php %} + +sendAjaxPostRequest('/add-task', ['form' => [ + 'task' => 'lorem ipsum', + 'category' => 'miscellaneous', +]]); + +{% endhighlight %} + + * `param string` $uri + * `param array` $params + + +#### sendAjaxRequest + +Sends an ajax request, using the passed HTTP method. +See `sendAjaxPostRequest()` +Example: +{% highlight php %} + +sendAjaxRequest('PUT', '/posts/7', ['title' => 'new title']); + +{% endhighlight %} + + * `param` $method + * `param` $uri + * `param` $params + + +#### setCookie + +Sets a cookie with the given name and value. +You can set additional cookie params like `domain`, `path`, `expires`, `secure` in array passed as last argument. + +{% highlight php %} + +setCookie('PHPSESSID', 'el4ukv0kqbvoirg7nkp4dncpk3'); +?> + +{% endhighlight %} + + * `param` $name + * `param` $val + * `param array` $params + + + +#### setServerParameters + +Sets SERVER parameters valid for all next requests. +this will remove old ones. + +{% highlight php %} + +$I->setServerParameters([]); + +{% endhighlight %} + * `param array` $params + + +#### submitForm + +Submits the given form on the page, with the given form +values. Pass the form field's values as an array in the second +parameter. + +Although this function can be used as a short-hand version of +`fillField()`, `selectOption()`, `click()` etc. it has some important +differences: + + * Only field *names* may be used, not CSS/XPath selectors nor field labels + * If a field is sent to this function that does *not* exist on the page, + it will silently be added to the HTTP request. This is helpful for testing + some types of forms, but be aware that you will *not* get an exception + like you would if you called `fillField()` or `selectOption()` with + a missing field. + +Fields that are not provided will be filled by their values from the page, +or from any previous calls to `fillField()`, `selectOption()` etc. +You don't need to click the 'Submit' button afterwards. +This command itself triggers the request to form's action. + +You can optionally specify which button's value to include +in the request with the last parameter (as an alternative to +explicitly setting its value in the second parameter), as +button values are not otherwise included in the request. + +Examples: + +{% highlight php %} + +submitForm('#login', [ + 'login' => 'davert', + 'password' => '123456' +]); +// or +$I->submitForm('#login', [ + 'login' => 'davert', + 'password' => '123456' +], 'submitButtonName'); + + +{% endhighlight %} + +For example, given this sample "Sign Up" form: + +{% highlight html %} + +
    + Login: +
    + Password: +
    + Do you agree to our terms? +
    + Select pricing plan: + + +
    + +{% endhighlight %} + +You could write the following to submit it: + +{% highlight php %} + +submitForm( + '#userForm', + [ + 'user' => [ + 'login' => 'Davert', + 'password' => '123456', + 'agree' => true + ] + ], + 'submitButton' +); + +{% endhighlight %} +Note that "2" will be the submitted value for the "plan" field, as it is +the selected option. + +You can also emulate a JavaScript submission by not specifying any +buttons in the third parameter to submitForm. + +{% highlight php %} + +submitForm( + '#userForm', + [ + 'user' => [ + 'login' => 'Davert', + 'password' => '123456', + 'agree' => true + ] + ] +); + +{% endhighlight %} + +This function works well when paired with `seeInFormFields()` +for quickly testing CRUD interfaces and form validation logic. + +{% highlight php %} + + 'value', + 'field2' => 'another value', + 'checkbox1' => true, + // ... +]; +$I->submitForm('#my-form', $form, 'submitButton'); +// $I->amOnPage('/path/to/form-page') may be needed +$I->seeInFormFields('#my-form', $form); + +{% endhighlight %} + +Parameter values can be set to arrays for multiple input fields +of the same name, or multi-select combo boxes. For checkboxes, +you can use either the string value or boolean `true`/`false` which will +be replaced by the checkbox's value in the DOM. + +{% highlight php %} + +submitForm('#my-form', [ + 'field1' => 'value', + 'checkbox' => [ + 'value of first checkbox', + 'value of second checkbox', + ], + 'otherCheckboxes' => [ + true, + false, + false + ], + 'multiselect' => [ + 'first option value', + 'second option value' + ] +]); + +{% endhighlight %} + +Mixing string and boolean values for a checkbox's value is not supported +and may produce unexpected results. + +Field names ending in `[]` must be passed without the trailing square +bracket characters, and must contain an array for its value. This allows +submitting multiple values with the same name, consider: + +{% highlight php %} + +submitForm('#my-form', [ + 'field[]' => 'value', + 'field[]' => 'another value', // 'field[]' is already a defined key +]); + +{% endhighlight %} + +The solution is to pass an array value: + +{% highlight php %} + +submitForm('#my-form', [ + 'field' => [ + 'value', + 'another value', + ] +]); + +{% endhighlight %} + + * `param` $selector + * `param` $params + * `param` $button + + +#### switchToIframe + +Switch to iframe or frame on the page. + +Example: +{% highlight html %} + +