diff --git a/README.md b/README.md index 4307b11..16be50d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# webdriverio-browserstack +# webdriverio-appium-app-browserstack [WebdriverIO](http://webdriver.io/) Integration with BrowserStack. ![BrowserStack Logo](https://d98b8t1nnulk5.cloudfront.net/production/images/layout/logo-header.png?1469004780) @@ -11,13 +11,22 @@ * Update `*.conf.js` files inside the `conf/` directory with your [BrowserStack Username and Access Key](https://www.browserstack.com/accounts/settings) ## Running your tests +- Upload your Native App (.apk file) to BrowserStack servers using upload API: + + ``` + curl -u "username:accesskey" -X POST "https://api.browserstack.com/app-automate/upload" -F "file=@/path/to/app/file/Application-debug.apk" + ``` + +- If you do not have an .apk file and looking to simply try App Automate, [you can download our sample app and upload](https://www.browserstack.com/app-automate/sample-apps/android/WikipediaSample.apk) +to the BrowserStack servers using the above API. +- Update the desired capability "app" with the App URL returned from the above API call - To run a single test, run `npm run single` - To run parallel tests, run `npm run parallel` - To run local tests, run `npm run local` ## Notes * You can view your test results on the [BrowserStack automate dashboard](https://www.browserstack.com/automate) -* To test on a different set of browsers, check out our [platform configurator](https://www.browserstack.com/automate/node#setting-os-and-browser) +* Refer [Get Started](https://www.browserstack.com/app-automate/get-started#getting-started) document to configure the capabilities * You can export the environment variables for the Username and Access Key of your BrowserStack account ``` @@ -26,7 +35,4 @@ ``` ## Additional Resources -* [Documentation for writing automate test scripts in Node](https://www.browserstack.com/automate/node) -* [Customizing your tests on BrowserStack](https://www.browserstack.com/automate/capabilities) -* [Browsers & mobile devices for selenium testing on BrowserStack](https://www.browserstack.com/list-of-browsers-and-platforms?product=automate) -* [Using REST API to access information about your tests via the command-line interface](https://www.browserstack.com/automate/rest-api) +* [Getting Started with App Automate](https://www.browserstack.com/app-automate/get-started) diff --git a/conf/local.conf.js b/conf/local.conf.js index b97fb1e..4953910 100644 --- a/conf/local.conf.js +++ b/conf/local.conf.js @@ -11,10 +11,14 @@ exports.config = { exclude: [], capabilities: [{ - browser: 'chrome', - name: 'local_test', + name: 'local_appium_test', build: 'webdriver-browserstack', - 'browserstack.local': true + realMobile: true, + device: 'Google Pixel', + browserName: 'android', + app: 'bs://', + 'browserstack.local': true, + 'browserstack.debug': true }], logLevel: 'verbose', @@ -27,7 +31,8 @@ exports.config = { framework: 'mocha', mochaOpts: { - ui: 'bdd' + ui: 'bdd', + timeout: 20000 }, // Code to start browserstack local before start of test @@ -48,4 +53,4 @@ exports.config = { onComplete: function (capabilties, specs) { exports.bs_local.stop(function() {}); } -} +}; diff --git a/conf/multiple.conf.js b/conf/multiple.conf.js index 9681568..8467e97 100644 --- a/conf/multiple.conf.js +++ b/conf/multiple.conf.js @@ -9,9 +9,13 @@ exports.config = { exclude: [], capabilities: [{ - browser: 'chrome', - name: 'multiple_test', - build: 'webdriver-browserstack' + name: 'multiple_appium_test', + build: 'webdriver-browserstack', + realMobile: true, + device: 'Google Nexus 9', + browserName: 'android', + app: 'bs://', + 'browserstack.debug': true }], logLevel: 'verbose', @@ -21,9 +25,10 @@ exports.config = { waitforTimeout: 10000, connectionRetryTimeout: 90000, connectionRetryCount: 3, - + framework: 'mocha', mochaOpts: { - ui: 'bdd' + ui: 'bdd', + timeout: 30000 } -} +}; diff --git a/conf/parallel.conf.js b/conf/parallel.conf.js index 3a498ee..11b2796 100644 --- a/conf/parallel.conf.js +++ b/conf/parallel.conf.js @@ -10,18 +10,22 @@ exports.config = { maxInstances: 10, commonCapabilities: { - name: 'parallel_test', - build: 'webdriver-browserstack' + name: 'parallel_appium_test', + build: 'webdriver-browserstack', + realMobile: true, + browserName: 'android', + app: 'bs://', + 'browserstack.debug': true }, capabilities: [{ - browser: 'chrome' - },{ - browser: 'firefox' - },{ - browser: 'internet explorer' - },{ - browser: 'safari' + device: 'Google Pixel' + }, { + device: 'Samsung Galaxy S7' + }, { + device: 'Samsung Galaxy S6' + }, { + device: 'Google Nexus 9' }], logLevel: 'verbose', @@ -31,15 +35,15 @@ exports.config = { waitforTimeout: 10000, connectionRetryTimeout: 90000, connectionRetryCount: 3, - + framework: 'mocha', mochaOpts: { - ui: 'bdd' + ui: 'bdd', + timeout: 20000 } -} +}; // Code to support common capabilities exports.config.capabilities.forEach(function(caps){ for(var i in exports.config.commonCapabilities) caps[i] = caps[i] || exports.config.commonCapabilities[i]; }); - diff --git a/conf/single.conf.js b/conf/single.conf.js index a58de58..4ce0367 100644 --- a/conf/single.conf.js +++ b/conf/single.conf.js @@ -9,9 +9,13 @@ exports.config = { exclude: [], capabilities: [{ - browser: 'chrome', - name: 'single_test', - build: 'webdriver-browserstack' + name: 'single_appium_test', + build: 'webdriver-browserstack', + realMobile: true, + device: 'Samsung Galaxy S7', + browserName: 'android', + app: 'bs://', + 'browserstack.debug': true }], logLevel: 'verbose', @@ -21,9 +25,10 @@ exports.config = { waitforTimeout: 10000, connectionRetryTimeout: 90000, connectionRetryCount: 3, - + framework: 'mocha', mochaOpts: { - ui: 'bdd' + ui: 'bdd', + timeout: 20000 } -} +}; diff --git a/package.json b/package.json index f68f3d9..4478f17 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "webdriverio-browserstack", + "name": "webdriverio-appium-app-browserstack", "version": "0.1.0", "readme": "WendriverIO Integration with [BrowserStack](https://www.browserstack.com)", - "description": "Selenium examples for WebdriverIO and BrowserStack Automate", + "description": "Selenium examples for WebdriverIO and BrowserStack App Automate", "scripts": { "test": "npm run single && npm run local && npm run parallel", "single": "./node_modules/.bin/wdio conf/single.conf.js", @@ -12,18 +12,18 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/browserstack/webdriverio-browserstack.git" + "url": "git+https://github.com/browserstack/webdriverio-appium-app-browserstack.git" }, "keywords": [ "webdriverio", "browserstack", - "selenium", + "appium", "tests" ], "bugs": { - "url": "https://github.com/browserstack/webdriverio-browserstack/issues" + "url": "https://github.com/browserstack/webdriverio-appium-app-browserstack/issues" }, - "homepage": "https://github.com/browserstack/webdriverio-browserstack#readme", + "homepage": "https://github.com/browserstack/webdriverio-appium-app-browserstack#readme", "dependencies": { "browserstack-local": "^1.0.0", "webdriverio": "^4.0.5" diff --git a/tests/specs/local_test.js b/tests/specs/local_test.js index 5a57a42..d43a9b2 100644 --- a/tests/specs/local_test.js +++ b/tests/specs/local_test.js @@ -1,10 +1,38 @@ +var path = require('path'); var assert = require('assert'); -describe('BrowserStack Local Testing', function() { +describe('BrowserStack Local Testing', function () { it('can check tunnel working', function () { + var searchSelector = 'android=new UiSelector().resourceId("com.example.android.basicnetworking:id/test_action")'; + browser.waitForVisible(searchSelector, 30000); browser - .url('http://bs-local.com:45691/check') + .element(searchSelector) + .click(); - assert(browser.getSource().match(/Up and running/i)); + var insertTextSelector = `android.widget.TextView`; + browser.waitForVisible(insertTextSelector, 30000); + + var allTextElements = browser.elements(`android.widget.TextView`).value; + browser.pause(10000); + + var testElement = null; + allTextElements.forEach(function (textElement) { + var textContent = browser.elementIdText(textElement['ELEMENT']).value; + if (textContent.indexOf('The active connection is') !== -1) { + testElement = textElement; + } + }); + + if (testElement === null) { + var screenshotPath = path.resolve(__dirname, 'screenshot.png'); + browser.saveScreenshot(screenshotPath); + console.log('Screenshot stored at ' + screenshotPath); + throw new Error('Cannot find the needed TextView element from app'); + } + + var matchedString = browser.elementIdText(testElement['ELEMENT']).value; + console.log(matchedString); + assert(matchedString.indexOf('The active connection is wifi') !== -1); + assert(matchedString.indexOf('Up and running') !== -1); }); }); diff --git a/tests/specs/multiple/test_01.js b/tests/specs/multiple/test_01.js index 2f33dab..6fcdaad 100644 --- a/tests/specs/multiple/test_01.js +++ b/tests/specs/multiple/test_01.js @@ -1,10 +1,25 @@ var assert = require('assert'); -describe('Google\'s Search Functionality', function() { - it('opens google', function () { +describe('Search Wikipedia Functionality', function () { + it('can find search results', function () { + var searchSelector = `~Search Wikipedia`; + browser.waitForVisible(searchSelector, 30000); browser - .url('https://www.google.com/ncr') - - assert(browser.getTitle().match(/Google/i)); + .element(searchSelector) + .click(); + + var insertTextSelector = 'android=new UiSelector().resourceId("org.wikipedia.alpha:id/search_src_text")'; + browser.waitForVisible(insertTextSelector); + browser + .element(insertTextSelector) + .keys('BrowserStack 01') + .pause(5000); + + var allProductsName = browser.elements(`android.widget.TextView`).value; + assert(allProductsName.length > 0); + browser + .hideDeviceKeyboard() + .back() + .pause(3000); }); }); diff --git a/tests/specs/multiple/test_02.js b/tests/specs/multiple/test_02.js index 7c8359e..afa995f 100644 --- a/tests/specs/multiple/test_02.js +++ b/tests/specs/multiple/test_02.js @@ -1,12 +1,25 @@ var assert = require('assert'); -describe('Google\'s Search Functionality', function() { +describe('Search Wikipedia Functionality', function () { it('can find search results', function () { + var searchSelector = `~Search Wikipedia`; + browser.waitForVisible(searchSelector, 30000); browser - .url('https://www.google.com/ncr') - .setValue('*[name="q"]','BrowserStack\n') + .element(searchSelector) + .click(); + + var insertTextSelector = 'android=new UiSelector().resourceId("org.wikipedia.alpha:id/search_src_text")'; + browser.waitForVisible(insertTextSelector); + browser + .element(insertTextSelector) + .keys('BrowserStack 02') .pause(5000); - - assert(browser.getTitle().match(/BrowserStack - Google Search/i)); + + var allProductsName = browser.elements(`android.widget.TextView`).value; + assert(allProductsName.length > 0); + browser + .hideDeviceKeyboard() + .back() + .pause(3000); }); }); diff --git a/tests/specs/multiple/test_03.js b/tests/specs/multiple/test_03.js index a4b3aee..b9eb374 100644 --- a/tests/specs/multiple/test_03.js +++ b/tests/specs/multiple/test_03.js @@ -1,12 +1,25 @@ var assert = require('assert'); -describe('Google\'s Search Functionality', function() { - it('can find search results for non ncr', function () { +describe('Search Wikipedia Functionality', function () { + it('can find search results', function () { + var searchSelector = `~Search Wikipedia`; + browser.waitForVisible(searchSelector, 30000); browser - .url('https://www.google.com') - .setValue('*[name="q"]','BrowserStack\n') + .element(searchSelector) + .click(); + + var insertTextSelector = 'android=new UiSelector().resourceId("org.wikipedia.alpha:id/search_src_text")'; + browser.waitForVisible(insertTextSelector); + browser + .element(insertTextSelector) + .keys('BrowserStack 03') .pause(5000); - - assert(browser.getTitle().match(/BrowserStack - Google/i)); + + var allProductsName = browser.elements(`android.widget.TextView`).value; + assert(allProductsName.length > 0); + browser + .hideDeviceKeyboard() + .back() + .pause(3000); }); }); diff --git a/tests/specs/multiple_test.js b/tests/specs/multiple_test.js index aea4267..af52ba7 100644 --- a/tests/specs/multiple_test.js +++ b/tests/specs/multiple_test.js @@ -6,4 +6,4 @@ var specs = [ for (var i = specs.length - 1; i >= 0; i--) { require(specs[i]); -}; +} diff --git a/tests/specs/single_test.js b/tests/specs/single_test.js index 7c8359e..00aa5cd 100644 --- a/tests/specs/single_test.js +++ b/tests/specs/single_test.js @@ -1,12 +1,21 @@ var assert = require('assert'); -describe('Google\'s Search Functionality', function() { +describe('Search Wikipedia Functionality', function () { it('can find search results', function () { + var searchSelector = `~Search Wikipedia`; + browser.waitForVisible(searchSelector, 30000); browser - .url('https://www.google.com/ncr') - .setValue('*[name="q"]','BrowserStack\n') + .element(searchSelector) + .click(); + + var insertTextSelector = 'android=new UiSelector().resourceId("org.wikipedia.alpha:id/search_src_text")'; + browser.waitForVisible(insertTextSelector); + browser + .element(insertTextSelector) + .keys('BrowserStack') .pause(5000); - - assert(browser.getTitle().match(/BrowserStack - Google Search/i)); + + var allProductsName = browser.elements(`android.widget.TextView`).value; + assert(allProductsName.length > 0); }); });