From 59f3cf104aef25b780104e60be93fc0c3c6df710 Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Mon, 10 Jul 2023 14:19:57 +0800 Subject: [PATCH 1/3] Support selenium4 --- .../Driver/Selenium4Factory.php | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php new file mode 100644 index 0000000..e9111a0 --- /dev/null +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php @@ -0,0 +1,175 @@ + + * + * 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; +use Symfony\Component\DependencyInjection\Definition; + +class Selenium4Factory implements DriverFactory +{ + /** + * {@inheritdoc} + */ + public function getDriverName() + { + return 'selenium4'; + } + + /** + * {@inheritdoc} + */ + public function supportsJavascript() + { + return true; + } + + /** + * {@inheritdoc} + */ + public function configure(ArrayNodeDefinition $builder) + { + $builder + ->children() + ->scalarNode('browser')->defaultValue('%mink.browser_name%')->end() + ->append($this->getCapabilitiesNode()) + ->scalarNode('wd_host')->defaultValue('http://localhost:4444/wd/hub')->end() + ->end() + ; + } + + /** + * {@inheritdoc} + */ + public function buildDriver(array $config) + { + if (!class_exists('Behat\Mink\Driver\Selenium2Driver')) { + throw new \RuntimeException(sprintf( + 'Install MinkSelenium2Driver in order to use %s driver.', + $this->getDriverName() + )); + } + + $extraCapabilities = $config['capabilities']['extra_capabilities']; + unset($config['capabilities']['extra_capabilities']); + + if (getenv('TRAVIS_JOB_NUMBER')) { + $guessedCapabilities = array( + 'tunnel-identifier' => getenv('TRAVIS_JOB_NUMBER'), + 'build' => getenv('TRAVIS_BUILD_NUMBER'), + 'tags' => array('Travis-CI', 'PHP '.phpversion()), + ); + } elseif (getenv('JENKINS_HOME')) { + $guessedCapabilities = array( + 'tunnel-identifier' => getenv('JOB_NAME'), + 'build' => getenv('BUILD_NUMBER'), + 'tags' => array('Jenkins', 'PHP '.phpversion(), getenv('BUILD_TAG')), + ); + } else { + $guessedCapabilities = array( + 'tags' => array(php_uname('n'), 'PHP '.phpversion()), + ); + } + + return new Definition('Behat\Mink\Driver\Selenium2Driver', array( + $config['browser'], + array_replace($guessedCapabilities, $extraCapabilities, $config['capabilities']), + $config['wd_host'], + )); + } + + protected function getCapabilitiesNode() + { + $node = new ArrayNodeDefinition('capabilities'); + + $node + ->addDefaultsIfNotSet() + ->normalizeKeys(false) + ->children() + ->scalarNode('browserName')->end() + ->scalarNode('version')->end() + ->scalarNode('platform')->end() + ->scalarNode('browserVersion')->end() + ->scalarNode('browser')->defaultValue('firefox')->end() + ->booleanNode('marionette')->end() + ->booleanNode('ignoreZoomSetting')->defaultFalse()->end() + ->scalarNode('name')->defaultValue('Behat feature suite')->end() + ->scalarNode('deviceOrientation')->end() + ->scalarNode('deviceType')->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('overlappingCheckDisabled')->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() + ->arrayNode('prefs') + ->normalizeKeys(false) + ->useAttributeAsKey('name') + ->prototype('variable')->end() + ->end() + ->end() + ->validate() + ->ifTrue(function ($v) { + return empty($v['prefs']); + }) + ->then(function ($v) { + unset($v['prefs']); + return $v; + }) + ->end() + ->end() + ->arrayNode('extra_capabilities') + ->info('Custom capabilities merged with the known ones') + ->normalizeKeys(false) + ->useAttributeAsKey('name') + ->prototype('variable')->end() + ->end() + ->end(); + + return $node; + } +} From a846a31b58befbe0457653f029cb106aee36a1ee Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Mon, 10 Jul 2023 15:43:15 +0800 Subject: [PATCH 2/3] Update --- .../Driver/Selenium4Factory.php | 122 +++++------------- .../ServiceContainer/MinkExtension.php | 2 + 2 files changed, 34 insertions(+), 90 deletions(-) diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php index e9111a0..8c1a446 100644 --- a/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php @@ -38,6 +38,7 @@ class Selenium4Factory implements DriverFactory { $builder ->children() + ->scalarNode('name')->defaultValue('Behat Test')->end() ->scalarNode('browser')->defaultValue('%mink.browser_name%')->end() ->append($this->getCapabilitiesNode()) ->scalarNode('wd_host')->defaultValue('http://localhost:4444/wd/hub')->end() @@ -50,37 +51,35 @@ class Selenium4Factory implements DriverFactory */ public function buildDriver(array $config) { - if (!class_exists('Behat\Mink\Driver\Selenium2Driver')) { + if (!class_exists('Behat\Mink\Driver\Selenium4Driver')) { throw new \RuntimeException(sprintf( - 'Install MinkSelenium2Driver in order to use %s driver.', + 'Install MinkSelenium4Driver in order to use %s driver.', $this->getDriverName() )); } - $extraCapabilities = $config['capabilities']['extra_capabilities']; - unset($config['capabilities']['extra_capabilities']); + dd($config); + + $desiredCapabilities = array( + 'capabilities' => $config['capabilities'], + 'tags' => array(php_uname('n'), 'PHP '.phpversion()) + ); if (getenv('TRAVIS_JOB_NUMBER')) { - $guessedCapabilities = array( - 'tunnel-identifier' => getenv('TRAVIS_JOB_NUMBER'), - 'build' => getenv('TRAVIS_BUILD_NUMBER'), - 'tags' => array('Travis-CI', 'PHP '.phpversion()), - ); - } elseif (getenv('JENKINS_HOME')) { - $guessedCapabilities = array( - 'tunnel-identifier' => getenv('JOB_NAME'), - 'build' => getenv('BUILD_NUMBER'), - 'tags' => array('Jenkins', 'PHP '.phpversion(), getenv('BUILD_TAG')), - ); - } else { - $guessedCapabilities = array( - 'tags' => array(php_uname('n'), 'PHP '.phpversion()), - ); + $desiredCapabilities['tunnel-identifier'] = getenv('TRAVIS_JOB_NUMBER'); + $desiredCapabilities['build'] = getenv('TRAVIS_BUILD_NUMBER'); + $desiredCapabilities['tags'] = array('Travis-CI', 'PHP '.phpversion()); } - return new Definition('Behat\Mink\Driver\Selenium2Driver', array( + if (getenv('JENKINS_HOME')) { + $desiredCapabilities['tunnel-identifier'] = getenv('JOB_NAME'); + $desiredCapabilities['build'] = getenv('BUILD_NUMBER'); + $desiredCapabilities['tags'] = array('Jenkins', 'PHP '.phpversion(), getenv('BUILD_TAG')); + } + dd($config['capabilities']); + return new Definition('Behat\Mink\Driver\Selenium4Driver', array( $config['browser'], - array_replace($guessedCapabilities, $extraCapabilities, $config['capabilities']), + $desiredCapabilities, $config['wd_host'], )); } @@ -93,81 +92,24 @@ class Selenium4Factory implements DriverFactory ->addDefaultsIfNotSet() ->normalizeKeys(false) ->children() - ->scalarNode('browserName')->end() - ->scalarNode('version')->end() - ->scalarNode('platform')->end() - ->scalarNode('browserVersion')->end() - ->scalarNode('browser')->defaultValue('firefox')->end() - ->booleanNode('marionette')->end() - ->booleanNode('ignoreZoomSetting')->defaultFalse()->end() - ->scalarNode('name')->defaultValue('Behat feature suite')->end() - ->scalarNode('deviceOrientation')->end() - ->scalarNode('deviceType')->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('overlappingCheckDisabled')->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() + ->arrayNode('firstMatch') ->end() - ->arrayNode('firefox') + ->arrayNode('alwaysMatch') ->children() - ->scalarNode('profile') - ->validate() - ->ifTrue(function ($v) { - return !file_exists($v); - }) - ->thenInvalid('Cannot find profile zip file %s') + ->scalarNode('browserName')->end() + ->scalarNode('pageLoadStrategy')->end() + ->arrayNode('goog:chromeOptions') + ->children() + ->arrayNode('extensions') + ->scalarPrototype()->end() + ->end() + ->arrayNode('args') + ->scalarPrototype()->end() + ->end() ->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() - ->arrayNode('prefs') - ->normalizeKeys(false) - ->useAttributeAsKey('name') - ->prototype('variable')->end() - ->end() - ->end() - ->validate() - ->ifTrue(function ($v) { - return empty($v['prefs']); - }) - ->then(function ($v) { - unset($v['prefs']); - return $v; - }) - ->end() - ->end() - ->arrayNode('extra_capabilities') - ->info('Custom capabilities merged with the known ones') - ->normalizeKeys(false) - ->useAttributeAsKey('name') - ->prototype('variable')->end() - ->end() ->end(); return $node; diff --git a/src/Behat/MinkExtension/ServiceContainer/MinkExtension.php b/src/Behat/MinkExtension/ServiceContainer/MinkExtension.php index 8c04752..a1209f8 100644 --- a/src/Behat/MinkExtension/ServiceContainer/MinkExtension.php +++ b/src/Behat/MinkExtension/ServiceContainer/MinkExtension.php @@ -19,6 +19,7 @@ use Behat\MinkExtension\ServiceContainer\Driver\GoutteFactory; use Behat\MinkExtension\ServiceContainer\Driver\SahiFactory; use Behat\MinkExtension\ServiceContainer\Driver\SauceLabsFactory; use Behat\MinkExtension\ServiceContainer\Driver\Selenium2Factory; +use Behat\MinkExtension\ServiceContainer\Driver\Selenium4Factory; use Behat\MinkExtension\ServiceContainer\Driver\SeleniumFactory; use Behat\MinkExtension\ServiceContainer\Driver\ZombieFactory; use Behat\Testwork\EventDispatcher\ServiceContainer\EventDispatcherExtension; @@ -56,6 +57,7 @@ class MinkExtension implements ExtensionInterface $this->registerDriverFactory(new SahiFactory()); $this->registerDriverFactory(new SeleniumFactory()); $this->registerDriverFactory(new Selenium2Factory()); + $this->registerDriverFactory(new Selenium4Factory()); $this->registerDriverFactory(new SauceLabsFactory()); $this->registerDriverFactory(new BrowserStackFactory()); $this->registerDriverFactory(new ZombieFactory()); From 4f0330276248c52c857a2d81b1e4837cc15b2878 Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Mon, 10 Jul 2023 16:35:29 +0800 Subject: [PATCH 3/3] Update --- .../Driver/Selenium4Factory.php | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php index 8c1a446..9e3a9f2 100644 --- a/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/Selenium4Factory.php @@ -58,28 +58,26 @@ class Selenium4Factory implements DriverFactory )); } - dd($config); - - $desiredCapabilities = array( + $args = array( 'capabilities' => $config['capabilities'], 'tags' => array(php_uname('n'), 'PHP '.phpversion()) ); if (getenv('TRAVIS_JOB_NUMBER')) { - $desiredCapabilities['tunnel-identifier'] = getenv('TRAVIS_JOB_NUMBER'); - $desiredCapabilities['build'] = getenv('TRAVIS_BUILD_NUMBER'); - $desiredCapabilities['tags'] = array('Travis-CI', 'PHP '.phpversion()); + $args['tunnel-identifier'] = getenv('TRAVIS_JOB_NUMBER'); + $args['build'] = getenv('TRAVIS_BUILD_NUMBER'); + $args['tags'] = array('Travis-CI', 'PHP '.phpversion()); } if (getenv('JENKINS_HOME')) { - $desiredCapabilities['tunnel-identifier'] = getenv('JOB_NAME'); - $desiredCapabilities['build'] = getenv('BUILD_NUMBER'); - $desiredCapabilities['tags'] = array('Jenkins', 'PHP '.phpversion(), getenv('BUILD_TAG')); + $args['tunnel-identifier'] = getenv('JOB_NAME'); + $args['build'] = getenv('BUILD_NUMBER'); + $args['tags'] = array('Jenkins', 'PHP '.phpversion(), getenv('BUILD_TAG')); } - dd($config['capabilities']); + return new Definition('Behat\Mink\Driver\Selenium4Driver', array( $config['browser'], - $desiredCapabilities, + $args, $config['wd_host'], )); }