diff --git a/.gitignore b/.gitignore index 16cb7d6..b7b8b32 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea bin vendor +composer.lock diff --git a/Features/bootstrap/MainContext.php b/Features/bootstrap/MainContext.php new file mode 100644 index 0000000..10f8d84 --- /dev/null +++ b/Features/bootstrap/MainContext.php @@ -0,0 +1,55 @@ +page = $this->pageFactory->getPage($page); + $this->page->open(); + } + + /** + * @When I login with ':username' and ':password' + */ + public function login($username, $password) + { + $this->page->login($username, $password); + } + + /** + * @Then I should be on ':page' + */ + public function pageOpen($page) + { + $this->page = $this->pageFactory->getPage($page); + + if ( !$this->page->opened() ) { + throw new Exception($page . ' is not open!'); + } + } + + /** + * @Then I should see ':message' error message + */ + public function errorMessageVisible($message) + { + if ( $this->page->errorPane->getText() !== $message ) { + throw new Exception('Error message "' . $message . '" not visible!'); + }; + } + + /** + * @Given /^I wait for ([0-9]+) seconds$/ + */ + public function waitFor($seconds) + { + sleep($seconds); + } + +} diff --git a/Features/login.feature b/Features/login.feature new file mode 100644 index 0000000..0cdc467 --- /dev/null +++ b/Features/login.feature @@ -0,0 +1,17 @@ +Feature: Login + In order to use the website site + As a website user + I need to login successfully + + @javascript @login @failing-login + Scenario: Failing login due wrong password + Given I'm on 'Login Page' + When I login with 'username' and 'wrong password' + Then I should be on 'Login page' + And I should see 'Invalid username or password!' error message + + @javascript @login @successful-login + Scenario: Successful login of user + Given I'm on 'Login Page' + When I login with 'username' and 'password' + Then I should be on 'Account Page' diff --git a/Fixtures/account.html b/Fixtures/account.html new file mode 100755 index 0000000..b83c13c --- /dev/null +++ b/Fixtures/account.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + +
+
+

Caption Column 1

+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore + magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd + gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing + elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero + eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum + dolor sit amet. +
+
+

Caption Column 2

+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore + magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd + gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing + elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero + eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum + dolor sit amet. +
+
+ + \ No newline at end of file diff --git a/Fixtures/additional.css b/Fixtures/additional.css new file mode 100755 index 0000000..099d88d --- /dev/null +++ b/Fixtures/additional.css @@ -0,0 +1,7 @@ +.margin-top { + margin-top: 20px; +} + +.margin-bottom { + margin-bottom: 20px; +} \ No newline at end of file diff --git a/Fixtures/index.php b/Fixtures/index.php new file mode 100755 index 0000000..f197d0b --- /dev/null +++ b/Fixtures/index.php @@ -0,0 +1,63 @@ + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+
+ + +
+ +
+
+
+
+
+
+

Caption Column 1

+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et + dolore + magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd + gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur + sadipscing + elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At + vero + eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem + ipsum + dolor sit amet. +
+
+

Caption Column 2

