diff --git a/RoboFile.php b/RoboFile.php deleted file mode 100644 index 6335f8d..0000000 --- a/RoboFile.php +++ /dev/null @@ -1,28 +0,0 @@ - 

Module reference is taken from the source code. Help us to improve documentation. Edit module reference
'; - $documentationFile = 'documentation.md'; - $this->generateDocumentationForClass($className, $documentationFile, $sourceMessage); - } - - public function server() - { - $this->taskServer() - ->dir('tests/data/app') - ->run(); - } -} \ No newline at end of file diff --git a/composer.json b/composer.json index 3f67d7b..92bb736 100644 --- a/composer.json +++ b/composer.json @@ -19,13 +19,10 @@ "minimum-stability": "RC", "require": { - "php": ">=5.6.0 <8.0", + "php": ">=5.6.0 <9.0", "codeception/codeception": "^4.0", "php-webdriver/webdriver": "^1.6.0" }, - "require-dev": { - "codeception/util-robohelpers": "dev-master" - }, "suggest": { "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" }, diff --git a/documentation.md b/documentation.md deleted file mode 100644 index d4f84b7..0000000 --- a/documentation.md +++ /dev/null @@ -1,2160 +0,0 @@ -# WebDriver - - -New generation Selenium WebDriver module. - -## Local Testing - -### Selenium - -To run Selenium Server you need [Java](https://www.java.com/) as well as Chrome or Firefox browser installed. - -1. Download [Selenium Standalone Server](http://docs.seleniumhq.org/download/) -2. To use Chrome, install [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/getting-started). To use Firefox, install [GeckoDriver](https://github.com/mozilla/geckodriver). -3. Launch the Selenium Server: `java -jar selenium-server-standalone-3.xx.xxx.jar`. To locate Chromedriver binary use `-Dwebdriver.chrome.driver=./chromedriver` option. For Geckodriver use `-Dwebdriver.gecko.driver=./geckodriver`. -4. Configure this module (in `acceptance.suite.yml`) by setting `url` and `browser`: - -```yaml - modules: - enabled: - - WebDriver: - url: 'http://localhost/' - browser: chrome # 'chrome' or 'firefox' -``` - -Launch Selenium Server before executing tests. - -``` -java -jar "/path/to/selenium-server-standalone-xxx.jar" -``` - -### ChromeDriver - -To run tests in Chrome browser you may connect to ChromeDriver directly, without using Selenium Server. - -1. Install [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/getting-started). -2. Launch ChromeDriver: `chromedriver --url-base=/wd/hub` -3. Configure this module to use ChromeDriver port: - -```yaml - modules: - enabled: - - WebDriver: - url: 'http://localhost/' - window_size: false # disabled in ChromeDriver - port: 9515 - browser: chrome - capabilities: - "goog:chromeOptions": # additional chrome options -``` - -Additional [Chrome options](https://sites.google.com/a/chromium.org/chromedriver/capabilities) can be set in `goog:chromeOptions` capabilities. Note that Selenium 3.8 renamed this capability from `chromeOptions` to `goog:chromeOptions`. - - -### PhantomJS - -PhantomJS is a [headless browser](https://en.wikipedia.org/wiki/Headless_browser) alternative to Selenium Server that implements -[the WebDriver protocol](https://code.google.com/p/selenium/wiki/JsonWireProtocol). -It allows you to run Selenium tests on a server without a GUI installed. - -1. Download [PhantomJS](http://phantomjs.org/download.html) -2. Run PhantomJS in WebDriver mode: `phantomjs --webdriver=4444` -3. Configure this module (in `acceptance.suite.yml`) by setting url and `phantomjs` as browser: - -```yaml - modules: - enabled: - - WebDriver: - url: 'http://localhost/' - browser: phantomjs -``` - -Since PhantomJS doesn't give you any visual feedback, it's probably a good idea to install [Codeception\Extension\Recorder](http://codeception.com/extensions#CodeceptionExtensionRecorder) which gives you screenshots of how PhantomJS "sees" your pages. - -### Headless Selenium in Docker - -Docker can ship Selenium Server with all its dependencies and browsers inside a single container. -Running tests inside Docker is as easy as pulling [official selenium image](https://github.com/SeleniumHQ/docker-selenium) and starting a container with Chrome: - -``` -docker run --net=host selenium/standalone-chrome -``` - -By using `--net=host` we allow selenium to access local websites. - -## Cloud Testing - -Cloud Testing services can run your WebDriver tests in the cloud. -In case you want to test a local site or site behind a firewall -you should use a tunnel application provided by a service. - -### SauceLabs - -1. Create an account at [SauceLabs.com](http://SauceLabs.com) to get your username and access key -2. In the module configuration use the format `username`:`access_key`@ondemand.saucelabs.com' for `host` -3. Configure `platform` under `capabilities` to define the [Operating System](https://docs.saucelabs.com/reference/platforms-configurator/#/) -4. run a tunnel app if your site can't be accessed from Internet - -```yaml - modules: - enabled: - - WebDriver: - url: http://mysite.com - host: ':@ondemand.saucelabs.com' - port: 80 - browser: chrome - capabilities: - platform: 'Windows 10' -``` - -### BrowserStack - -1. Create an account at [BrowserStack](https://www.browserstack.com/) to get your username and access key -2. In the module configuration use the format `username`:`access_key`@hub.browserstack.com' for `host` -3. Configure `os` and `os_version` under `capabilities` to define the operating System -4. If your site is available only locally or via VPN you should use a tunnel app. In this case add `browserstack.local` capability and set it to true. - -```yaml - modules: - enabled: - - WebDriver: - url: http://mysite.com - host: ':@hub.browserstack.com' - port: 80 - browser: chrome - capabilities: - os: Windows - os_version: 10 - browserstack.local: true # for local testing -``` -### TestingBot - -1. Create an account at [TestingBot](https://testingbot.com/) to get your key and secret -2. In the module configuration use the format `key`:`secret`@hub.testingbot.com' for `host` -3. Configure `platform` under `capabilities` to define the [Operating System](https://testingbot.com/support/getting-started/browsers.html) -4. Run [TestingBot Tunnel](https://testingbot.com/support/other/tunnel) if your site can't be accessed from Internet - -```yaml - modules: - enabled: - - WebDriver: - url: http://mysite.com - host: ':@hub.testingbot.com' - port: 80 - browser: chrome - capabilities: - platform: Windows 10 -``` - -## Configuration - -* `url` *required* - Starting URL for your app. -* `browser` *required* - Browser to launch. -* `host` - Selenium server host (127.0.0.1 by default). -* `port` - Selenium server port (4444 by default). -* `restart` - Set to `false` (default) to use the same browser window for all tests, or set to `true` to create a new window for each test. In any case, when all tests are finished the browser window is closed. -* `start` - Autostart a browser for tests. Can be disabled if browser session is started with `_initializeSession` inside a Helper. -* `window_size` - Initial window size. Set to `maximize` or a dimension in the format `640x480`. -* `clear_cookies` - Set to false to keep cookies, or set to true (default) to delete all cookies between tests. -* `wait` (default: 0 seconds) - Whenever element is required and is not on page, wait for n seconds to find it before fail. -* `capabilities` - Sets Selenium [desired capabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). Should be a key-value array. -* `connection_timeout` - timeout for opening a connection to remote selenium server (30 seconds by default). -* `request_timeout` - timeout for a request to return something from remote selenium server (30 seconds by default). -* `pageload_timeout` - amount of time to wait for a page load to complete before throwing an error (default 0 seconds). -* `http_proxy` - sets http proxy server url for testing a remote server. -* `http_proxy_port` - sets http proxy server port -* `debug_log_entries` - how many selenium entries to print with `debugWebDriverLogs` or on fail (15 by default). -* `log_js_errors` - Set to true to include possible JavaScript to HTML report, or set to false (default) to deactivate. - -Example (`acceptance.suite.yml`) - -```yaml - modules: - enabled: - - WebDriver: - url: 'http://localhost/' - browser: firefox - window_size: 1024x768 - capabilities: - unexpectedAlertBehaviour: 'accept' - firefox_profile: '~/firefox-profiles/codeception-profile.zip.b64' -``` - -## Usage - -### Locating Elements - -Most methods in this module that operate on a DOM element (e.g. `click`) accept a locator as the first argument, -which can be either a string or an array. - -If the locator is an array, it should have a single element, -with the key signifying the locator type (`id`, `name`, `css`, `xpath`, `link`, or `class`) -and the value being the locator itself. -This is called a "strict" locator. -Examples: - -* `['id' => 'foo']` matches `
` -* `['name' => 'foo']` matches `
` -* `['css' => 'input[type=input][value=foo]']` matches `` -* `['xpath' => "//input[@type='submit'][contains(@value, 'foo')]"]` matches `` -* `['link' => 'Click here']` matches `Click here` -* `['class' => 'foo']` matches `
` - -Writing good locators can be tricky. -The Mozilla team has written an excellent guide titled [Writing reliable locators for Selenium and WebDriver tests](https://blog.mozilla.org/webqa/2013/09/26/writing-reliable-locators-for-selenium-and-webdriver-tests/). - -If you prefer, you may also pass a string for the locator. This is called a "fuzzy" locator. -In this case, Codeception uses a a variety of heuristics (depending on the exact method called) to determine what element you're referring to. -For example, here's the heuristic used for the `submitForm` method: - -1. Does the locator look like an ID selector (e.g. "#foo")? If so, try to find a form matching that ID. -2. If nothing found, check if locator looks like a CSS selector. If so, run it. -3. If nothing found, check if locator looks like an XPath expression. If so, run it. -4. Throw an `ElementNotFound` exception. - -Be warned that fuzzy locators can be significantly slower than strict locators. -Especially if you use Selenium WebDriver with `wait` (aka implicit wait) option. -In the example above if you set `wait` to 5 seconds and use XPath string as fuzzy locator, -`submitForm` method will wait for 5 seconds at each step. -That means 5 seconds finding the form by ID, another 5 seconds finding by CSS -until it finally tries to find the form by XPath). -If speed is a concern, it's recommended you stick with explicitly specifying the locator type via the array syntax. - -## Public Properties - -* `webDriver` - instance of `\Facebook\WebDriver\Remote\RemoteWebDriver`. Can be accessed from Helper classes for complex WebDriver interactions. - -```php -// inside Helper class -$this->getModule('WebDriver')->webDriver->getKeyboard()->sendKeys('hello, webdriver'); -``` - - -## Actions - -### _backupSession - -*hidden API method, expected to be used from Helper classes* - -Returns current WebDriver session for saving - - * `return` RemoteWebDriver - - -### _capabilities - -*hidden API method, expected to be used from Helper classes* - -Change capabilities of WebDriver. Should be executed before starting a new browser session. -This method expects a function to be passed which returns array or [WebDriver Desired Capabilities](https://github.com/php-webdriver/php-webdriver/blob/community/lib/Remote/DesiredCapabilities.php) object. -Additional [Chrome options](https://github.com/php-webdriver/php-webdriver/wiki/ChromeOptions) (like adding extensions) can be passed as well. - -```php -getModule('WebDriver')->_capabilities(function($currentCapabilities) { - // or new \Facebook\WebDriver\Remote\DesiredCapabilities(); - return \Facebook\WebDriver\Remote\DesiredCapabilities::firefox(); - }); -} -``` - -to make this work load `\Helper\Acceptance` before `WebDriver` in `acceptance.suite.yml`: - -```yaml -modules: - enabled: - - \Helper\Acceptance - - WebDriver -``` - -For instance, [**BrowserStack** cloud service](https://www.browserstack.com/automate/capabilities) may require a test name to be set in capabilities. -This is how it can be done via `_capabilities` method from `Helper\Acceptance`: - -```php -getMetadata()->getName(); - $this->getModule('WebDriver')->_capabilities(function($currentCapabilities) use ($name) { - $currentCapabilities['name'] = $name; - return $currentCapabilities; - }); -} -``` -In this case, please ensure that `\Helper\Acceptance` is loaded before WebDriver so new capabilities could be applied. - - * `param \Closure` $capabilityFunction - - -### _closeSession - -*hidden API method, expected to be used from Helper classes* - -Manually closes current WebDriver session. - -```php -getModule('WebDriver')->_closeSession(); - -// close a specific session -$webDriver = $this->getModule('WebDriver')->webDriver; -$this->getModule('WebDriver')->_closeSession($webDriver); -``` - - * `param` $webDriver (optional) a specific webdriver session instance - - -### _findClickable - -*hidden API method, expected to be used from Helper classes* - -Locates a clickable element. - -Use it in Helpers or GroupObject or Extension classes: - -```php -getModule('WebDriver'); -$page = $module->webDriver; - -// search a link or button on a page -$el = $module->_findClickable($page, 'Click Me'); - -// search a link or button within an element -$topBar = $module->_findElements('.top-bar')[0]; -$el = $module->_findClickable($topBar, 'Click Me'); - -``` - * `param RemoteWebDriver` $page WebDriver instance or an element to search within - * `param` $link a link text or locator to click - * `return` WebDriverElement - - -### _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: - -```php -getModule('WebDriver')->_findElements('.items'); -$els = $this->getModule('WebDriver')->_findElements(['name' => 'username']); - -$editLinks = $this->getModule('WebDriver')->_findElements(['link' => 'Edit']); -// now you can iterate over $editLinks and check that all them have valid hrefs -``` - -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 - - -### _getCurrentUri - -*hidden API method, expected to be used from Helper classes* - -Uri of currently opened page. - * `return` string -@throws ModuleException - - -### _getUrl - -*hidden API method, expected to be used from Helper classes* - -Returns URL of a host. - -@throws ModuleConfigException - - -### _initializeSession - -*hidden API method, expected to be used from Helper classes* - -Manually starts a new browser session. - -```php -getModule('WebDriver')->_initializeSession(); -``` - - - -### _loadSession - -*hidden API method, expected to be used from Helper classes* - -Loads current RemoteWebDriver instance as a session - - * `param RemoteWebDriver` $session - - -### _restart - -*hidden API method, expected to be used from Helper classes* - -Restarts a web browser. -Can be used with `_reconfigure` to open browser with different configuration - -```php -getModule('WebDriver')->_restart(); // just restart -$this->getModule('WebDriver')->_restart(['browser' => $browser]); // reconfigure + restart -``` - - * `param array` $config - - -### _savePageSource - -*hidden API method, expected to be used from Helper classes* - -Saves HTML source of a page to a file - * `param` $filename - - -### _saveScreenshot - -*hidden API method, expected to be used from Helper classes* - -Saves screenshot of current page to a file - -```php -$this->getModule('WebDriver')->_saveScreenshot(codecept_output_dir().'screenshot_1.png'); -``` - * `param` $filename - - -### acceptPopup - -Accepts the active JavaScript native popup window, as created by `window.alert`|`window.confirm`|`window.prompt`. -Don't confuse popups with modal windows, -as created by [various libraries](http://jster.net/category/windows-modals-popups). - - -### amOnPage - -Opens the page for the given relative URI. - -``` php -amOnPage('/'); -// opens /register page -$I->amOnPage('/register'); -``` - - * `param string` $page - - -### amOnSubdomain - -Changes the subdomain for the 'url' configuration parameter. -Does not open a page; use `amOnPage` for that. - -``` php -amOnSubdomain('user'); -$I->amOnPage('/'); -// moves to http://user.mysite.com/ -?> -``` - - * `param` $subdomain - - - -### amOnUrl - -Open web page at the given absolute URL and sets its hostname as the base host. - -``` php -amOnUrl('http://codeception.com'); -$I->amOnPage('/quickstart'); // moves to http://codeception.com/quickstart -?> -``` - - -### appendField - -Append the given text to the given element. -Can also add a selection to a select box. - -``` php -appendField('#mySelectbox', 'SelectValue'); -$I->appendField('#myTextField', 'appended'); -?> -``` - - * `param string` $field - * `param string` $value -@throws \Codeception\Exception\ElementNotFound - - -### attachFile - -Attaches a file relative to the Codeception `_data` directory to the given file upload field. - -``` php -attachFile('input[@type="file"]', 'prices.xls'); -?> -``` - - * `param` $field - * `param` $filename - - -### cancelPopup - -Dismisses the active JavaScript popup, as created by `window.alert`, `window.confirm`, or `window.prompt`. - - -### checkOption - -Ticks a checkbox. For radio buttons, use the `selectOption` method instead. - -``` php -checkOption('#agree'); -?> -``` - - * `param` $option - - -### clearField - -Clears given field which isn't empty. - -``` php -clearField('#username'); -``` - - * `param` $field - - -### 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. - -``` 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']); -?> -``` - - * `param` $link - * `param` $context - - -### clickWithLeftButton - -Performs click with the left mouse button on an element. -If the first parameter `null` then the offset is relative to the actual mouse position. -If the second and third parameters are given, -then the mouse is moved to an offset of the element's top-left corner. -Otherwise, the mouse is moved to the center of the element. - -``` php -clickWithLeftButton(['css' => '.checkout']); -$I->clickWithLeftButton(null, 20, 50); -$I->clickWithLeftButton(['css' => '.checkout'], 20, 50); -?> -``` - - * `param string` $cssOrXPath css or xpath of the web element (body by default). - * `param int` $offsetX - * `param int` $offsetY - -@throws \Codeception\Exception\ElementNotFound - - -### clickWithRightButton - -Performs contextual click with the right mouse button on an element. -If the first parameter `null` then the offset is relative to the actual mouse position. -If the second and third parameters are given, -then the mouse is moved to an offset of the element's top-left corner. -Otherwise, the mouse is moved to the center of the element. - -``` php -clickWithRightButton(['css' => '.checkout']); -$I->clickWithRightButton(null, 20, 50); -$I->clickWithRightButton(['css' => '.checkout'], 20, 50); -?> -``` - - * `param string` $cssOrXPath css or xpath of the web element (body by default). - * `param int` $offsetX - * `param int` $offsetY - -@throws \Codeception\Exception\ElementNotFound - - -### closeTab - -Closes current browser tab and switches to previous active tab. - -```php -closeTab(); -``` - -Can't be used with PhantomJS - - -### debugWebDriverLogs - -Print out latest Selenium Logs in debug mode - - * `param \Codeception\TestInterface` $test - - -### deleteSessionSnapshot - -Deletes session snapshot. - -See [saveSessionSnapshot](#saveSessionSnapshot) - - * `param` $name - - -### 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. - -```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 -``` - -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. - -``` 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. -?> -``` - - * `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. - -``` php -dontSeeCurrentUrlEquals('/'); -?> -``` - - * `param string` $uri - - -### dontSeeCurrentUrlMatches - -Checks that current url doesn't match the given regular expression. - -``` php -dontSeeCurrentUrlMatches('~^/users/(\d+)~'); -?> -``` - - * `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. - -``` php -dontSeeElement('.error'); -$I->dontSeeElement('//form/input[1]'); -$I->dontSeeElement('input', ['name' => 'login']); -$I->dontSeeElement('input', ['value' => '123456']); -?> -``` - - * `param` $selector - * `param array` $attributes - - -### dontSeeElementInDOM - -Opposite of `seeElementInDOM`. - - * `param` $selector - * `param array` $attributes - - -### dontSeeInCurrentUrl - -Checks that the current URI doesn't contain the given string. - -``` php -dontSeeInCurrentUrl('/users/'); -?> -``` - - * `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. - -``` 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'); -?> -``` - - * `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. - -``` php -dontSeeInFormFields('form[name=myform]', [ - 'input1' => 'non-existent value', - 'input2' => 'other non-existent value', -]); -?> -``` - -To check that an element hasn't been assigned any one of many values, an array can be passed -as the value: - -``` php -dontSeeInFormFields('.form-class', [ - 'fieldName' => [ - 'This value shouldn\'t be set', - 'And this value shouldn\'t be set', - ], -]); -?> -``` - -Additionally, checkbox values can be checked with a boolean. - -``` php -dontSeeInFormFields('#form-id', [ - 'checkbox1' => true, // fails if checked - 'checkbox2' => false, // fails if unchecked -]); -?> -``` - - * `param` $formSelector - * `param` $params - - -### dontSeeInPageSource - -Checks that the page source doesn't contain the given string. - - * `param` $text - - -### dontSeeInPopup - -Checks that the active JavaScript popup, -as created by `window.alert`|`window.confirm`|`window.prompt`, does NOT contain the given string. - - * `param` $text - -@throws \Codeception\Exception\ModuleException - - -### dontSeeInSource - -Checks that the current page contains the given string in its -raw source code. - -```php -dontSeeInSource('

