Archive | Mink RSS feed for this section

Enjoy ‘MinkExtension’ for Behat

7 May

Note : This post may not work with recent Behat. Please use and my  Github repo for to get it working without any issue

MinkExtension‘ has been just released which has additional services for Behat. This extension has ‘Mink’ instance for your ‘FeatureContext’ and ‘SubContext’. UI testers would be happy now, as they don’t need to create Mink instance every time in order to use Mink API’s.

Well, in order to use ‘MinkExtension’ you need latest Behat and Mink versions (Behat 2.4+ and Mink 1.4+). Don’t worry so much about the versions,  creator of Behat has taken care of all this with composer.

Ok. Let’s clone the MinkExtenion-Example repository from GitHub. See, everything is mentioned in README file.

git clone
Cloning into MinkExtension-example...
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 31 (delta 13), reused 31 (delta 13)
Receiving objects: 100% (31/31), 4.43 KiB, done.
Resolving deltas: 100% (13/13), done.

Navigate to directory & Get the composer and Install dependencies

cd MinkExtension-example
curl | php
moonstar:MinkExtension-example sjagtap$ curl | php
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100  7438  100  7438    0     0  52386      0 --:--:-- --:--:-- --:--:--  105k
#!/usr/bin/env php
All settings correct for using Composer

Composer successfully installed to: /Users/sjagtap/MinkExtension-example/composer.phar
Use it: php composer.phar

Install Dependencies

php composer.phar install
oonstar:MinkExtensionTest sjagtap$ php composer.phar install
Installing dependencies
- Package symfony/yaml (dev-master)
Cloning 48fcffece8de2ade6f6dbc909f22444356b7659f

- Package symfony/translation (dev-master)
Cloning 34b64346b24024d54f42877b7c34ccc05ff1eaa8

- Package symfony/event-dispatcher (dev-master)
Cloning 0c1ae4898196f5e96b79028d8d2f35de4b584659

- Package symfony/dependency-injection (dev-master)
Cloning b01877ddbde08c1eded2502a6fdce8dbde89bd35

- Package symfony/config (dev-master)
Cloning 2f2fb45da8100bc03d2d9cbcd75e3ff36e325b89

- Package symfony/finder (2.0.x-dev)
Cloning v2.0.13

- Package symfony/css-selector (2.0.x-dev)
Cloning v2.0.12

- Package symfony/dom-crawler (2.0.x-dev)
Cloning v2.0.13

- Package symfony/browser-kit (2.0.x-dev)
Cloning v2.0.12

- Package symfony/process (dev-master)
Cloning 1bc1398d51180fd2aeded9c44f4d7b73bea817cd

- Package symfony/console (dev-master)
Cloning 8d58af16c425977018293eb0a1570c9629b37994

- Package behat/gherkin (2.2.x-dev)
Cloning ada4bda5823ffe1df8228e9dddefa38d6420f983

- Package zendframework/zend-registry (2.0.0beta3)
Downloading: 100%

- Package zendframework/zend-loader (2.0.0beta3)
Downloading: 100%

- Package zendframework/zend-stdlib (2.0.0beta3)
Downloading: 100%

- Package zendframework/zend-validator (2.0.0beta3)
Downloading: 100%

- Package zendframework/zend-http (2.0.0beta3)
Downloading: 100%

- Package zendframework/zend-uri (2.0.0beta3)
Downloading: 100%

- Package facebook/php-webdriver (master-dev)
Cloning master

- Package fabpot/goutte (master-dev)
Cloning master

- Package behat/mink-extension (dev-master)
Cloning cd8eb2c85859f7d5e88e5787d4e171eaa52002eb

- Package behat/mink (v1.4.0beta2)
Downloading: 100%

- Package behat/behat (v2.4.0beta3)
Downloading: 100%

symfony/event-dispatcher suggests installing symfony/http-kernel (dev-master)
behat/mink suggests installing behat/sahi-client (Sahi-Client is needed to use the SahiDriver)
behat/mink suggests installing alexandresalome/php-selenium (Php-Selenium is needed to use the SeleniumDriver)
behat/behat suggests installing behat/yii-extension (for integration of with Yii framework)
Writing lock file
Generating autoload files

Now Run Behat command,


Look, if you still using PHP5.3.x Then you will get

