diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/SaucelabsFactory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/SaucelabsFactory.php index ace030e..21572af 100644 --- a/src/Behat/MinkExtension/ServiceContainer/Driver/SaucelabsFactory.php +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/SaucelabsFactory.php @@ -11,9 +11,8 @@ namespace Behat\MinkExtension\ServiceContainer\Driver; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; -use Symfony\Component\DependencyInjection\Definition; -class SaucelabsFactory implements DriverFactory +class SaucelabsFactory extends Selenium2Factory { /** * {@inheritdoc} @@ -23,14 +22,6 @@ class SaucelabsFactory implements DriverFactory return 'saucelabs'; } - /** - * {@inheritdoc} - */ - public function supportsJavascript() - { - return true; - } - /** * {@inheritdoc} */ @@ -42,19 +33,7 @@ class SaucelabsFactory implements DriverFactory ->scalarNode('access_key')->defaultValue(getenv('SAUCE_ACCESS_KEY'))->end() ->booleanNode('connect')->defaultFalse()->end() ->scalarNode('browser')->defaultValue('firefox')->end() - ->arrayNode('capabilities') - ->addDefaultsIfNotSet() - ->normalizeKeys(false) - ->children() - ->scalarNode('name')->defaultValue('Behat feature suite')->end() - ->scalarNode('platform')->defaultValue('Linux')->end() - ->scalarNode('version')->defaultValue('21')->end() - ->scalarNode('selenium-version')->defaultValue('2.31.0')->end() - ->scalarNode('max-duration')->defaultValue('300')->end() - ->scalarNode('deviceType')->defaultNull()->end() - ->scalarNode('deviceOrientation')->defaultNull()->end() - ->end() - ->end() + ->append($this->getCapabilitiesNode()) ->end() ; } @@ -64,11 +43,6 @@ class SaucelabsFactory implements DriverFactory */ public function buildDriver(array $config) { - if (!class_exists('Behat\Mink\Driver\Selenium2Driver')) { - throw new \RuntimeException( - 'Install MinkSelenium2Driver in order to use saucelabs driver.' - ); - } $capabilities = $config['capabilities']; $capabilities['tags'] = array(php_uname('n'), 'PHP '.phpversion()); @@ -83,10 +57,34 @@ class SaucelabsFactory implements DriverFactory $host = 'localhost:4445'; } - return new Definition('Behat\Mink\Driver\Selenium2Driver', array( - $config['browser'], - $capabilities, - sprintf('%s:%s@%s/wd/hub', $config['username'], $config['access_key'], $host), - )); + $config['capabilities'] = $capabilities; + $config['wd_host'] = sprintf('%s:%s@%s/wd/hub', $config['username'], $config['access_key'], $host); + + return parent::buildDriver($config); + } + + protected function getCapabilitiesNode() + { + $node = parent::getCapabilitiesNode(); + + $node + ->children() + ->scalarNode('name')->defaultValue('Behat feature suite')->end() + ->scalarNode('platform')->defaultValue('Linux')->end() + ->scalarNode('selenium-version')->defaultValue('2.31.0')->end() + ->scalarNode('max-duration')->defaultValue('300')->end() + ->scalarNode('build')->info('will be set automatically based on the TRAVIS_JOB_NUMBER environment variable if available')->end() + ->arrayNode('custom-data') + ->useAttributeAsKey('') + ->prototype('variable')->end() + ->end() + ->booleanNode('record-video')->end() + ->booleanNode('record-screenshots')->end() + ->booleanNode('capture-html')->end() + ->booleanNode('disable-popup-handler')->end() + ->end() + ; + + return $node; } } diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium2Factory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium2Factory.php index 8a0d5b4..b7a3e80 100644 --- a/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium2Factory.php +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium2Factory.php @@ -39,72 +39,7 @@ class Selenium2Factory implements DriverFactory $builder ->children() ->scalarNode('browser')->defaultValue('%mink.browser_name%')->end() - ->arrayNode('capabilities') - ->addDefaultsIfNotSet() - ->normalizeKeys(false) - ->children() - ->scalarNode('browserName')->defaultValue('firefox')->end() - ->scalarNode('version')->defaultValue('9')->end() - ->scalarNode('platform')->defaultValue('ANY')->end() - ->scalarNode('browserVersion')->defaultValue('9')->end() - ->scalarNode('browser')->defaultValue('firefox')->end() - ->scalarNode('ignoreZoomSetting')->defaultValue('false')->end() - ->scalarNode('name')->defaultValue('Behat Test')->end() - ->scalarNode('deviceOrientation')->defaultValue('portrait')->end() - ->scalarNode('deviceType')->defaultValue('tablet')->end() - ->scalarNode('selenium-version')->defaultValue('2.31.0')->end() - ->scalarNode('max-duration')->defaultValue('300')->end() - ->booleanNode('javascriptEnabled')->end() - ->booleanNode('databaseEnabled')->end() - ->booleanNode('locationContextEnabled')->end() - ->booleanNode('applicationCacheEnabled')->end() - ->booleanNode('browserConnectionEnabled')->end() - ->booleanNode('webStorageEnabled')->end() - ->booleanNode('rotatable')->end() - ->booleanNode('acceptSslCerts')->end() - ->booleanNode('nativeEvents')->end() - ->booleanNode('passed')->end() - ->booleanNode('record-video')->end() - ->booleanNode('record-screenshots')->end() - ->booleanNode('capture-html')->end() - ->booleanNode('disable-popup-handler')->end() - ->arrayNode('proxy') - ->children() - ->scalarNode('proxyType')->end() - ->scalarNode('proxyAuthconfigUrl')->end() - ->scalarNode('ftpProxy')->end() - ->scalarNode('httpProxy')->end() - ->scalarNode('sslProxy')->end() - ->end() - ->validate() - ->ifTrue(function ($v) { - return empty($v); - }) - ->thenUnset() - ->end() - ->end() - ->arrayNode('firefox') - ->children() - ->scalarNode('profile') - ->validate() - ->ifTrue(function ($v) { - return !file_exists($v); - }) - ->thenInvalid('Cannot find profile zip file %s') - ->end() - ->end() - ->scalarNode('binary')->end() - ->end() - ->end() - ->arrayNode('chrome') - ->children() - ->arrayNode('switches')->prototype('scalar')->end()->end() - ->scalarNode('binary')->end() - ->arrayNode('extensions')->prototype('scalar')->end()->end() - ->end() - ->end() - ->end() - ->end() + ->append($this->getCapabilitiesNode()) ->scalarNode('wd_host')->defaultValue('http://localhost:4444/wd/hub')->end() ->end() ; @@ -116,9 +51,10 @@ class Selenium2Factory implements DriverFactory public function buildDriver(array $config) { if (!class_exists('Behat\Mink\Driver\Selenium2Driver')) { - throw new \RuntimeException( - 'Install MinkSelenium2Driver in order to use selenium2 driver.' - ); + throw new \RuntimeException(sprintf( + 'Install MinkSelenium2Driver in order to use %s driver.', + $this->getDriverName() + )); } return new Definition('Behat\Mink\Driver\Selenium2Driver', array( @@ -127,4 +63,70 @@ class Selenium2Factory implements DriverFactory $config['wd_host'], )); } + + protected function getCapabilitiesNode() + { + $node = new ArrayNodeDefinition('capabilities'); + + $node + ->addDefaultsIfNotSet() + ->normalizeKeys(false) + ->children() + ->scalarNode('browserName')->defaultValue('firefox')->end() + ->scalarNode('version')->defaultValue('21')->end() + ->scalarNode('platform')->defaultValue('ANY')->end() + ->scalarNode('browserVersion')->defaultValue('9')->end() + ->scalarNode('browser')->defaultValue('firefox')->end() + ->scalarNode('ignoreZoomSetting')->defaultValue('false')->end() + ->scalarNode('name')->defaultValue('Behat feature suite')->end() + ->scalarNode('deviceOrientation')->defaultValue('portrait')->end() + ->scalarNode('deviceType')->defaultValue('tablet')->end() + ->booleanNode('javascriptEnabled')->end() + ->booleanNode('databaseEnabled')->end() + ->booleanNode('locationContextEnabled')->end() + ->booleanNode('applicationCacheEnabled')->end() + ->booleanNode('browserConnectionEnabled')->end() + ->booleanNode('webStorageEnabled')->end() + ->booleanNode('rotatable')->end() + ->booleanNode('acceptSslCerts')->end() + ->booleanNode('nativeEvents')->end() + ->arrayNode('proxy') + ->children() + ->scalarNode('proxyType')->end() + ->scalarNode('proxyAuthconfigUrl')->end() + ->scalarNode('ftpProxy')->end() + ->scalarNode('httpProxy')->end() + ->scalarNode('sslProxy')->end() + ->end() + ->validate() + ->ifTrue(function ($v) { + return empty($v); + }) + ->thenUnset() + ->end() + ->end() + ->arrayNode('firefox') + ->children() + ->scalarNode('profile') + ->validate() + ->ifTrue(function ($v) { + return !file_exists($v); + }) + ->thenInvalid('Cannot find profile zip file %s') + ->end() + ->end() + ->scalarNode('binary')->end() + ->end() + ->end() + ->arrayNode('chrome') + ->children() + ->arrayNode('switches')->prototype('scalar')->end()->end() + ->scalarNode('binary')->end() + ->arrayNode('extensions')->prototype('scalar')->end()->end() + ->end() + ->end() + ->end(); + + return $node; + } }