Green eggs & ham

'); -``` - - * `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. - -``` php -dontSeeLink('Logout'); // I suppose user is not logged in -$I->dontSeeLink('Checkout now', '/store/cart.php'); -?> -``` - - * `param string` $text - * `param string` $url optional - - -### dontSeeOptionIsSelected - -Checks that the given option is not selected. - -``` php -dontSeeOptionIsSelected('#form input[name=payment]', 'Visa'); -?> -``` - - * `param` $selector - * `param` $optionText - - - -### doubleClick - -Performs a double-click on an element matched by CSS or XPath. - - * `param` $cssOrXPath -@throws \Codeception\Exception\ElementNotFound - - -### dragAndDrop - -Performs a simple mouse drag-and-drop operation. - -``` php -dragAndDrop('#drag', '#drop'); -?> -``` - - * `param string` $source (CSS ID or XPath) - * `param string` $target (CSS ID or XPath) - - -### executeAsyncJS - -Executes asynchronous JavaScript. -A callback should be executed by JavaScript to exit from a script. -Callback is passed as a last element in `arguments` array. -Additional arguments can be passed as array in second parameter. - -```js -// wait for 1200 milliseconds my running `setTimeout` -* $I->executeAsyncJS('setTimeout(arguments[0], 1200)'); - -$seconds = 1200; // or seconds are passed as argument -$I->executeAsyncJS('setTimeout(arguments[1], arguments[0])', [$seconds]); -``` - - * `param` $script - * `param array` $arguments - - -### executeInSelenium - -Low-level API method. -If Codeception commands are not enough, this allows you to use Selenium WebDriver methods directly: - -``` php -$I->executeInSelenium(function(\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) { - $webdriver->get('http://google.com'); -}); -``` - -This runs in the context of the -[RemoteWebDriver class](https://github.com/php-webdriver/php-webdriver/blob/master/lib/remote/RemoteWebDriver.php). -Try not to use this command on a regular basis. -If Codeception lacks a feature you need, please implement it and submit a patch. - - * `param callable` $function - - -### executeJS - -Executes custom JavaScript. - -This example uses jQuery to get a value and assigns that value to a PHP variable: - -```php -executeJS('return $("#myField").val()'); - -// additional arguments can be passed as array -// Example shows `Hello World` alert: -$I->executeJS("window.alert(arguments[0])", ['Hello world']); -``` - - * `param` $script - * `param array` $arguments - - -### fillField - -Fills a text field or textarea with the given string. - -``` php -fillField("//input[@type='text']", "Hello World!"); -$I->fillField(['name' => 'email'], 'jon@mail.com'); -?> -``` - - * `param` $field - * `param` $value - - -### grabAttributeFrom - -Grabs the value of the given attribute value from the given element. -Fails if element is not found. - -``` php -grabAttributeFrom('#tooltip', 'title'); -?> -``` - - * `param` $cssOrXpath - * `param` $attribute - - - -### grabCookie - -Grabs a cookie value. -You can set additional cookie params like `domain`, `path` in array passed as last argument. - - * `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. - -``` php -grabFromCurrentUrl('~^/user/(\d+)/~'); -$uri = $I->grabFromCurrentUrl(); -?> -``` - - * `param string` $uri optional - - - -### grabMultiple - -Grabs either the text content, or attribute values, of nodes -matched by $cssOrXpath and returns them as an array. - -```html -First -Second -Third -``` - -```php -grabMultiple('a'); - -// would return ['#first', '#second', '#third'] -$aLinks = $I->grabMultiple('a', 'href'); -?> -``` - - * `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. - - -### 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. - -``` php -grabTextFrom('h1'); -$heading = $I->grabTextFrom('descendant-or-self::h1'); -$value = $I->grabTextFrom('~ -``` - - * `param` $cssOrXPathOrRegex - - - -### grabValueFrom - -Finds the value for the given form field. -If a fuzzy locator is used, the field is found by field name, CSS, and XPath. - -``` php -grabValueFrom('Name'); -$name = $I->grabValueFrom('input[name=username]'); -$name = $I->grabValueFrom('descendant-or-self::form/descendant::input[@name = 'username']'); -$name = $I->grabValueFrom(['name' => 'username']); -?> -``` - - * `param` $field - - - -### loadSessionSnapshot - -Loads cookies from a saved snapshot. -Allows to reuse same session across tests without additional login. - -See [saveSessionSnapshot](#saveSessionSnapshot) - - * `param` $name - - -### 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. - -```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 -``` - - * `param null` $name - - -### makeScreenshot - -Takes a screenshot of the current window and saves it to `tests/_output/debug`. - -``` php -amOnPage('/user/edit'); -$I->makeScreenshot('edit_page'); -// saved to: tests/_output/debug/edit_page.png -$I->makeScreenshot(); -// saved to: tests/_output/debug/2017-05-26_14-24-11_4b3403665fea6.png -``` - - * `param` $name - - -### maximizeWindow - -Maximizes the current window. - - -### moveBack - -Moves back in history. - - -### moveForward - -Moves forward in history. - - -### moveMouseOver - -Move mouse over the first element matched by the given locator. -If the first parameter null then the page is used. -If the second and third parameters are given, -then the mouse is moved to an offset of the element's top-left corner. -Otherwise, the mouse is moved to the center of the element. - -``` php -moveMouseOver(['css' => '.checkout']); -$I->moveMouseOver(null, 20, 50); -$I->moveMouseOver(['css' => '.checkout'], 20, 50); -?> -``` - - * `param string` $cssOrXPath css or xpath of the web element - * `param int` $offsetX - * `param int` $offsetY - -@throws \Codeception\Exception\ElementNotFound - - -### openNewTab - -Opens a new browser tab (wherever it is possible) and switches to it. - -```php -openNewTab(); -``` -Tab is opened by using `window.open` javascript in a browser. -Please note, that adblock can restrict creating such tabs. - -Can't be used with PhantomJS - - - -### performOn - -Waits for element and runs a sequence of actions inside its context. -Actions can be defined with array, callback, or `Codeception\Util\ActionSequence` instance. - -Actions as array are recommended for simple to combine "waitForElement" with assertions; -`waitForElement($el)` and `see('text', $el)` can be simplified to: - -```php -performOn($el, ['see' => 'text']); -``` - -List of actions can be pragmatically build using `Codeception\Util\ActionSequence`: - -```php -performOn('.model', ActionSequence::build() - ->see('Warning') - ->see('Are you sure you want to delete this?') - ->click('Yes') -); -``` - -Actions executed from array or ActionSequence will print debug output for actions, and adds an action name to -exception on failure. - -Whenever you need to define more actions a callback can be used. A WebDriver module is passed for argument: - -```php -performOn('.rememberMe', function (WebDriver $I) { - $I->see('Remember me next time'); - $I->seeElement('#LoginForm_rememberMe'); - $I->dontSee('Login'); -}); -``` - -In 3rd argument you can set number a seconds to wait for element to appear - - * `param` $element - * `param` $actions - * `param int` $timeout - - -### pressKey - -Presses the given key on the given element. -To specify a character and modifier (e.g. ctrl, alt, shift, meta), pass an array for $char with -the modifier as the first element and the character as the second. -For special keys use key constants from WebDriverKeys class. - -``` php - -$I->pressKey('#page','a'); // => olda -$I->pressKey('#page',array('ctrl','a'),'new'); //=> new -$I->pressKey('#page',array('shift','111'),'1','x'); //=> old!!!1x -$I->pressKey('descendant-or-self::*[@id='page']','u'); //=> oldu -$I->pressKey('#name', array('ctrl', 'a'), \Facebook\WebDriver\WebDriverKeys::DELETE); //=>'' -?> -``` - - * `param` $element - * `param` $char string|array Can be char or array with modifier. You can provide several chars. -@throws \Codeception\Exception\ElementNotFound - - -### reloadPage - -Reloads the current page. - - -### 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 - - -### resizeWindow - -Resize the current window. - -``` php -resizeWindow(800, 600); - -``` - - * `param int` $width - * `param int` $height - - -### saveSessionSnapshot - -Saves current cookies into named snapshot in order to restore them in other tests -This is useful to save session state between tests. -For example, if user needs log in to site for each test this scenario can be executed once -while other tests can just restore saved cookies. - -``` php -loadSessionSnapshot('login')) return; - - // logging in - $I->amOnPage('/login'); - $I->fillField('name', 'jon'); - $I->fillField('password', '123345'); - $I->click('Login'); - - // saving snapshot - $I->saveSessionSnapshot('login'); -} -?> -``` - - * `param` $name - - -### scrollTo - -Move to the middle of the given element matched by the given locator. -Extra shift, calculated from the top-left corner of the element, -can be set by passing $offsetX and $offsetY parameters. - -``` php -scrollTo(['css' => '.checkout'], 20, 50); -?> -``` - - * `param` $selector - * `param int` $offsetX - * `param int` $offsetY - - -### 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. - -``` 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 -``` - -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. - -``` 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]'); -?> -``` - - * `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. - -``` php -seeCookie('PHPSESSID'); -?> -``` - - * `param` $cookie - * `param array` $params - - -### seeCurrentUrlEquals - -Checks that the current URL is equal to the given string. -Unlike `seeInCurrentUrl`, this only matches the full URL. - -``` php -seeCurrentUrlEquals('/'); -?> -``` - - * `param string` $uri - - -### seeCurrentUrlMatches - -Checks that the current URL matches the given regular expression. - -``` php -seeCurrentUrlMatches('~^/users/(\d+)~'); -?> -``` - - * `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. - -``` 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']); -?> -``` - - * `param` $selector - * `param array` $attributes -@return - - -### seeElementInDOM - -Checks that the given element exists on the page, even it is invisible. - -``` php -seeElementInDOM('//form/input[type=hidden]'); -?> -``` - - * `param` $selector - * `param array` $attributes - - -### seeInCurrentUrl - -Checks that current URI contains the given string. - -``` php -seeInCurrentUrl('home'); -// to match: /users/1 -$I->seeInCurrentUrl('/users/'); -?> -``` - - * `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. - -``` 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'); -?> -``` - - * `param` $field - * `param` $value - - -### seeInFormFields - -Checks if the array of form parameters (name => value) are set on the form matched with the -passed selector. - -``` php -seeInFormFields('form[name=myform]', [ - 'input1' => 'value', - 'input2' => 'other value', -]); -?> -``` - -For multi-select elements, or to check values of multiple elements with the same name, an -array may be passed: - -``` php -seeInFormFields('.form-class', [ - 'multiselect' => [ - 'value1', - 'value2', - ], - 'checkbox[]' => [ - 'a checked value', - 'another checked value', - ], -]); -?> -``` - -Additionally, checkbox values can be checked with a boolean. - -``` php -seeInFormFields('#form-id', [ - 'checkbox1' => true, // passes if checked - 'checkbox2' => false, // passes if unchecked -]); -?> -``` - -Pair this with submitForm for quick testing magic. - -``` 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); -?> -``` - - * `param` $formSelector - * `param` $params - - -### seeInPageSource - -Checks that the page source contains the given string. - -```php -seeInPageSource('seeInSource('

