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;
+ }
+
+}