moonstar:MinkExtension-example sjagtap$ ./bin/behat
PHP Parse error:  syntax error, unexpected T_USE, expecting T_FUNCTION in /Users/sjagtap/MinkExtension-example/features/bootstrap/TraitedFeatureContext.php on line 5
PHP Stack trace:
PHP   1. {main}() /Users/sjagtap/MinkExtension-example/vendor/behat/behat/bin/behat:0
PHP   2. Symfony\Component\Console\Application->run() /Users/sjagtap/MinkExtension-example/vendor/behat/behat/bin/behat:27
PHP   3. Behat\Behat\Console\BehatApplication->doRun() /Users/sjagtap/MinkExtension-example/vendor/symfony/console/Symfony/Component/Console/Application.php:106
PHP   4. Symfony\Component\Console\Application->doRun() /Users/sjagtap/MinkExtension-example/vendor/behat/behat/src/Behat/Behat/Console/BehatApplication.php:93
PHP   5. Symfony\Component\Console\Command\Command->run() /Users/sjagtap/MinkExtension-example/vendor/symfony/console/Symfony/Component/Console/Application.php:193
PHP   6. Behat\Behat\Console\Command\BaseCommand->initialize() /Users/sjagtap/MinkExtension-example/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:225
PHP   7. Behat\Behat\Console\Processor\AggregateProcessor->process() /Users/sjagtap/MinkExtension-example/vendor/behat/behat/src/Behat/Behat/Console/Command/BaseCommand.php:55
PHP   8. Behat\Behat\Console\Processor\LocatorProcessor->process() /Users/sjagtap/MinkExtension-example/vendor/behat/behat/src/Behat/Behat/Console/Processor/AggregateProcessor.php:57

This is time to update your PHP version. If you still want run features with same PHP version, then comment out/ remove everything from ‘TraitedFeatureContext.php’ which is for PHP5.4

Now,  Start Selenium server & Run behat with ‘inheritance’  or  ‘subcontext’ profile.

./bin/behat -p=inheritance
./bin/behat -p=subcontexts

You will see test running with headless as well as with browser. You will see output like this

moonstar:MinkExtension-example sjagtap$ ./bin/behat -p=subcontexts
Feature: Search
  In order to see a word definition
  As a website user
  I need to be able to search for a word

  Scenario: Searching for a page that does exist               # features/search.feature:6
    Given I am on "/wiki/Main_Page"                            # Behat\MinkExtension\Context\MinkContext::visit()
    When I fill in "search" with "Behavior Driven Development" # Behat\MinkExtension\Context\MinkContext::fillField()
    And I press "searchButton"                                 # Behat\MinkExtension\Context\MinkContext::pressButton()
    Then I should see "agile software development"             # Behat\MinkExtension\Context\MinkContext::assertPageContainsText()

  Scenario: Searching for a page that does NOT exist           # features/search.feature:12
    Given I am on "/wiki/Main_Page"                            # Behat\MinkExtension\Context\MinkContext::visit()
    When I fill in "search" with "Glory Driven Development"    # Behat\MinkExtension\Context\MinkContext::fillField()
    And I press "searchButton"                                 # Behat\MinkExtension\Context\MinkContext::pressButton()
    Then I should see "Search results"                         # Behat\MinkExtension\Context\MinkContext::assertPageContainsText()

  Scenario: Searching for a page with autocompletion           # features/search.feature:19
    Given I am on "/wiki/Main_Page"                            # Behat\MinkExtension\Context\MinkContext::visit()
    When I fill in "search" with "Behavior Driv"               # Behat\MinkExtension\Context\MinkContext::fillField()
    And I wait for the suggestion box to appear                # SubcontextedFeatureContext::iWaitForTheSuggestionBoxToAppear()
    Then I should see "Behavior Driven Development"            # Behat\MinkExtension\Context\MinkContext::assertPageContainsText()

3 scenarios (3 passed)
12 steps (12 passed)

What’s new for Testers in MinkExtension?

  • You will get Mink instance in your ‘FeatureContext’ as well as ‘SubContexts’ classes.
  • You can extend Base Contextfile to MinkContext as shown in below. For other context you need to extend from RawMinkContext
class MyContext extends Behat\MinkExtension\Context\MinkContext
  • You can use MinkExtension as a SubContext in your files like this:
class SubcontextedFeatureContext extends Behat\Behat\Context\BehatContext
public function __construct()
$this->useContext('mink', new Behat\MinkExtension\Context\MinkContext);

This extension is a base for future extensions. We can extend Behat/Mink with any other services testing services like SauceLabs and many more.  This feature will definitely useful for Web Testers using Behat and Mink for browser automation. SauceLabs extension is on it’s way..  stay tuned 🙂

Happy BDD !!!

Adding More Sauce To Behat

