You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by al...@apache.org on 2016/05/24 14:16:11 UTC
cordova-plugin-camera git commit: CB-11296: Appium: Better element
clicking and session error handling
Repository: cordova-plugin-camera
Updated Branches:
refs/heads/master dcc81bfbe -> a05f16998
CB-11296: Appium: Better element clicking and session error handling
Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/commit/a05f1699
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/tree/a05f1699
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/diff/a05f1699
Branch: refs/heads/master
Commit: a05f169984aff9b1db1ddf4f04618b78c2b81664
Parents: dcc81bf
Author: Alexander Sorokin <al...@akvelon.com>
Authored: Thu May 19 18:08:07 2016 +0300
Committer: Alexander Sorokin <al...@akvelon.com>
Committed: Thu May 19 19:05:28 2016 +0300
----------------------------------------------------------------------
appium-tests/android/android.spec.js | 55 ++++++++++++++++++++++++++++---
appium-tests/helpers/cameraHelper.js | 12 ++++---
appium-tests/ios/ios.spec.js | 46 ++++++++++++++++++++++----
3 files changed, 99 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/blob/a05f1699/appium-tests/android/android.spec.js
----------------------------------------------------------------------
diff --git a/appium-tests/android/android.spec.js b/appium-tests/android/android.spec.js
index 25f662c..e6dec6d 100644
--- a/appium-tests/android/android.spec.js
+++ b/appium-tests/android/android.spec.js
@@ -52,6 +52,8 @@ describe('Camera tests Android.', function () {
var screenHeight = DEFAULT_SCREEN_HEIGHT;
// promise count to use in promise ID
var promiseCount = 0;
+ // going to set this to false if session is created successfully
+ var failedToStart = true;
function getNextPromiseId() {
promiseCount += 1;
@@ -127,10 +129,18 @@ describe('Camera tests Android.', function () {
.performTouchAction(tapTile);
}
return driver
+ .waitForElementByXPath('//android.widget.TextView[@text="Gallery"]', 20000)
+ .elementByXPath('//android.widget.TextView[@text="Gallery"]')
+ .elementByXPath('//android.widget.TextView[@text="Gallery"]')
+ .elementByXPath('//android.widget.TextView[@text="Gallery"]')
.elementByXPath('//android.widget.TextView[@text="Gallery"]')
.fail(function () {
return driver
.performTouchAction(swipeRight)
+ .waitForElementByXPath('//android.widget.TextView[@text="Gallery"]', 20000)
+ .elementByXPath('//android.widget.TextView[@text="Gallery"]')
+ .elementByXPath('//android.widget.TextView[@text="Gallery"]')
+ .elementByXPath('//android.widget.TextView[@text="Gallery"]')
.elementByXPath('//android.widget.TextView[@text="Gallery"]');
})
.click()
@@ -140,9 +150,13 @@ describe('Camera tests Android.', function () {
}
// taking a picture from camera
return driver
- .waitForElementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]', MINUTE)
+ .waitForElementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]', MINUTE / 2)
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]')
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]')
.click()
- .waitForElementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]', MINUTE)
+ .waitForElementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]', MINUTE / 2)
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]')
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]')
.click();
})
.then(function () {
@@ -168,7 +182,7 @@ describe('Camera tests Android.', function () {
}
return driver
.context(webviewContext)
- .setAsyncScriptTimeout(MINUTE)
+ .setAsyncScriptTimeout(MINUTE / 2)
.executeAsync(cameraHelper.checkPicture, [getCurrentPromiseId(), options])
.then(function (result) {
if (shouldLoad) {
@@ -253,13 +267,23 @@ describe('Camera tests Android.', function () {
};
}
+ function checkSession(done) {
+ if (failedToStart) {
+ fail('Failed to start a session');
+ done();
+ }
+ }
+
it('camera.ui.util configuring driver and starting a session', function (done) {
getDriver()
- .fail(fail)
+ .then(function () {
+ failedToStart = false;
+ }, fail)
.done(done);
}, 5 * MINUTE);
it('camera.ui.util determine screen dimensions', function (done) {
+ checkSession(done);
return driver
.context(webviewContext)
.execute(function () {
@@ -278,6 +302,7 @@ describe('Camera tests Android.', function () {
describe('Specs.', function () {
// getPicture() with saveToPhotoLibrary = true
it('camera.ui.spec.1 Saving a picture to the photo library', function (done) {
+ checkSession(done);
var spec = generateSpec({
quality: 50,
allowEdit: false,
@@ -294,6 +319,7 @@ describe('Camera tests Android.', function () {
// getPicture() with mediaType: VIDEO, sourceType: PHOTOLIBRARY
it('camera.ui.spec.2 Selecting only videos', function (done) {
+ checkSession(done);
var spec = function () {
var options = { sourceType: cameraConstants.PictureSourceType.PHOTOLIBRARY,
mediaType: cameraConstants.MediaType.VIDEO };
@@ -306,6 +332,8 @@ describe('Camera tests Android.', function () {
// try to find "Gallery" menu item
// if there's none, the gallery should be already opened
return driver
+ .waitForElementByXPath('//android.widget.TextView[@text="Gallery"]', 20000)
+ .elementByXPath('//android.widget.TextView[@text="Gallery"]')
.elementByXPath('//android.widget.TextView[@text="Gallery"]')
.then(function (element) {
return element.click();
@@ -344,6 +372,7 @@ describe('Camera tests Android.', function () {
// getPicture(), then dismiss
// wait for the error callback to be called
it('camera.ui.spec.3 Dismissing the camera', function (done) {
+ checkSession(done);
var spec = function () {
var options = {
quality: 50,
@@ -357,6 +386,8 @@ describe('Camera tests Android.', function () {
})
.context("NATIVE_APP")
.waitForElementByXPath('//android.widget.ImageView[contains(@resource-id,\'cancel\')]', MINUTE / 2)
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'cancel\')]')
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'cancel\')]')
.click()
.then(function () {
return checkPicture(false);
@@ -369,6 +400,7 @@ describe('Camera tests Android.', function () {
// getPicture(), then take picture but dismiss the edit
// wait for the error callback to be called
it('camera.ui.spec.4 Dismissing the edit', function (done) {
+ checkSession(done);
var spec = function () {
var options = {
quality: 50,
@@ -382,10 +414,16 @@ describe('Camera tests Android.', function () {
})
.context('NATIVE_APP')
.waitForElementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]', MINUTE / 2)
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]')
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]')
.click()
.waitForElementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]', MINUTE / 2)
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]')
+ .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]')
.click()
.waitForElementByXPath('//*[contains(@resource-id,\'discard\')]', MINUTE / 2)
+ .elementByXPath('//*[contains(@resource-id,\'discard\')]')
+ .elementByXPath('//*[contains(@resource-id,\'discard\')]')
.click()
.then(function () {
return checkPicture(false);
@@ -396,6 +434,7 @@ describe('Camera tests Android.', function () {
}, 10 * MINUTE);
it('camera.ui.spec.5 Verifying target image size, sourceType=CAMERA', function (done) {
+ checkSession(done);
var spec = generateSpec({
quality: 50,
allowEdit: false,
@@ -409,6 +448,7 @@ describe('Camera tests Android.', function () {
}, 10 * MINUTE);
it('camera.ui.spec.6 Verifying target image size, sourceType=PHOTOLIBRARY', function (done) {
+ checkSession(done);
var spec = generateSpec({
quality: 50,
allowEdit: false,
@@ -422,6 +462,7 @@ describe('Camera tests Android.', function () {
}, 10 * MINUTE);
it('camera.ui.spec.7 Verifying target image size, sourceType=CAMERA, DestinationType=NATIVE_URI', function (done) {
+ checkSession(done);
var spec = generateSpec({
quality: 50,
allowEdit: false,
@@ -436,6 +477,7 @@ describe('Camera tests Android.', function () {
}, 10 * MINUTE);
it('camera.ui.spec.8 Verifying target image size, sourceType=PHOTOLIBRARY, DestinationType=NATIVE_URI', function (done) {
+ checkSession(done);
var spec = generateSpec({
quality: 50,
allowEdit: false,
@@ -450,6 +492,7 @@ describe('Camera tests Android.', function () {
}, 10 * MINUTE);
it('camera.ui.spec.9 Verifying target image size, sourceType=CAMERA, DestinationType=NATIVE_URI, quality=100', function (done) {
+ checkSession(done);
var spec = generateSpec({
quality: 100,
allowEdit: true,
@@ -464,6 +507,7 @@ describe('Camera tests Android.', function () {
}, 10 * MINUTE);
it('camera.ui.spec.10 Verifying target image size, sourceType=PHOTOLIBRARY, DestinationType=NATIVE_URI, quality=100', function (done) {
+ checkSession(done);
var spec = generateSpec({
quality: 100,
allowEdit: true,
@@ -480,12 +524,14 @@ describe('Camera tests Android.', function () {
// combine various options for getPicture()
generateOptions().forEach(function (spec) {
it('camera.ui.spec.11.' + spec.id + ' Combining options. ' + spec.description, function (done) {
+ checkSession(done);
var s = generateSpec(spec.options);
tryRunSpec(s).done(done);
}, 10 * MINUTE);
});
it('camera.ui.util Delete test image from device library', function (done) {
+ checkSession(done);
if (!isTestPictureSaved) {
// couldn't save test picture earlier, so nothing to delete here
done();
@@ -518,6 +564,7 @@ describe('Camera tests Android.', function () {
});
it('camera.ui.util Destroy the session', function (done) {
+ checkSession(done);
driver
.quit()
.done(done);
http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/blob/a05f1699/appium-tests/helpers/cameraHelper.js
----------------------------------------------------------------------
diff --git a/appium-tests/helpers/cameraHelper.js b/appium-tests/helpers/cameraHelper.js
index 544a9e7..5f60bc3 100644
--- a/appium-tests/helpers/cameraHelper.js
+++ b/appium-tests/helpers/cameraHelper.js
@@ -247,18 +247,22 @@ module.exports.checkPicture = function (pid, options, cb) {
function displayImage(image) {
try {
- var imgEl = document.createElement('img');
- document.body.appendChild(imgEl);
+ var imgEl = document.getElementById('camera_test_image');
+ if (!imgEl) {
+ imgEl = document.createElement('img');
+ imgEl.id = 'camera_test_image';
+ document.body.appendChild(imgEl);
+ }
var timedOut = false;
var loadTimeout = setTimeout(function () {
timedOut = true;
- document.body.removeChild(imgEl);
+ imgEl.src = '';
errorCallback('The image did not load: ' + image.substring(0, 150));
}, 10000);
var done = function (status) {
if (!timedOut) {
clearTimeout(loadTimeout);
- document.body.removeChild(imgEl);
+ imgEl.src = '';
cb(status);
}
};
http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/blob/a05f1699/appium-tests/ios/ios.spec.js
----------------------------------------------------------------------
diff --git a/appium-tests/ios/ios.spec.js b/appium-tests/ios/ios.spec.js
index 3f5a68c..224190e 100644
--- a/appium-tests/ios/ios.spec.js
+++ b/appium-tests/ios/ios.spec.js
@@ -30,7 +30,6 @@
var wdHelper = global.WD_HELPER;
var screenshotHelper = global.SCREENSHOT_HELPER;
-var wd = wdHelper.getWD();
var isDevice = global.DEVICE;
var cameraConstants = require('../../www/CameraConstants');
var cameraHelper = require('../helpers/cameraHelper');
@@ -44,6 +43,8 @@ describe('Camera tests iOS.', function () {
var webviewContext = DEFAULT_WEBVIEW_CONTEXT;
// promise count to use in promise ID
var promiseCount = 0;
+ // going to set this to false if session is created successfully
+ var failedToStart = true;
function getNextPromiseId() {
promiseCount += 1;
@@ -127,12 +128,14 @@ describe('Camera tests iOS.', function () {
if (cancelCamera) {
return driver
.waitForElementByXPath('//*[@label="Cancel"]', MINUTE / 2)
+ .elementByXPath('//*[@label="Cancel"]')
+ .elementByXPath('//*[@label="Cancel"]')
.click();
}
return driver
.waitForElementByXPath('//*[@label="Take Picture"]', MINUTE / 2)
.click()
- .elementByXPath('//*[@label="Use Photo"]')
+ .waitForElementByXPath('//*[@label="Use Photo"]', MINUTE / 2)
.click();
})
.fail(fail);
@@ -146,7 +149,7 @@ describe('Camera tests iOS.', function () {
}
return driver
.context(webviewContext)
- .setAsyncScriptTimeout(MINUTE)
+ .setAsyncScriptTimeout(MINUTE / 2)
.executeAsync(cameraHelper.checkPicture, [getCurrentPromiseId(), options])
.then(function (result) {
if (shouldLoad) {
@@ -187,15 +190,25 @@ describe('Camera tests iOS.', function () {
});
}
+ function checkSession(done) {
+ if (failedToStart) {
+ fail('Failed to start a session');
+ done();
+ }
+ }
+
it('camera.ui.util configure driver and start a session', function (done) {
getDriver()
- .fail(fail)
- .finally(done);
+ .then(function () {
+ failedToStart = false;
+ }, fail)
+ .done(done);
}, 5 * MINUTE);
describe('Specs.', function () {
// getPicture() with mediaType: VIDEO, sourceType: PHOTOLIBRARY
it('camera.ui.spec.1 Selecting only videos', function (done) {
+ checkSession(done);
var options = { sourceType: cameraConstants.PictureSourceType.PHOTOLIBRARY,
mediaType: cameraConstants.MediaType.VIDEO };
driver
@@ -211,10 +224,12 @@ describe('Camera tests iOS.', function () {
// getPicture(), then dismiss
// wait for the error callback to be called
it('camera.ui.spec.2 Dismissing the camera', function (done) {
+ checkSession(done);
if (!isDevice) {
pending('Camera is not available on iOS simulator');
}
- var options = { sourceType: cameraConstants.PictureSourceType.CAMERA };
+ var options = { sourceType: cameraConstants.PictureSourceType.CAMERA,
+ saveToPhotoAlbum: false };
driver
.then(function () {
return getPicture(options, true);
@@ -227,6 +242,7 @@ describe('Camera tests iOS.', function () {
}, 3 * MINUTE);
it('camera.ui.spec.3 Verifying target image size, sourceType=CAMERA', function (done) {
+ checkSession(done);
if (!isDevice) {
pending('Camera is not available on iOS simulator');
}
@@ -243,6 +259,7 @@ describe('Camera tests iOS.', function () {
}, 3 * MINUTE);
it('camera.ui.spec.4 Verifying target image size, sourceType=SAVEDPHOTOALBUM', function (done) {
+ checkSession(done);
var options = {
quality: 50,
allowEdit: false,
@@ -256,6 +273,7 @@ describe('Camera tests iOS.', function () {
}, 3 * MINUTE);
it('camera.ui.spec.5 Verifying target image size, sourceType=PHOTOLIBRARY', function (done) {
+ checkSession(done);
var options = {
quality: 50,
allowEdit: false,
@@ -269,6 +287,10 @@ describe('Camera tests iOS.', function () {
}, 3 * MINUTE);
it('camera.ui.spec.6 Verifying target image size, sourceType=CAMERA, destinationType=NATIVE_URI', function (done) {
+ // remove this line if you don't mind the tests leaving a photo saved on device
+ pending('Cannot prevent iOS from saving the picture to photo library');
+
+ checkSession(done);
if (!isDevice) {
pending('Camera is not available on iOS simulator');
}
@@ -286,6 +308,7 @@ describe('Camera tests iOS.', function () {
}, 3 * MINUTE);
it('camera.ui.spec.7 Verifying target image size, sourceType=SAVEDPHOTOALBUM, destinationType=NATIVE_URI', function (done) {
+ checkSession(done);
var options = {
quality: 50,
allowEdit: false,
@@ -300,6 +323,7 @@ describe('Camera tests iOS.', function () {
}, 3 * MINUTE);
it('camera.ui.spec.8 Verifying target image size, sourceType=PHOTOLIBRARY, destinationType=NATIVE_URI', function (done) {
+ checkSession(done);
var options = {
quality: 50,
allowEdit: false,
@@ -314,6 +338,10 @@ describe('Camera tests iOS.', function () {
}, 3 * MINUTE);
it('camera.ui.spec.9 Verifying target image size, sourceType=CAMERA, destinationType=NATIVE_URI, quality=100', function (done) {
+ // remove this line if you don't mind the tests leaving a photo saved on device
+ pending('Cannot prevent iOS from saving the picture to photo library');
+
+ checkSession(done);
if (!isDevice) {
pending('Camera is not available on iOS simulator');
}
@@ -330,6 +358,7 @@ describe('Camera tests iOS.', function () {
}, 3 * MINUTE);
it('camera.ui.spec.10 Verifying target image size, sourceType=SAVEDPHOTOALBUM, destinationType=NATIVE_URI, quality=100', function (done) {
+ checkSession(done);
var options = {
quality: 100,
allowEdit: false,
@@ -344,6 +373,7 @@ describe('Camera tests iOS.', function () {
}, 3 * MINUTE);
it('camera.ui.spec.11 Verifying target image size, sourceType=PHOTOLIBRARY, destinationType=NATIVE_URI, quality=100', function (done) {
+ checkSession(done);
var options = {
quality: 100,
allowEdit: false,
@@ -360,9 +390,12 @@ describe('Camera tests iOS.', function () {
// combine various options for getPicture()
generateOptions().forEach(function (spec) {
it('camera.ui.spec.12.' + spec.id + ' Combining options. ' + spec.description, function (done) {
+ checkSession(done);
if (!isDevice && spec.options.sourceType === cameraConstants.PictureSourceType.CAMERA) {
pending('Camera is not available on iOS simulator');
}
+
+ // remove this check if you don't mind the tests leaving a photo saved on device
if (spec.options.sourceType === cameraConstants.PictureSourceType.CAMERA &&
spec.options.destinationType === cameraConstants.DestinationType.NATIVE_URI) {
pending('Skipping: cannot prevent iOS from saving the picture to photo library and cannot delete it. ' +
@@ -376,6 +409,7 @@ describe('Camera tests iOS.', function () {
});
it('camera.ui.util Destroy the session', function (done) {
+ checkSession(done);
driver
.quit()
.done(done);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org