From b145b0d8534901ee639fc5ad67a6b8c79b2442c0 Mon Sep 17 00:00:00 2001 From: Shashikant Date: Sat, 31 Jan 2015 23:40:32 +0000 Subject: [PATCH 1/8] Created Appium Factory to support Appium capabilities Appium capabilities are added to Mink extension to execute native, hybrid and web mobile tests. --- .../ServiceContainer/Driver/AppiumFactory.php | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php new file mode 100644 index 0000000..7eafda5 --- /dev/null +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php @@ -0,0 +1,129 @@ + + * + * 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 AppiumFactory extends Selenium2Factory +{ + /** + * {@inheritdoc} + */ + public function getDriverName() + { + return 'appium'; + } + + /** + * {@inheritdoc} + */ + public function configure(ArrayNodeDefinition $builder) + { + $builder + ->children() + ->scalarNode('browser')->defaultValue('remote')->end() + ->append($this->getCapabilitiesNode()) + ->end() + ; + } + + /** + * {@inheritdoc} + */ + public function buildDriver(array $config) + { + $host = '0.0.0.0:4723'; + + $config['wd_host'] = sprintf('%s/wd/hub', $host); + + return parent::buildDriver($config); + } + + protected function getCapabilitiesNode() + { + $node = parent::getCapabilitiesNode(); + + $node + ->children() + ->scalarNode('automationName')->defaultValue('Appium')->end() + ->scalarNode('platformName')->defaultValue('iOS')->end() + ->scalarNode('platformVersion')->defaultValue('8.1')->end() + ->scalarNode('deviceName')->end() + ->scalarNode('app')->end() + ->scalarNode('browserName')->end() + ->scalarNode('newCommandTimeout')->end() + ->booleanNode('autoLaunch')->end() + ->scalarNode('language')->end() + ->scalarNode('locale')->end() + ->scalarNode('udid')->end() + ->scalarNode('orientation')->end() + ->booleanNode('autoWebview')->end() + ->booleanNode('noReset')->end() + ->booleanNode('fullReset')->end() + //ANDROID ONLY + ->scalarNode('appActivity')->end() + ->scalarNode('appPackage')->end() + ->scalarNode('appWaitActivity')->end() + ->scalarNode('appWaitPackage')->end() + ->scalarNode('deviceReadyTimeout')->end() + ->scalarNode('androidCoverage')->end() + ->scalarNode('androidDeviceReadyTimeout')->end() + ->scalarNode('androidDeviceSocket')->end() + ->scalarNode('avd')->end() + ->scalarNode('avdLaunchTimeout')->end() + ->scalarNode('avdReadyTimeout')->end() + ->scalarNode('avdArgs')->end() + ->scalarNode('keystorePassword')->end() + ->scalarNode('keystorePath')->end() + ->scalarNode('keyAlias')->end() + ->scalarNode('keyPassword')->end() + ->scalarNode('chromedriverExecutable')->end() + ->scalarNode('autoWebviewTimeout')->end() + ->scalarNode('intentAction')->end() + ->scalarNode('intentCategory')->end() + ->scalarNode('intentFlags')->end() + ->scalarNode('optionalIntentArguments')->end() + ->booleanNode('enablePerformanceLogging')->end() + ->booleanNode('useKeystore')->end() + ->booleanNode('stopAppOnReset')->end() + ->booleanNode('unicodeKeyboard')->end() + ->booleanNode('resetKeyboard')->end() + ->booleanNode('noSign')->end() + ->booleanNode('ignoreUnimportantViews')->end() + // IOS ONLY + ->scalarNode('calendarFormat')->end() + ->scalarNode('bundleId')->end() + ->scalarNode('udid')->end() + ->scalarNode('launchTimeout')->end() + ->scalarNode('localizableStringsDir')->end() + ->scalarNode('processArguments')->end() + ->scalarNode('interKeyDelay')->end() + ->scalarNode('sendKeyStrategy')->end() + ->scalarNode('screenshotWaitTimeout')->end() + ->scalarNode('waitForAppScript')->end() + ->booleanNode('locationServicesEnabled')->end() + ->booleanNode('locationServicesAuthorized')->end() + ->booleanNode('autoAcceptAlerts')->end() + ->booleanNode('autoDismissAlerts')->end() + ->booleanNode('nativeInstrumentsLib')->end() + ->booleanNode('nativeWebTap')->end() + ->booleanNode('safariAllowPopups')->end() + ->booleanNode('safariIgnoreFraudWarning')->end() + ->booleanNode('safariOpenLinksInBackground')->end() + ->booleanNode('keepKeyChains')->end() + ->booleanNode('showIOSLog')->end() + + ->end() + ; + + return $node; + } +} From 78b0a2f0fa5b0c9461a060ffb81e54d4d1673a36 Mon Sep 17 00:00:00 2001 From: Shashikant Date: Sat, 31 Jan 2015 23:42:08 +0000 Subject: [PATCH 2/8] Added AppiumFactory to MinkExtension file --- src/Behat/MinkExtension/ServiceContainer/MinkExtension.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Behat/MinkExtension/ServiceContainer/MinkExtension.php b/src/Behat/MinkExtension/ServiceContainer/MinkExtension.php index aac4831..ff29b3c 100644 --- a/src/Behat/MinkExtension/ServiceContainer/MinkExtension.php +++ b/src/Behat/MinkExtension/ServiceContainer/MinkExtension.php @@ -11,6 +11,7 @@ namespace Behat\MinkExtension\ServiceContainer; use Behat\Behat\Context\ServiceContainer\ContextExtension; +use Behat\MinkExtension\ServiceContainer\Driver\AppiumFactory; use Behat\MinkExtension\ServiceContainer\Driver\BrowserStackFactory; use Behat\MinkExtension\ServiceContainer\Driver\DriverFactory; use Behat\MinkExtension\ServiceContainer\Driver\GoutteFactory; @@ -56,6 +57,7 @@ class MinkExtension implements ExtensionInterface $this->registerDriverFactory(new SauceLabsFactory()); $this->registerDriverFactory(new BrowserStackFactory()); $this->registerDriverFactory(new ZombieFactory()); + $this->registerDriverFactory(new AppiumFactory()); } public function registerDriverFactory(DriverFactory $driverFactory) From 05c791c556c46975d0242ef6a5ea18b4c6125b4a Mon Sep 17 00:00:00 2001 From: Shashikant Date: Wed, 11 Feb 2015 19:56:39 +0000 Subject: [PATCH 3/8] Create AppiumFactorySpec.php --- .../Driver/AppiumFactorySpec.php | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 spec/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactorySpec.php diff --git a/spec/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactorySpec.php b/spec/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactorySpec.php new file mode 100644 index 0000000..bfc9bf1 --- /dev/null +++ b/spec/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactorySpec.php @@ -0,0 +1,23 @@ +shouldHaveType('Behat\MinkExtension\ServiceContainer\Driver\DriverFactory'); + } + + function it_is_named_appium() + { + $this->getDriverName()->shouldReturn('appium'); + } + + function it_supports_javascript() + { + $this->supportsJavascript()->shouldBe(true); + } +} From 4f3c1a6ae5ad15703cef6358824f30b4e62a2815 Mon Sep 17 00:00:00 2001 From: Shashikant Date: Wed, 11 Feb 2015 20:05:49 +0000 Subject: [PATCH 4/8] removing default values as it may cause issue --- .../MinkExtension/ServiceContainer/Driver/AppiumFactory.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php index 7eafda5..0da9b1f 100644 --- a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php @@ -54,8 +54,8 @@ class AppiumFactory extends Selenium2Factory $node ->children() ->scalarNode('automationName')->defaultValue('Appium')->end() - ->scalarNode('platformName')->defaultValue('iOS')->end() - ->scalarNode('platformVersion')->defaultValue('8.1')->end() + ->scalarNode('platformName')->end() + ->scalarNode('platformVersion')->end() ->scalarNode('deviceName')->end() ->scalarNode('app')->end() ->scalarNode('browserName')->end() From 976f9c32daf294c9d82ceae23db81f0adbd93080 Mon Sep 17 00:00:00 2001 From: Shashikant Date: Mon, 2 Mar 2015 19:34:10 +0000 Subject: [PATCH 5/8] Refactoring as per stof 's sugestions --- .../ServiceContainer/Driver/AppiumFactory.php | 137 +++++++++--------- 1 file changed, 65 insertions(+), 72 deletions(-) diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php index 0da9b1f..db7e948 100644 --- a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php @@ -1,12 +1,5 @@ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ namespace Behat\MinkExtension\ServiceContainer\Driver; @@ -53,73 +46,73 @@ class AppiumFactory extends Selenium2Factory $node ->children() - ->scalarNode('automationName')->defaultValue('Appium')->end() - ->scalarNode('platformName')->end() - ->scalarNode('platformVersion')->end() - ->scalarNode('deviceName')->end() - ->scalarNode('app')->end() - ->scalarNode('browserName')->end() - ->scalarNode('newCommandTimeout')->end() - ->booleanNode('autoLaunch')->end() - ->scalarNode('language')->end() - ->scalarNode('locale')->end() - ->scalarNode('udid')->end() - ->scalarNode('orientation')->end() - ->booleanNode('autoWebview')->end() - ->booleanNode('noReset')->end() - ->booleanNode('fullReset')->end() + ->scalarNode('automationName')->defaultValue('Appium')->end() + ->scalarNode('platformName')->end() + ->scalarNode('platformVersion')->end() + ->scalarNode('deviceName')->end() + ->scalarNode('app')->end() + ->scalarNode('browserName')->end() + ->scalarNode('newCommandTimeout')->end() + ->booleanNode('autoLaunch')->end() + ->scalarNode('language')->end() + ->scalarNode('locale')->end() + ->scalarNode('udid')->end() + ->scalarNode('orientation')->end() + ->booleanNode('autoWebview')->end() + ->booleanNode('noReset')->end() + ->booleanNode('fullReset')->end() //ANDROID ONLY - ->scalarNode('appActivity')->end() - ->scalarNode('appPackage')->end() - ->scalarNode('appWaitActivity')->end() - ->scalarNode('appWaitPackage')->end() - ->scalarNode('deviceReadyTimeout')->end() - ->scalarNode('androidCoverage')->end() - ->scalarNode('androidDeviceReadyTimeout')->end() - ->scalarNode('androidDeviceSocket')->end() - ->scalarNode('avd')->end() - ->scalarNode('avdLaunchTimeout')->end() - ->scalarNode('avdReadyTimeout')->end() - ->scalarNode('avdArgs')->end() - ->scalarNode('keystorePassword')->end() - ->scalarNode('keystorePath')->end() - ->scalarNode('keyAlias')->end() - ->scalarNode('keyPassword')->end() - ->scalarNode('chromedriverExecutable')->end() - ->scalarNode('autoWebviewTimeout')->end() - ->scalarNode('intentAction')->end() - ->scalarNode('intentCategory')->end() - ->scalarNode('intentFlags')->end() - ->scalarNode('optionalIntentArguments')->end() - ->booleanNode('enablePerformanceLogging')->end() - ->booleanNode('useKeystore')->end() - ->booleanNode('stopAppOnReset')->end() - ->booleanNode('unicodeKeyboard')->end() - ->booleanNode('resetKeyboard')->end() - ->booleanNode('noSign')->end() - ->booleanNode('ignoreUnimportantViews')->end() + ->scalarNode('appActivity')->end() + ->scalarNode('appPackage')->end() + ->scalarNode('appWaitActivity')->end() + ->scalarNode('appWaitPackage')->end() + ->scalarNode('deviceReadyTimeout')->end() + ->scalarNode('androidCoverage')->end() + ->scalarNode('androidDeviceReadyTimeout')->end() + ->scalarNode('androidDeviceSocket')->end() + ->scalarNode('avd')->end() + ->scalarNode('avdLaunchTimeout')->end() + ->scalarNode('avdReadyTimeout')->end() + ->scalarNode('avdArgs')->end() + ->scalarNode('keystorePassword')->end() + ->scalarNode('keystorePath')->end() + ->scalarNode('keyAlias')->end() + ->scalarNode('keyPassword')->end() + ->scalarNode('chromedriverExecutable')->end() + ->scalarNode('autoWebviewTimeout')->end() + ->scalarNode('intentAction')->end() + ->scalarNode('intentCategory')->end() + ->scalarNode('intentFlags')->end() + ->scalarNode('optionalIntentArguments')->end() + ->booleanNode('enablePerformanceLogging')->end() + ->booleanNode('useKeystore')->end() + ->booleanNode('stopAppOnReset')->end() + ->booleanNode('unicodeKeyboard')->end() + ->booleanNode('resetKeyboard')->end() + ->booleanNode('noSign')->end() + ->booleanNode('ignoreUnimportantViews')->end() // IOS ONLY - ->scalarNode('calendarFormat')->end() - ->scalarNode('bundleId')->end() - ->scalarNode('udid')->end() - ->scalarNode('launchTimeout')->end() - ->scalarNode('localizableStringsDir')->end() - ->scalarNode('processArguments')->end() - ->scalarNode('interKeyDelay')->end() - ->scalarNode('sendKeyStrategy')->end() - ->scalarNode('screenshotWaitTimeout')->end() - ->scalarNode('waitForAppScript')->end() - ->booleanNode('locationServicesEnabled')->end() - ->booleanNode('locationServicesAuthorized')->end() - ->booleanNode('autoAcceptAlerts')->end() - ->booleanNode('autoDismissAlerts')->end() - ->booleanNode('nativeInstrumentsLib')->end() - ->booleanNode('nativeWebTap')->end() - ->booleanNode('safariAllowPopups')->end() - ->booleanNode('safariIgnoreFraudWarning')->end() - ->booleanNode('safariOpenLinksInBackground')->end() - ->booleanNode('keepKeyChains')->end() - ->booleanNode('showIOSLog')->end() + ->scalarNode('calendarFormat')->end() + ->scalarNode('bundleId')->end() + ->scalarNode('udid')->end() + ->scalarNode('launchTimeout')->end() + ->scalarNode('localizableStringsDir')->end() + ->scalarNode('processArguments')->end() + ->scalarNode('interKeyDelay')->end() + ->scalarNode('sendKeyStrategy')->end() + ->scalarNode('screenshotWaitTimeout')->end() + ->scalarNode('waitForAppScript')->end() + ->booleanNode('locationServicesEnabled')->end() + ->booleanNode('locationServicesAuthorized')->end() + ->booleanNode('autoAcceptAlerts')->end() + ->booleanNode('autoDismissAlerts')->end() + ->booleanNode('nativeInstrumentsLib')->end() + ->booleanNode('nativeWebTap')->end() + ->booleanNode('safariAllowPopups')->end() + ->booleanNode('safariIgnoreFraudWarning')->end() + ->booleanNode('safariOpenLinksInBackground')->end() + ->booleanNode('keepKeyChains')->end() + ->booleanNode('showIOSLog')->end() ->end() ; From a22995541def680be5b8f8add41f5b6b0a95d9ff Mon Sep 17 00:00:00 2001 From: Shashikant Date: Mon, 2 Mar 2015 20:37:05 +0000 Subject: [PATCH 6/8] Added Appium host and port config --- .../MinkExtension/ServiceContainer/Driver/AppiumFactory.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php index db7e948..d1b6c9a 100644 --- a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php @@ -24,6 +24,8 @@ class AppiumFactory extends Selenium2Factory ->children() ->scalarNode('browser')->defaultValue('remote')->end() ->append($this->getCapabilitiesNode()) + ->scalarNode('appium_host')->defaultValue(getenv('APPIUM_HOST'))->end() + ->scalarNode('appium_port')->defaultValue(getenv('APPIUM_PORT'))->end() ->end() ; } @@ -33,7 +35,7 @@ class AppiumFactory extends Selenium2Factory */ public function buildDriver(array $config) { - $host = '0.0.0.0:4723'; + $host = $config['appium_host'].":".$config['appium_port']; $config['wd_host'] = sprintf('%s/wd/hub', $host); From 141c8151cbd6171363183cdcf43942e736b2839a Mon Sep 17 00:00:00 2001 From: Shashikant Date: Sat, 7 Mar 2015 10:28:55 +0000 Subject: [PATCH 7/8] Removed ENV variables and added Appium default server and port --- .../MinkExtension/ServiceContainer/Driver/AppiumFactory.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php index d1b6c9a..c9eb9b6 100644 --- a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php @@ -24,8 +24,8 @@ class AppiumFactory extends Selenium2Factory ->children() ->scalarNode('browser')->defaultValue('remote')->end() ->append($this->getCapabilitiesNode()) - ->scalarNode('appium_host')->defaultValue(getenv('APPIUM_HOST'))->end() - ->scalarNode('appium_port')->defaultValue(getenv('APPIUM_PORT'))->end() + ->scalarNode('appium_host')->defaultValue('0.0.0.0')->end() + ->scalarNode('appium_port')->defaultValue('4723')->end() ->end() ; } From f982c9e959150325f3513e80751450945bb048d4 Mon Sep 17 00:00:00 2001 From: Shashikant Date: Tue, 31 Mar 2015 21:18:34 +0100 Subject: [PATCH 8/8] used 4 space per indentation --- .../ServiceContainer/Driver/AppiumFactory.php | 139 +++++++++--------- 1 file changed, 69 insertions(+), 70 deletions(-) diff --git a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php index c9eb9b6..195d82e 100644 --- a/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php +++ b/src/Behat/MinkExtension/ServiceContainer/Driver/AppiumFactory.php @@ -22,10 +22,10 @@ class AppiumFactory extends Selenium2Factory { $builder ->children() - ->scalarNode('browser')->defaultValue('remote')->end() - ->append($this->getCapabilitiesNode()) - ->scalarNode('appium_host')->defaultValue('0.0.0.0')->end() - ->scalarNode('appium_port')->defaultValue('4723')->end() + ->scalarNode('browser')->defaultValue('remote')->end() + ->append($this->getCapabilitiesNode()) + ->scalarNode('appium_host')->defaultValue('0.0.0.0')->end() + ->scalarNode('appium_port')->defaultValue('4723')->end() ->end() ; } @@ -48,74 +48,73 @@ class AppiumFactory extends Selenium2Factory $node ->children() - ->scalarNode('automationName')->defaultValue('Appium')->end() - ->scalarNode('platformName')->end() - ->scalarNode('platformVersion')->end() - ->scalarNode('deviceName')->end() - ->scalarNode('app')->end() - ->scalarNode('browserName')->end() - ->scalarNode('newCommandTimeout')->end() - ->booleanNode('autoLaunch')->end() - ->scalarNode('language')->end() - ->scalarNode('locale')->end() - ->scalarNode('udid')->end() - ->scalarNode('orientation')->end() - ->booleanNode('autoWebview')->end() - ->booleanNode('noReset')->end() - ->booleanNode('fullReset')->end() + ->scalarNode('automationName')->defaultValue('Appium')->end() + ->scalarNode('platformName')->end() + ->scalarNode('platformVersion')->end() + ->scalarNode('deviceName')->end() + ->scalarNode('app')->end() + ->scalarNode('browserName')->end() + ->scalarNode('newCommandTimeout')->end() + ->booleanNode('autoLaunch')->end() + ->scalarNode('language')->end() + ->scalarNode('locale')->end() + ->scalarNode('udid')->end() + ->scalarNode('orientation')->end() + ->booleanNode('autoWebview')->end() + ->booleanNode('noReset')->end() + ->booleanNode('fullReset')->end() //ANDROID ONLY - ->scalarNode('appActivity')->end() - ->scalarNode('appPackage')->end() - ->scalarNode('appWaitActivity')->end() - ->scalarNode('appWaitPackage')->end() - ->scalarNode('deviceReadyTimeout')->end() - ->scalarNode('androidCoverage')->end() - ->scalarNode('androidDeviceReadyTimeout')->end() - ->scalarNode('androidDeviceSocket')->end() - ->scalarNode('avd')->end() - ->scalarNode('avdLaunchTimeout')->end() - ->scalarNode('avdReadyTimeout')->end() - ->scalarNode('avdArgs')->end() - ->scalarNode('keystorePassword')->end() - ->scalarNode('keystorePath')->end() - ->scalarNode('keyAlias')->end() - ->scalarNode('keyPassword')->end() - ->scalarNode('chromedriverExecutable')->end() - ->scalarNode('autoWebviewTimeout')->end() - ->scalarNode('intentAction')->end() - ->scalarNode('intentCategory')->end() - ->scalarNode('intentFlags')->end() - ->scalarNode('optionalIntentArguments')->end() - ->booleanNode('enablePerformanceLogging')->end() - ->booleanNode('useKeystore')->end() - ->booleanNode('stopAppOnReset')->end() - ->booleanNode('unicodeKeyboard')->end() - ->booleanNode('resetKeyboard')->end() - ->booleanNode('noSign')->end() - ->booleanNode('ignoreUnimportantViews')->end() + ->scalarNode('appActivity')->end() + ->scalarNode('appPackage')->end() + ->scalarNode('appWaitActivity')->end() + ->scalarNode('appWaitPackage')->end() + ->scalarNode('deviceReadyTimeout')->end() + ->scalarNode('androidCoverage')->end() + ->scalarNode('androidDeviceReadyTimeout')->end() + ->scalarNode('androidDeviceSocket')->end() + ->scalarNode('avd')->end() + ->scalarNode('avdLaunchTimeout')->end() + ->scalarNode('avdReadyTimeout')->end() + ->scalarNode('avdArgs')->end() + ->scalarNode('keystorePassword')->end() + ->scalarNode('keystorePath')->end() + ->scalarNode('keyAlias')->end() + ->scalarNode('keyPassword')->end() + ->scalarNode('chromedriverExecutable')->end() + ->scalarNode('autoWebviewTimeout')->end() + ->scalarNode('intentAction')->end() + ->scalarNode('intentCategory')->end() + ->scalarNode('intentFlags')->end() + ->scalarNode('optionalIntentArguments')->end() + ->booleanNode('enablePerformanceLogging')->end() + ->booleanNode('useKeystore')->end() + ->booleanNode('stopAppOnReset')->end() + ->booleanNode('unicodeKeyboard')->end() + ->booleanNode('resetKeyboard')->end() + ->booleanNode('noSign')->end() + ->booleanNode('ignoreUnimportantViews')->end() // IOS ONLY - ->scalarNode('calendarFormat')->end() - ->scalarNode('bundleId')->end() - ->scalarNode('udid')->end() - ->scalarNode('launchTimeout')->end() - ->scalarNode('localizableStringsDir')->end() - ->scalarNode('processArguments')->end() - ->scalarNode('interKeyDelay')->end() - ->scalarNode('sendKeyStrategy')->end() - ->scalarNode('screenshotWaitTimeout')->end() - ->scalarNode('waitForAppScript')->end() - ->booleanNode('locationServicesEnabled')->end() - ->booleanNode('locationServicesAuthorized')->end() - ->booleanNode('autoAcceptAlerts')->end() - ->booleanNode('autoDismissAlerts')->end() - ->booleanNode('nativeInstrumentsLib')->end() - ->booleanNode('nativeWebTap')->end() - ->booleanNode('safariAllowPopups')->end() - ->booleanNode('safariIgnoreFraudWarning')->end() - ->booleanNode('safariOpenLinksInBackground')->end() - ->booleanNode('keepKeyChains')->end() - ->booleanNode('showIOSLog')->end() - + ->scalarNode('calendarFormat')->end() + ->scalarNode('bundleId')->end() + ->scalarNode('udid')->end() + ->scalarNode('launchTimeout')->end() + ->scalarNode('localizableStringsDir')->end() + ->scalarNode('processArguments')->end() + ->scalarNode('interKeyDelay')->end() + ->scalarNode('sendKeyStrategy')->end() + ->scalarNode('screenshotWaitTimeout')->end() + ->scalarNode('waitForAppScript')->end() + ->booleanNode('locationServicesEnabled')->end() + ->booleanNode('locationServicesAuthorized')->end() + ->booleanNode('autoAcceptAlerts')->end() + ->booleanNode('autoDismissAlerts')->end() + ->booleanNode('nativeInstrumentsLib')->end() + ->booleanNode('nativeWebTap')->end() + ->booleanNode('safariAllowPopups')->end() + ->booleanNode('safariIgnoreFraudWarning')->end() + ->booleanNode('safariOpenLinksInBackground')->end() + ->booleanNode('keepKeyChains')->end() + ->booleanNode('showIOSLog')->end() ->end() ;