24 Apr


Note : This post may not work with recent Behat. Please use and my  Github repo for to get it working without any issue


Further to my previous post regarding ‘Behat-Sauce’ integration, ‘Adding Sauce To Behat‘, I am glad to know that there is another Behat and SauceLabs integration from Laura Beth. Thanks a lot Laura for that excellent effort.

On the occasion of Selenium Conference, I met with Noah Sussman talking about “Selenium In the Enterprise: What Went Right, What Went Wrong (So Far)” and one of his slides indicated that, team using Behat and Mink for the functional testing at Etsy. Noah then introduced me to Laura Beth who setup Behat/Mink and SauceLabs integration. Behat-Sauce configuration by Laura Beth is very easy to use.

Now, we will see this in action.

Behat Installation 

Create a ‘Demo’ directory  and Clone the repository from Laura Beth’s GitHub account

moonstar:~ sjagtap$ mkdir Demo
moonstar:~ sjagtap$ cd Demo
moonstar:Demo sjagtap$ git clone
Cloning into Behat-Sauce...
remote: Counting objects: 178, done.
remote: Compressing objects: 100% (105/105), done.
remote: Total 178 (delta 50), reused 166 (delta 38)
Receiving objects: 100% (178/178), 58.74 MiB | 503 KiB/s, done.
Resolving deltas: 100% (50/50), done.

Ok, you got all the code in ‘Behat-Sauce’ directory. Now you need to download dependencies for Behat. Navigate to Behat-Sauce and download composer.

moonstar:Behat-Sauce sjagtap$ wget
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  442k  100  442k    0     0   988k      0 --:--:-- --:--:-- --:--:-- 1436k

Now, update ‘composer.phar’ file. It will download all dependencies.

moonstar:Behat-Sauce sjagtap$ php composer.phar update
Updating dependencies
  - Package symfony/yaml (dev-master)
    Cloning 52807f723e8a9743852c2105f11bd01c5af7f977

  - Package symfony/translation (dev-master)
    Cloning cac219a6dee410df41ac5dae15553313f48f1fd1

  - Package symfony/event-dispatcher (dev-master)
    Cloning b98d68d3b8513c62d35504570f09e9d3dc33d083

  - Package symfony/dependency-injection (dev-master)
    Cloning 61e664ab2eead27d83ebb45d2bf83dd55ef509a8

  - Package symfony/config (dev-master)
    Cloning 175adaf7dbed4ad5350e75a4fd3de39480df6cf3

  - Package symfony/console (dev-master)
    Cloning f354e1e5d59261ae03c0fc768bfa4043c0e6ab9c

  - Package symfony/process (dev-master)
    Cloning 3f95a0126588f00d70e745c1ef96631fb10c3a8e

  - Package symfony/css-selector (dev-master)
    Cloning dd695aadd80d8e6e726a7a050535c04325cefa02

  - Package symfony/dom-crawler (dev-master)
    Cloning 69b857977d96e4c726be5524fa00370aef5e9b20

  - Package symfony/browser-kit (dev-master)
    Cloning f03173e232da5d84eb799cad5d57354e6541b0f8

  - Package symfony/finder (dev-master)
    Cloning 5b8658e52eaf424fe943a5857e2404ce95c3b90e

  - Package behat/mink (dev-master)
    Cloning v1.3.3

  - Package behat/behat (dev-master)
    Cloning d8ff3fe0f8c44c664c5eebbb6b972bbdff70c166

  - Package alexandresalome/php-selenium (master-dev)
    Cloning master

  - Package behat/gherkin (v2.1.1)
    Downloading: 100%

symfony/translation suggests installing symfony/config (dev-master)
symfony/translation suggests installing symfony/yaml (dev-master)
symfony/event-dispatcher suggests installing symfony/dependency-injection (dev-master)
symfony/event-dispatcher suggests installing symfony/http-kernel (dev-master)
symfony/dependency-injection suggests installing symfony/yaml (dev-master)
symfony/dependency-injection suggests installing symfony/config (dev-master)
symfony/dom-crawler suggests installing symfony/css-selector (dev-master)
symfony/browser-kit suggests installing symfony/process (dev-master)
Writing lock file
Generating autoload files

You have just installed Behat and all dependencies. Now initialize project by running ‘bin/behat-sauce –init’ command.

moonstar:Behat-Sauce sjagtap$ ./bin/behat-sauce --init
+d features - place your *.feature files here
+d features/bootstrap - place bootstrap scripts and static files here
+f features/bootstrap/FeatureContext.php - place your feature related code here
+d config - edit you config settings here
+f /Users/sjagtap/Demo/Behat-Sauce/configbehat.yml - place your feature related code here