+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et + dolore + magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd + gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur + sadipscing + elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At + vero + eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem + ipsum + dolor sit amet. +
+
+ + + \ No newline at end of file diff --git a/Fixtures/login.php b/Fixtures/login.php new file mode 100755 index 0000000..da0529e --- /dev/null +++ b/Fixtures/login.php @@ -0,0 +1,26 @@ + + * @link https://github.com/qa-tools/behat-example + */ + +if ( empty($_POST) ) { + header('Location: /?error'); + die(); +} + +if ( $_POST['username'] !== 'username' ) { + header('Location: /?error'); + die(); +} + +if ( $_POST['password'] !== 'password' ) { + header('Location: /?error'); + die(); +} + +header('Location: /account.html'); \ No newline at end of file diff --git a/README.md b/README.md index b388f9c..2c030de 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,25 @@ Install/update your vendors: $ curl http://getcomposer.org/installer | php $ php composer.phar install ``` + +## Configuration and Execution + +1. Installing dependencies via composer +2. Setting up a web-server, with PHP support, pointing to **./Fixtures** +3. In case the **Fixture** directory is not reachable via http://localhost change in **behat.yml** + * `base_url` for `MinkExtension` + * `base_url` for `BehatExtension` + ```yaml + Behat\MinkExtension: + default_session: selenium2 + javascript_session: selenium2 + base_url: 'http://localhost' + + selenium2: ~ + + QATools\BehatExtension: + qa_tools: + base_url: 'http://localhost' + ``` +4. Download lastest Selenium standalone server and run it +5. Execute `./bin/behat` \ No newline at end of file diff --git a/behat.yml b/behat.yml new file mode 100644 index 0000000..6bdb33a --- /dev/null +++ b/behat.yml @@ -0,0 +1,18 @@ +default: + suites: + standard: + paths: ['Features'] + contexts: [MainContext] + + extensions: + Behat\MinkExtension: + default_session: selenium2 + javascript_session: selenium2 + base_url: 'http://localhost' + + selenium2: ~ + + QATools\BehatExtension: + qa_tools: + base_url: 'http://localhost' + page_namespace_prefix: ['\QATools\Example\Pages'] \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..7a02944 --- /dev/null +++ b/composer.json @@ -0,0 +1,24 @@ +{ + "name": "qa-tools/behat-example", + "license": "BSD-3-Clause", + "require": { + "php": ">=5.3.1", + "behat/mink-selenium2-driver": "~1.2.0", + "behat/behat": "~3.0", + "behat/mink-extension": "~2.0", + "mindplay/annotations": "~1.2@dev", + "qa-tools/qa-tools": "dev-develop", + "qa-tools/behat-extension": "dev-develop" + }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/evangelion1204/behat-extension.git" + } + ], + "autoload-dev": { + "psr-0": { + "QATools\\Example": "./src" + } + } +} diff --git a/src/QATools/Example/Pages/AccountPage.php b/src/QATools/Example/Pages/AccountPage.php new file mode 100644 index 0000000..9fd921f --- /dev/null +++ b/src/QATools/Example/Pages/AccountPage.php @@ -0,0 +1,26 @@ + + * @link https://github.com/qa-tools/behat-example + */ + +namespace QATools\Example\Pages; + + +use QATools\QATools\HtmlElements\Element\Form; +use QATools\QATools\HtmlElements\TypifiedPage; + +/** + * Class LoginPage. + * + * @page-url('/account.html') + * @url-match-full('/account.html') + */ +class AccountPage extends TypifiedPage +{ + +} diff --git a/src/QATools/Example/Pages/LoginPage.php b/src/QATools/Example/Pages/LoginPage.php new file mode 100644 index 0000000..4d07e9d --- /dev/null +++ b/src/QATools/Example/Pages/LoginPage.php @@ -0,0 +1,65 @@ + + * @link https://github.com/qa-tools/behat-example + */ + +namespace QATools\Example\Pages; + + +use QATools\QATools\HtmlElements\Element\Form; +use QATools\QATools\HtmlElements\Element\TextBlock; +use QATools\QATools\HtmlElements\TypifiedPage; + +/** + * Class LoginPage. + * + * @page-url('/') + * @url-match-full('/') + */ +class LoginPage extends TypifiedPage +{ + + /** + * The login form. + * + * @var Form + * @find-by('id' => 'login-form') + */ + public $loginForm; + + /** + * The error label. + * + * @var TextBlock + * @find-by('css' => '.alert') + */ + public $errorPane; + + /** + * Does the login. + * + * @param string $username The username. + * @param string $password The password. + * @param string $success The success page. + * @param string $failure The failure page. + * + * @return static + */ + public function login($username, $password) + { + $this->loginForm->fill(array( + 'username' => $username, + 'password' => $password, + )); + + $this->loginForm->submit(); + + return $this; + } + +}