Green eggs & ham

'); -``` - - * `param` $raw - - -### seeInTitle - -Checks that the page title contains the given string. - -``` php -seeInTitle('Blog - Post #1'); -?> -``` - - * `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. - -``` php -seeLink('Logout'); // matches Logout -$I->seeLink('Logout','/logout'); // matches Logout -?> -``` - - * `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. - -``` php -seeNumberOfElements('tr', 10); -$I->seeNumberOfElements('tr', [0,10]); // between 0 and 10 elements -?> -``` - * `param` $selector - * `param mixed` $expected int or int[] - - -### seeNumberOfElementsInDOM -__not documented__ - - -### seeOptionIsSelected - -Checks that the given option is selected. - -``` php -seeOptionIsSelected('#form input[name=payment]', 'Visa'); -?> -``` - - * `param` $selector - * `param` $optionText - - - -### selectOption - -Selects an option in a select tag or in radio button group. - -``` php -selectOption('form select[name=account]', 'Premium'); -$I->selectOption('form input[name=payment]', 'Monthly'); -$I->selectOption('//form/select[@name=account]', 'Monthly'); -?> -``` - -Provide an array for the second argument to select multiple options: - -``` php -selectOption('Which OS do you use?', array('Windows','Linux')); -?> -``` - -Or provide an associative array for the second argument to specifically define which selection method should be used: - -``` 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' -?> -``` - - * `param` $select - * `param` $option - - -### 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. - -``` php -setCookie('PHPSESSID', 'el4ukv0kqbvoirg7nkp4dncpk3'); -?> -``` - - * `param` $name - * `param` $val - * `param array` $params - - - -### submitForm - -Submits the given form on the page, optionally with the given form -values. Give the form fields values as an array. Note that hidden fields -can't be accessed. - -Skipped fields will be filled by their values from the page. -You don't need to click the 'Submit' button afterwards. -This command itself triggers the request to form's action. - -You can optionally specify what 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: - -``` php -submitForm('#login', [ - 'login' => 'davert', - 'password' => '123456' -]); -// or -$I->submitForm('#login', [ - 'login' => 'davert', - 'password' => '123456' -], 'submitButtonName'); - -``` - -For example, given this sample "Sign Up" form: - -``` html -
- Login: -
- Password: -
- Do you agree to our terms? -
- Select pricing plan: - - -
-``` - -You could write the following to submit it: - -``` php -submitForm( - '#userForm', - [ - 'user[login]' => 'Davert', - 'user[password]' => '123456', - 'user[agree]' => true - ], - 'submitButton' -); -``` -Note that "2" will be the submitted value for the "plan" field, as it is -the selected option. - -Also note that this differs from PhpBrowser, in that -```'user' => [ 'login' => 'Davert' ]``` is not supported at the moment. -Named array keys *must* be included in the name as above. - -Pair this with seeInFormFields for quick testing magic. - -``` 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); -?> -``` - -Parameter values must be set to arrays for multiple input fields -of the same name, or multi-select combo boxes. For checkboxes, -either the string value can be used, or boolean values which will -be replaced by the checkbox's value in the DOM. - -``` 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', - ] -]); -?> -``` - -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: - -```php -$I->submitForm('#my-form', [ - 'field[]' => 'value', - 'field[]' => 'another value', // 'field[]' is already a defined key -]); -``` - -The solution is to pass an array value: - -```php -// this way both values are submitted -$I->submitForm('#my-form', [ - 'field' => [ - 'value', - 'another value', - ] -]); -``` - -The `$button` parameter can be either a string, an array or an instance -of Facebook\WebDriver\WebDriverBy. When it is a string, the -button will be found by its "name" attribute. If $button is an -array then it will be treated as a strict selector and a WebDriverBy -will be used verbatim. - -For example, given the following HTML: - -``` html - -``` - -`$button` could be any one of the following: - - 'submitButton' - - ['name' => 'submitButton'] - - WebDriverBy::name('submitButton') - - * `param` $selector - * `param` $params - * `param` $button - - -### switchToIFrame - -Switch to another frame on the page. - -Example: -``` html -