Once you initialized ‘Behat’. It will ‘features’ and ‘features/bootstrap’ directories and ‘features/bootstrap/FeatureContext.php’ file for you.

Feature file

You can also see ‘config’ directory with ‘behat.yml’ file for you. You need to add SauceLabs ‘Username’ and API key to the ‘behat.yml’.

Now write a simple feature file and save it to ‘features’ directory.

Feature: wikiSearch
  In order to search information on wiki
  As a Wiki user
  I want to get sensible results from site

  Scenario Outline: Search Keywords on wiki
    Given I am on "/"
    And I fill in searchBox with "<input type="text" />"
    When I press search button
Then I should see "<output>"

 | input | output |
 | London | lʌndən/ |

Step Definition

You need implement step definitions using Mink API’s. You feature context file will look like this now.

<!--?php use Behat\Behat\Context\ClosuredContextInterface,     Behat\Behat\Context\TranslatedContextInterface,     Behat\Behat\Exception\PendingException; use Behat\Gherkin\Node\PyStringNode,     Behat\Gherkin\Node\TableNode; use Behat\Sauce\Context\SauceContext; /**  * Features context.  */ class FeatureContext extends SauceContext {     /**      * Initializes context.      * Every scenario gets it's own context object.      *      * @param   array   $parameters     context parameters (set them up through behat.yml)      */     public function __construct(array $parameters) {         parent::__construct($parameters);     } /**      * @Given /^I fill in searchBox with "([^"]*)"$/      */     public function iFillInSearchboxWith($input)     {         $this--->fillField("searchInput",$input);

     * @When /^I press search button$/
    public function iPressSearchButton()

Well, now you are ready to run your tests on SauceLabs just by running

moonstar:Behat-Sauce sjagtap$ ./bin/behat-sauce

You will see test running on the SauceLabs. Once tests finished running, you will see output like this:

moonstar:Behat-Sauce sjagtap$ ./bin/behat-sauce
Feature: wikiSearch
  In order to search information on wiki
  As a Wiki user
  I want to get sensible results from site

  Scenario Outline: Search Keywords on wiki # features/wikiSearch.feature:7
    Given I am on "/"                       # FeatureContext::visit()
    And I fill in searchBox with "<input type="text" />"  # FeatureContext::iFillInSearchboxWith()
    When I press search button              # FeatureContext::iPressSearchButton()
Then I should see "<output>" # FeatureContext::assertPageContainsText()

 | input | output |
 | London | lʌndən/ |

1 scenario (1 passed)
4 steps (4 passed)

You can watch video of the test here

As per Laura Beth, default arguments are:

 --browser              SauceLabs browser name.  Default is:  firefox
 --browser-version      SauceLabs browser version.  Default is:  7
 --os                   SauceLabs operating system.  Default is:  Windows 2003

Now let’s run our tests on different browser and different OS:

moonstar:Behat-Sauce sjagtap$ ./bin/behat-sauce --browser="firefox" --browser-version="3.6" --os="Linux"

You will see same output:

moonstar:Behat-Sauce sjagtap$ ./bin/behat-sauce --browser="firefox" --browser-version="3.6" --os="Linux"
Feature: wikiSearch
  In order to search information on wiki
  As a Wiki user
  I want to get sensible results from site

  Scenario Outline: Search Keywords on wiki # features/wikiSearch.feature:7
    Given I am on "/"                       # FeatureContext::visit()
    And I fill in searchBox with "<input type="text" />"  # FeatureContext::iFillInSearchboxWith()
    When I press search button              # FeatureContext::iPressSearchButton()
Then I should see "<output>" # FeatureContext::assertPageContainsText()

 | input | output |
 | London | lʌndən/ |

1 scenario (1 passed)
4 steps (4 passed)

Video of the tests can be found here


You can also start Sauce-Connect tunnel with the same credentials that you provided in config/behat.yml file

bin/behat-sauce --tunnel

You will see something like this:

moonstar:Behat-Sauce sjagtap$ ./bin/behat-sauce --tunnel
[-u, Shashikant86, -k, API Key, -d, sauce-connect.proxy, -s,, -p, 80, --ssh-port, 443, -b, --rest-url,, --se-port, 4445, --squid-opts, ]
* Debug messages will be sent to sauce_connect.log
2012-04-24 17:27:32.354:INFO::jetty-7.x.y-SNAPSHOT
2012-04-24 17:27:32.439:INFO::Started SelectChannelConnector@
| Have questions or need help with Sauce Connect? |
| Contact us: |
| Terms of Service: |
2012-04-24 17:27:32,509 - / Starting \
2012-04-24 17:27:32,513 - Please wait for "You may start your tests" to start your tests.
2012-04-24 17:27:32,526 - Forwarding: ['sauce-connect.proxy']:['80'] ->['50044']
2012-04-24 17:27:32,538 - Succesfully connected to local server in 6ms
2012-04-24 17:27:33,201 - {"squid_config":[""],"use_caching_proxy":true,"fast_fail_regexps":[""],"ssh_port":443,"metadata":{"PythonVersion":"2.5.1","OwnerHost":"","Release":"3.0-r18","OwnerPorts":["50044"],"Ports":["80"],"Platform":"Java-1.6.0_26-Java_HotSpot-TM-_64-Bit_Server_VM,_20.1-b02-383,_Apple_Inc.-on-Mac_OS_X-10.7.1-x86_64","Build":"26","ScriptRelease":26,"ScriptName":"sauce_connect"},"use_kgp":true,"domain_names":["sauce-connect.proxy"]}
2012-04-24 17:27:33,486 - Tunnel remote VM is provisioned (a86bd10139b8464081e185b016b6579d)
2012-04-24 17:27:33,756 - Tunnel remote VM is new ..
2012-04-24 17:27:37,068 - Tunnel remote VM is deploying ..
2012-04-24 17:27:40,440 - Tunnel remote VM is booting ..
2012-04-24 17:28:06,611 - Tunnel remote VM is running at
2012-04-24 17:28:06,723 - Succesfully connected to local server in 0ms
2012-04-24 17:28:06,729 - Starting connection to tunnel host...
2012-04-24 17:28:06,732 - Connecting to tunnel host as Shashikant86
2012-04-24 17:28:06,994 - Forwarding Selenium with ephemeral port 50478
2012-04-24 17:28:06.996:INFO::jetty-7.x.y-SNAPSHOT
2012-04-24 17:28:06.998:INFO::Started SelectChannelConnector@
2012-04-24 17:28:07,000 - Selenium HTTP proxy listening on port 4445
2012-04-24 17:28:07,855 - Successful handshake with Sauce Connect server
2012-04-24 17:28:08,109 - Tunnel host version: 0.1.0, remote endpoint ID: 2851094ae70e4e949a0e96c8ca453748
2012-04-24 17:28:08,112 - Connected! You may start your tests.

Sauce connect is used for testing internal site.

Test Locally:

Well, if you don’t want to waste sauceLabs minutes. You can run your test locally:

moonstar:Behat-Sauce sjagtap$ ./bin/behat-sauce --local

You will see tests running on local machine with Firefox and output is same:

moonstar:Behat-Sauce sjagtap$ ./bin/behat-sauce --local
Feature: wikiSearch
  In order to search information on wiki
  As a Wiki user
  I want to get sensible results from site

  Scenario Outline: Search Keywords on wiki # features/wikiSearch.feature:7
    Given I am on "/"                       # FeatureContext::visit()
    And I fill in searchBox with "<input type="text" />"  # FeatureContext::iFillInSearchboxWith()
    When I press search button              # FeatureContext::iPressSearchButton()
Then I should see "<output>" # FeatureContext::assertPageContainsText()

 | input | output |
 | London | lʌndən/ |

1 scenario (1 passed)
4 steps (4 passed)


Well, I have forked repository and started implementing full scale SauceLabs grid which support all browsers &  OS combination. I am also trying to plug the features on continuous integration server like Jenkins. If you also wish to contribute then fork “Behat-Sauce”

Source code:

Code for the above example can be found “Behat-Sauce-Demo” repository.


Believe me, this is simply awesome. Thanks again Laura Beth.

Happy BDD !!

SeleniumConf came to London!

23 Apr

As mentioned on the Selenium Conference 2012 website, this year conference would be across the pond and it was London.  Conference venue ‘IET London‘ was amazing place situated on the bank of Thames river and great view of historical London Eye. I live and work in London so it’s very convenient for me to get down to the location of the conference. I met with with selenium users all across the world and shared thoughts and ideas about open-source testing. Selenium conference started on Monday April,16 and wrapped up on Wednesday, April,18. I spend three memorable days at Selenium conference and learned a lot about new tools, methodologies and approaches of testing applications with Selenium. I would like to take this opportunity to thank SauceLabs and all other sponsors of the Selenium Conference.

Let me see, how can I explain what happened in the conference.


It was drizzling, when I came out of the Embankment tube station, and need to walk for 2-3 minutes to get to the venue. It wasn’t difficult to find venue and reception of the Selenium conference. I met with Ashley Wilson, (Customer Development Manager at SauceLabs) at registration desk. Ashley played key role in organizing and managing Selenium Conference. then I didn’t forget to pick a T-Shirt labeled with ‘Selenium Conference 2012’. The breakfast and tea was ready.

It was difficult to choose a workshop as both were interesting. I decided to go for workshop ” Contributing to Selenium” by ‘WebDiver Guy‘ (Simon Stewart) in the morning session.

“Contributing to Selenium” Workshop

The workshop aimed at contribution to selenium open-source project. I was ready with all the code downloaded from googleCode and brand new IntelliJ IDE.  I have heard about cool features of the IntelliJ but never tried it before. It is really awesome. Simon already mentioned in technical requirements that ‘ Setting up project in Eclipse is not supported’.

Within the workshop, I had a look at directory structure of the selenium codebase, setup the project in the IntelliJ and also done some code modifications as suggested by Simon. At the middle of the workshop, I was lagging behind while running the JavaScript tests. I ran build with ‘build.desc’ file also ran some test with Firefox driver. Lately, I realised that I was surounded by ‘software engineer in test’ from Google. Lucky me !!

After the break, we started with running tests within IDE. Being new to the ItelliJ, I faced some issues while running tests but managed to get it worked with the help of Simon.  At the end of the workshop, someone asked question about ‘How to measure coverage of the Selenium/Functional tests’  and there were interesting discussion around this topic. Being from PHP background, I couldn’t resist myself to ask about ‘PHP Webdriver bindings and current development on PHP bindings’. Simon said ” In terms of PHP, FaceBook-Webdriver bindings are recommended”. Simon then introduced me to Damien Sereni who works in Facebook. At the end of the session. Me and Demien spend some time discussing about future of the PHP webdriver bindings also shared contact details. The lunch was waiting for us then.

After lunch, again I had to make tough decision about selecting workshop. I have decided to go to “If Ikea made instructions for Selenium (or: How to fix bugs in Selenium for yourself)” by  Daniel Wagner-Hall, and the Selenium Committers. I really missed the another one “Handmade Etsy Tests” by  Stephen Hardisty & Michelle D’Netto. Lately realised that Etsy uses Behat and Mink for functional testing which is interesting topic for me which I missed a lot.

How to fix bugs in Selenium for yourself

In this workshop, Daniel talked about selenium codebase and different drivers. I have already checked out selenium trunk in my system and need to look into Selenium bugs to pick up. Being a tester and having limited development knowledge, I realised that I can’t fix any bug in selenium so just started doing some interesting stuff. I managed to get the tests running on my Andriod phone with the help of Andriod driver. That was enough for me it this session and it was end of first day of the selenium conference.


April,17 is my birthday. I reached early on that day in order to register my unconference talk on “Behat and Sauce Labs Integration”. I registered my talk at 10PM  on that day. I was very excited to talk on the occasion of my birthday.

Anyway, I saw huge crowd on second day of the conference and met with people from different countries while having tea and breakfast. At 9 PM, we get into the lecture hall, which was huge and amazing. There was one tweet from Frisco Del Rosario (@frdelrosario) saying ” Auditorium at #SeConf had balconies, microphones at each chair, flawless wi-fi.

As per the schedule, Jason and Simon introduced sponsors and explained schedule of Track A and Track B talks.

Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selenium Infrastructure

Most people turned on for Track B talk which was on ” Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selenium Infrastructure”  by  Dan Cuellar. I also headed over to that talk. Slides of his talk are available on here Dan explained how to test rapidly changing applications with just small code change in the test infrastructure. Dan implemented object oriented approach that can handle such a rapid change. As per the Dan if you abstracted the code well then you can build robust automated test scripts. Dan is looking for someone who can help him to extend his work to support iOS. If you are interested to help him then email him at

Web acceptance Testing with Behat

After Dan’s talk, it was my turn to give talk on ‘Web Acceptance Testing with Behat’. There was another Track A talk where Anand Ramdeo was talking about “One Step At a Time” most people turned out there. I was bit disappointed seeing only 10 people attending my talk but still I carried it forward. My talk covered BDD and ATDD with the Behat, Sauce Labs , Jenkins and Relish. Slides of my talk are available here.

So you’re automated… now let’s make it fast!

I have decided to stay at Track B where Sauce Ninja Santiago was about to talk on making test automation fast. The title of his talk was ” So you’re automated… now let’s make it fast!”. Santiago shared some tips to make selenium tests faster like avoiding static waits in the tests or running tests in parallel. At the end of the Santiago’s talk, there are couple of raised which sounds interesting to Santiago. There was a question from Mitch about database integration with selenium tests which was interesting. I asked question about flaky tests that fails in the cloud complaining “element not found” but works well in local machine. As per Santiago, it’s bit tricky to judge random failures in browsers in the cloud.

Using Selenium to Improve a Team’s Development Cycle

After the break, I headed over to lecture hall to hear Mike Devis talking about “Using Selenium to Improve a Team’s Development Cycle“. Mike shared some cool tips about improving quality of the functional tests. Mike also talked about involving developers to write tests. I really like the idea of profiling the tests.  Ultimately, it was very pleasant talk with lots of good tips

Geb: Very Groovy Browser Automation

This is one of the best talk from my point of view. Thanks to Luke Daley. This talk was about Geb. Geb is a browser automation framework which combines cool features of WebDriver, jQuery and the Page Objects. Most interesting thing, I found in this talk is $() method. The dollar method can be used to interact with the web pages and accessing web elements. Another interesting thing is integration of Geb with different frameworks like JUnit, TestNG, Spock, Cucumber. At the end of the talk, I asked question on integration of Geb with new Cucumber JVM. Once Luke finished his talk, we went to reception to have a lunch.

Robots: If You Can’t Beat ‘Em, Build ‘Em

Well, This was most interesting demo to watch that how Jason “Teach Robot to play Angry Bird“. Click the link and watch the video inside the presentation, you will be amazed by seeing that how it can be achieved with Selenium. I think, only God and Jason knows how to write code for this. I just enjoyed the demo and applauded at the end of talk.

Building Quality with Foundations of Mud

After Jason’s talk, Kristian Rosenvold was talking about ‘Building Quality’. Kristian explained how to build test environment, test data and Continuous Integration practices in order to build quality products. He again explained some cool tips to handle flaky tests and errors. His slides are explanatory. Kristian made one statement who liked by selenium contributors. It was “Make your dev team live and Breathe the build”  At the end of the presentation, I asked question on Tolerance rate of their functional tests. Kristian answered that they can tolerate failing integration tests but not the functional tests. Well, then it was time for quick break then.

Massively Continuous Integration

Continuous Integration is area of my interest so I didn’t want to miss talk on my favorite topic. I headed over to the Track B where Jesse Dowdle & David Tolley were talking on their huge continuous integration system. As per their slides, they have reduced cycle time of running tests from 3 days to 30 minutes. The amount of selenium tests and cycle time to run them over Grid literally amused me. They used Jenkins and amazon web for running the tests. I would rather recommend looking at the slides of the presentation. It was amazing talk.I would like to see demo how they run massive test suite within 30 mins. Thanks to speakers & Jenkins.

How to Test the Inside of Your Head

Speaker Liz Keogh is vary famous agile/BDD coach and international speaker. I was impressed by her talks on BDD at Skills Matter. No wonder her talk at Selenium Conference was one the best. Liz talked about collaboration between developers, testers, BA, project managers and customers. As per Liz “Testers are Evil so let them think before writing code“.  Most of people on twitter channel were saying it was brilliant talk.

Well, how can I forget that there was amazing party sponsored by FaceBook at the GlassHouse Store, London. I met with people all around world and had great chat with them. Food and drinks were amazing. Great opportunity to celebrate birthday with unlimited drinks and food. Thanks Facebook.


Last day of the selenium conference was full of interesting talks, lighting talks and end up with closing keynote session. At the start of the day ‘ Simon Stewart’ kicked off with his talk on status of Selenium projects since last selenium conference

State of the Union

Simon didn’t forget to mention that he is on twitter (@shs96c) at the start of his talk. Simon highlighted recent enhancements of the Selenium project. He also point out an year in a browser and new selenium committers. The most interesting part of his presentation was his analysis of job trends in year, the graph amused everyone.

Simon addressed future development will be on mobile drivers as they are being valuable in recent days. He also expecting new stuff with respect to W3C standard. Let’s see how it will go on in near future. Slide of his talks are available here.

After Simon’s talk I headed over to Track B where “TFT Test Automation Framework” talk was going on. It was all about maintaining and writing automated tests just by using spreadsheets.  I really missed “Introducing Selenium Builder – the Future of Test Development” talk by Adam Christian and David Stark. Hope to see videos of the talk soon.

Selenium in the Enterprise: What Went Right, What Went Wrong (So Far)

Noah Sussman  was talking about how they used selenium at Etsy. This talk was more about test maintenance and test infrastructure at Etsy. Being a big fan of Behat, I came across one the slide saying “Etsy used Behat & Mink for functional testing”. I was keen to know more about that and asked question on how they used behat in their projects also had a chat after talk with Noah.

 Automated Security Testing

Alan Parkinson was talking about  ‘Zed Attack Proxy (ZAP) Web-Driver’ for automated security testing. Alan introduced ZAP during his talk and then integrated with build system like ANT. Alan’s demo of ZAP and Jenkins was amazing. I couldn’t resist myself to tweet about that. It’s great approach to perform automated security check on build. I will definitely give a try.

Pluggable Test Infrastructure

As far I remember, I have seen video of last selenium conference Dima talking about Selenium and Cucumber. This year Dima and Jeff comes up with Pluggable Test Infrastructure. They are using Cucumber, Capybara and webdriver at Groupon. Jeff said that using Cucumber is debatable. Jeff & Dima combined API tests, iPhone tests, Sauce tests and Selenium tests with Cucumber. It would be interesting to see demonstration of how they achieved this.

Speed up Your Selenium Tests with PhantomJS, the Headless Browser

Ivan De Marino was then talking about PhantomJS  in order to make selenium tests fast. In his talk he showed how you could run selenium tests with PhantomJS and Ghostdriver. Ghostdriver is wire protocol on PhantomJS. One of the tweet was saying Ghostdriver has awesome potential but needs your contribution. If you wish to contribute then fork Github repo now.

Robot Framework

Once Ivan finished his talk on PhantomJS, I have decided to go for Track B where Philip Noetzel was talking about “Robot Framework: Semicolon free testing”. I heard a lot about Robot Framework but didn’t got chance to look into it. This talk was very beneficial for me as Philip shows some cool stuff about robot framework and also shown sample code. Philip also shared his thoughts about pros and cons of using Robot framework. At the end of the presentation we asked Philip if we can use Robot framework for PHP applications.

More Than Automation – How Good Acceptance Tests Can Make Your Team Happier

I was keen to hear Matt Wynne, author of Cucumber book talking about ‘More Than Automation‘. Matt introduced Mortgage Driven Development (MDD) where developers try to make feature completely readable and unmaintainable in order to save your job!. Matt also added concept of “Refuctoring” where developers try to add brittle steps and scenarios in order to make it messy. Well, Matt also said ” Cucumber is a threat” but then audience understood whats intention behind all this idea. As per Matt, Cucumber is cool take which allow everyone to collaborate and write tests. Matt also suggest to read Cucumber book in order to get yourself familiar with Behavior Driven Development (BDD). Matt shared cool tool for living documentation called ‘Relish’. At the end of the talk, there were couple of question around Relish. one of them was asked by me.

Lightning Talks

There were about 10  lightning talks (including mine) scheduled on the board and each one of 5 minutes. Lightning talks was fun. I liked Anand and Komal talked about how to do things wrong. It was nice talk. I am keenly waiting to see videos of Lightning talks.

Closing Keynotes

After the lighting talks there were another session called ‘Closing Keynotes’ where all the selenium committers discuss about the future enhancements and answered questions. There was one interesting question comes up in this session about Selenium 3. Conference was then wrapped up by thanking everyone who attended the conference.


 I bet, everyone who attended conference had loads of fun and learned new things. Those were was not able to attend the conference, they got live conference updates from twitter hashtag #SeConf. I got a tweet from Michelle Flynn (@MichelleFlynn) saying “Great twitter chat about #SeConf, love how you can follow a conference even if you cannot attend

Many people all over the world was getting updates on selenium conference every minute. Thanks to organizers for creating such a unique hashtag also thanks to all twitter users who twitted in #SeConf

Interesting things I found.

  • Mortgage Driven Development
  • Mobile Drivers
  • Use of BDD tools with Selenium like Cucumber, SpecFlow, Behat
  • Geb: Very groovy browser automation framework
  • ‘Atkins’ plug-in for Jenkins
  •  Robot Framework for BDD and DDD
  • Large scale Continuous Integration with Jenkins and Amazon cloud services


Selenium conference taught me lot of new things around Selenium also given an opportunity to meet with Selenium users all across the globe which was amazing experience. Great speakers, great learning experience and amazing location. Thanks SauceLabs, Google and all other sponsors. Looking forward next year !