Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -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

```
Expand All @@ -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)
15 changes: 10 additions & 5 deletions conf/local.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -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://<hashed app-id>',
'browserstack.local': true,
'browserstack.debug': true
}],

logLevel: 'verbose',
Expand All @@ -27,7 +31,8 @@ exports.config = {

framework: 'mocha',
mochaOpts: {
ui: 'bdd'
ui: 'bdd',
timeout: 20000
},

// Code to start browserstack local before start of test
Expand All @@ -48,4 +53,4 @@ exports.config = {
onComplete: function (capabilties, specs) {
exports.bs_local.stop(function() {});
}
}
};
17 changes: 11 additions & 6 deletions conf/multiple.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -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://<hashed app-id>',
'browserstack.debug': true
}],

logLevel: 'verbose',
Expand All @@ -21,9 +25,10 @@ exports.config = {
waitforTimeout: 10000,
connectionRetryTimeout: 90000,
connectionRetryCount: 3,

framework: 'mocha',
mochaOpts: {
ui: 'bdd'
ui: 'bdd',
timeout: 30000
}
}
};
30 changes: 17 additions & 13 deletions conf/parallel.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -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://<hashed app-id>',
'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',
Expand All @@ -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];
});

17 changes: 11 additions & 6 deletions conf/single.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -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://<hashed app-id>',
'browserstack.debug': true
}],

logLevel: 'verbose',
Expand All @@ -21,9 +25,10 @@ exports.config = {
waitforTimeout: 10000,
connectionRetryTimeout: 90000,
connectionRetryCount: 3,

framework: 'mocha',
mochaOpts: {
ui: 'bdd'
ui: 'bdd',
timeout: 20000
}
}
};
12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand All @@ -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"
Expand Down
34 changes: 31 additions & 3 deletions tests/specs/local_test.js
Original file line number Diff line number Diff line change
@@ -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);
});
});
25 changes: 20 additions & 5 deletions tests/specs/multiple/test_01.js
Original file line number Diff line number Diff line change
@@ -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);
});
});
23 changes: 18 additions & 5 deletions tests/specs/multiple/test_02.js
Original file line number Diff line number Diff line change
@@ -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);
});
});
25 changes: 19 additions & 6 deletions tests/specs/multiple/test_03.js
Original file line number Diff line number Diff line change
@@ -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);
});
});
2 changes: 1 addition & 1 deletion tests/specs/multiple_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ var specs = [

for (var i = specs.length - 1; i >= 0; i--) {
require(specs[i]);
};
}
19 changes: 14 additions & 5 deletions tests/specs/single_test.js
Original file line number Diff line number Diff line change
@@ -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);
});
});