From ead735819528e4c6b2367dfdae174e52659b3bca Mon Sep 17 00:00:00 2001 From: Sebastian Tiedtke Date: Mon, 4 Feb 2013 14:10:24 -0800 Subject: [PATCH 1/4] Added bin (npm install -g) for instruments socket client. --- app/bin.js | 4 ++-- app/uiauto/lib/instruments_client.js | 23 ++++++++++++++++------- instruments/client.js | 12 +++++++----- instruments/client_bin.js | 7 +++++++ package.json | 3 ++- 5 files changed, 34 insertions(+), 15 deletions(-) create mode 100755 instruments/client_bin.js diff --git a/app/bin.js b/app/bin.js index 06569f8d4..8f6d199ba 100644 --- a/app/bin.js +++ b/app/bin.js @@ -55,6 +55,6 @@ if (process.argv[2] === "shell") { else { var args = parser().parseArgs(); args.verbose = 1; - console.log("Pre-flight check ...".grey); - appium.run(args, function() { console.log('Rock and roll.'.grey); }); + //console.log("Pre-flight check ...".grey); + appium.run(args, function() { /* console.log('Rock and roll.'.grey); */ }); } diff --git a/app/uiauto/lib/instruments_client.js b/app/uiauto/lib/instruments_client.js index b65ef419a..6fc58dc66 100644 --- a/app/uiauto/lib/instruments_client.js +++ b/app/uiauto/lib/instruments_client.js @@ -6,27 +6,32 @@ var clientPath = 'instruments/client.js'; var defWaitForDataTimeout = 60; var waitForDataTimeout = defWaitForDataTimeout; -var getNodeBinaryPath = function() { - var res = system.performTaskWithPathArgumentsTimeout('/bin/bash', ['-c', 'which node'], 3); +var getBinaryPath = function(cmd) { + var res = system.performTaskWithPathArgumentsTimeout('/bin/bash', ['-c', 'which ' + cmd], 3); if (res.exitCode !== 0) { - throw new Error("Failed trying to get node.js binary path"); + throw new Error("Failed trying to get binary path " + cmd); } else { var path = res.stdout.trim(); if (path.length) { return path; } else { - throw new Error("Could not find a node.js binary, please make sure you have one available!"); + throw new Error("Could not find a binary for " + cmd + ", please make sure you have one available!"); } } }; var sendResultAndGetNext = function(result) { - var args = [clientPath, '-s', '/tmp/instruments_sock'], res; + var args = ['-s', '/tmp/instruments_sock'], res + , binaryPath = globalPath; + if (globalPath === null) { + binaryPath = nodePath; + args.unshift(clientPath); + } if (typeof result !== "undefined") { args = args.concat(['-r', JSON.stringify(result)]); } try { - res = system.performTaskWithPathArgumentsTimeout(nodePath, args, waitForDataTimeout); + res = system.performTaskWithPathArgumentsTimeout(binaryPath, args, waitForDataTimeout); } catch(e) { console.log("Socket timed out waiting for a new command, why wasn't there one?"); return null; @@ -43,4 +48,8 @@ var getFirstCommand = function() { return sendResultAndGetNext(); }; -var nodePath = getNodeBinaryPath(); +var globalPath = null; +try { + globalPath = getBinaryPath('instruments_client'); +} catch (e) { } +var nodePath = getBinaryPath('node'); diff --git a/instruments/client.js b/instruments/client.js index b64948003..148916ced 100644 --- a/instruments/client.js +++ b/instruments/client.js @@ -20,16 +20,18 @@ var connect = function(args) { }); }; +var parser = new ap({ + version: '0.0.1', +}); +parser.addArgument(['-r', '--result'], {defaultValue: null, required: false}); +parser.addArgument(['-s', '--socket'], {defaultValue: '/tmp/instruments_sock', required: false}); + if (module === require.main) { - var parser = new ap({ - version: '0.0.1', - }); - parser.addArgument(['-r', '--result'], {defaultValue: null, required: false}); - parser.addArgument(['-s', '--socket'], {defaultValue: '/tmp/instruments_sock', required: false}); var args = parser.parseArgs(); connect(args); } +module.exports.parser = parser; module.exports.connect = function(result, socket) { var args = {result: result, socket: socket}; connect(args); diff --git a/instruments/client_bin.js b/instruments/client_bin.js new file mode 100755 index 000000000..b24af8099 --- /dev/null +++ b/instruments/client_bin.js @@ -0,0 +1,7 @@ +#!/usr/bin/env node +"use strict"; + +var client = require('./client.js') + +var args = client.parser.parseArgs(); +client.connect(args.result, args.socket); diff --git a/package.json b/package.json index f166ec866..90cb9b7cc 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ ], "main": "./server.js", "bin": { - "appium": "./app/bin.js" + "appium": "./app/bin.js", + "instruments_client": "./instruments/client_bin.js" }, "directories": { "lib": "./app" From 8989a33336ce67b5617989d033bece406499b8ec Mon Sep 17 00:00:00 2001 From: Jason Carr Date: Mon, 4 Feb 2013 12:23:32 -0800 Subject: [PATCH 2/4] Python example on Sauce. --- sample-code/examples/python/sauce.py | 57 ++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 sample-code/examples/python/sauce.py diff --git a/sample-code/examples/python/sauce.py b/sample-code/examples/python/sauce.py new file mode 100644 index 000000000..a2bd14127 --- /dev/null +++ b/sample-code/examples/python/sauce.py @@ -0,0 +1,57 @@ +"""An example of Appium running on Sauce. + +This test assumes SAUCE_USERNAME and SAUCE_ACCESS_KEY are environment variables +set to your Sauce Labs username and access key.""" + +import unittest +import os +from random import randint +from selenium import webdriver + +SAUCE_USERNAME=os.environ.get('SAUCE_USERNAME') +SAUCE_ACCESS_KEY=os.environ.get('SAUCE_ACCESS_KEY') + + +class TestSequenceFunctions(unittest.TestCase): + + def setUp(self): + # set up appium + app = "https://raw.github.com/appium/appium/master/assets/TestApp.app.zip" + self.driver = webdriver.Remote( + command_executor='http://%s:%s@ondemand.saucelabs.com:80/wd/hub' % (SAUCE_USERNAME, SAUCE_ACCESS_KEY), + desired_capabilities={ + 'browserName': 'iOS 6.0', + 'platform': 'Mac 10.8', + 'device': 'iPhone Simulator', + 'app': app + }) + self._values = [] + + def _populate(self): + # populate text fields with two random number + elems = self.driver.find_elements_by_tag_name('textField') + for elem in elems: + rndNum = randint(0, 10) + elem.send_keys(rndNum) + self._values.append(rndNum) + + def test_ui_computation(self): + # populate text fields with values + self._populate() + # trigger computation by using the button + buttons = self.driver.find_elements_by_tag_name("button") + buttons[0].click() + # is sum equal ? + texts = self.driver.find_elements_by_tag_name("staticText") + self.assertEqual(int(texts[0].text), self._values[0] + self._values[1]) + + def tearDown(self): + print("Link to your job: https://saucelabs.com/jobs/%s" % self.driver.session_id) + self.driver.quit() + + +if __name__ == '__main__': + if not (SAUCE_USERNAME and SAUCE_ACCESS_KEY): + print "Make sure you have SAUCE_USERNAME and SAUCE_ACCESS_KEY set as environment variables." + else: + unittest.main() From 69676434070aa1a9c1021e34ec0f8a6ae3e59e36 Mon Sep 17 00:00:00 2001 From: Sebastian Tiedtke Date: Mon, 4 Feb 2013 14:18:28 -0800 Subject: [PATCH 3/4] Fixing all the lintz! --- instruments/client_bin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instruments/client_bin.js b/instruments/client_bin.js index b24af8099..780515d76 100755 --- a/instruments/client_bin.js +++ b/instruments/client_bin.js @@ -1,7 +1,7 @@ #!/usr/bin/env node "use strict"; -var client = require('./client.js') +var client = require('./client.js'); var args = client.parser.parseArgs(); client.connect(args.result, args.socket); From a473f30743d9428b62d34d353eb1722e2c52c86d Mon Sep 17 00:00:00 2001 From: Sebastian Tiedtke Date: Mon, 4 Feb 2013 14:29:06 -0800 Subject: [PATCH 4/4] Bump version for npm publish. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 90cb9b7cc..d198c0b3d 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "automation", "javascript" ], - "version": "0.0.3", + "version": "0.0.4", "author": "appium-discuss@googlegroups.com", "repository": { "type": "git",