diff --git a/spec/Behat/MinkExtension/ServiceContainer/Driver/BrowserStackFactorySpec.php b/spec/Behat/MinkExtension/ServiceContainer/Driver/BrowserStackFactorySpec.php new file mode 100644 index 0000000..00922e7 --- /dev/null +++ b/spec/Behat/MinkExtension/ServiceContainer/Driver/BrowserStackFactorySpec.php @@ -0,0 +1,24 @@ +shouldHaveType('Behat\MinkExtension\ServiceContainer\Driver\DriverFactory'); + } + + function it_is_named_browser_stack() + { + $this->getDriverName()->shouldReturn('browser_stack'); + } + + function it_supports_javascript() + { + $this->supportsJavascript()->shouldBe(true); + } +} diff --git a/src/Behat/MinkExtension/Extension.php b/src/Behat/MinkExtension/Extension.php index 41711c9..80d5da9 100644 --- a/src/Behat/MinkExtension/Extension.php +++ b/src/Behat/MinkExtension/Extension.php @@ -11,6 +11,7 @@ namespace Behat\MinkExtension; use Behat\Behat\Context\ServiceContainer\ContextExtension; +use Behat\MinkExtension\ServiceContainer\Driver\BrowserStackFactory; use Behat\MinkExtension\ServiceContainer\Driver\DriverFactory; use Behat\MinkExtension\ServiceContainer\Driver\GoutteFactory; use Behat\MinkExtension\ServiceContainer\Driver\SahiFactory; @@ -52,6 +53,7 @@ class Extension implements ExtensionInterface $this->registerDriverFactory(new SeleniumFactory()); $this->registerDriverFactory(new Selenium2Factory()); $this->registerDriverFactory(new SaucelabsFactory()); + $this->registerDriverFactory(new BrowserStackFactory()); $this->registerDriverFactory(new ZombieFactory()); } diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/BrowserStackFactory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/BrowserStackFactory.php new file mode 100644 index 0000000..3950381 --- /dev/null +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/BrowserStackFactory.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Behat\MinkExtension\ServiceContainer\Driver; + +use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; + +class BrowserStackFactory extends Selenium2Factory +{ + /** + * {@inheritdoc} + */ + public function getDriverName() + { + return 'browser_stack'; + } + + /** + * {@inheritdoc} + */ + public function configure(ArrayNodeDefinition $builder) + { + $builder + ->children() + ->scalarNode('username')->defaultValue(getenv('BROWSERSTACK_USERNAME'))->end() + ->scalarNode('access_key')->defaultValue(getenv('BROWSERSTACK_ACCESS_KEY'))->end() + ->scalarNode('browser')->defaultValue('firefox')->end() + ->append($this->getCapabilitiesNode()) + ->end() + ; + } + + /** + * {@inheritdoc} + */ + public function buildDriver(array $config) + { + $capabilities = $config['capabilities']; + $capabilities['tags'] = array(php_uname('n'), 'PHP '.phpversion()); + + if (getenv('TRAVIS_JOB_NUMBER')) { + $capabilities['tunnel-identifier'] = getenv('TRAVIS_JOB_NUMBER'); + $capabilities['build'] = getenv('TRAVIS_BUILD_NUMBER'); + $capabilities['tags'] = array('Travis-CI', 'PHP '.phpversion()); + } + + $config['capabilities'] = $capabilities; + $config['wd_host'] = sprintf('%s:%s@hub.browserstack.com/wd/hub', $config['username'], $config['access_key']); + + return parent::buildDriver($config); + } + + protected function getCapabilitiesNode() + { + $node = parent::getCapabilitiesNode(); + + $node + ->children() + ->scalarNode('name')->defaultValue('Behat feature suite')->end() + ->scalarNode('project')->end() + ->scalarNode('resolution')->end() + ->scalarNode('build')->info('will be set automatically based on the TRAVIS_JOB_NUMBER environment variable if available')->end() + ->scalarNode('os')->end() + ->scalarNode('os_version')->end() + ->scalarNode('device')->end() + ->booleanNode('browserstack-debug')->end() + ->booleanNode('browserstack-tunnel')->end() + ->end() + ; + + return $node; + } +}