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 2017/02/27 09:31:22 UTC

cordova-plugin-camera git commit: CB-12501 (Android) Appium tests don't use XPath selectors anymore

Repository: cordova-plugin-camera
Updated Branches:
  refs/heads/master 7f616d16f -> 4fc25154f


CB-12501 (Android) Appium tests don't use XPath selectors anymore


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/4fc25154
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/tree/4fc25154
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/diff/4fc25154

Branch: refs/heads/master
Commit: 4fc25154f31204cb526dbd505c965fea1fd8b0b8
Parents: 7f616d1
Author: Alexander Sorokin <al...@akvelon.com>
Authored: Thu Feb 23 17:32:23 2017 +0300
Committer: Alexander Sorokin <al...@akvelon.com>
Committed: Thu Feb 23 20:01:59 2017 +0300

----------------------------------------------------------------------
 appium-tests/android/android.spec.js | 105 +++++++-----------------------
 1 file changed, 25 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/blob/4fc25154/appium-tests/android/android.spec.js
----------------------------------------------------------------------
diff --git a/appium-tests/android/android.spec.js b/appium-tests/android/android.spec.js
index 2024345..6b259c3 100644
--- a/appium-tests/android/android.spec.js
+++ b/appium-tests/android/android.spec.js
@@ -42,6 +42,7 @@ var DEFAULT_SCREEN_WIDTH = 360;
 var DEFAULT_SCREEN_HEIGHT = 567;
 var DEFAULT_WEBVIEW_CONTEXT = 'WEBVIEW';
 var PROMISE_PREFIX = 'appium_camera_promise_';
+var CONTEXT_NATIVE_APP = 'NATIVE_APP';
 
 describe('Camera tests Android.', function () {
     var driver;
@@ -72,10 +73,9 @@ describe('Camera tests Android.', function () {
         return PROMISE_PREFIX + promiseCount;
     }
 
-    function saveScreenshotAndFail(error) {
+    function gracefullyFail(error) {
         fail(error);
-        return screenshotHelper
-            .saveScreenshot(driver)
+        return driver
             .quit()
             .then(function () {
                 return getDriver();
@@ -108,7 +108,7 @@ describe('Camera tests Android.', function () {
         return driver
             .context(webviewContext)
             .execute(cameraHelper.getPicture, [options, promiseId])
-            .context('NATIVE_APP')
+            .context(CONTEXT_NATIVE_APP)
             .then(function () {
                 if (skipUiInteractions) {
                     return;
@@ -138,20 +138,12 @@ describe('Camera tests Android.', function () {
                             .performTouchAction(tapTile);
                     }
                     return driver
-                        .waitForElementByXPath('//android.widget.TextView[@text="Gallery"]', 20000)
-                        .elementByXPath('//android.widget.TextView[@text="Gallery"]') // multiple calls here for an Android bug:
-                        .elementByXPath('//android.widget.TextView[@text="Gallery"]') // on Windows + Android emulator, element selection
-                        .elementByXPath('//android.widget.TextView[@text="Gallery"]') // is completely wonky. Unfortunately duplicating element()
-                        .elementByXPath('//android.widget.TextView[@text="Gallery"]') // calls is the only workaround identified thus far.
+                        .waitForElementByAndroidUIAutomator('new UiSelector().text("Gallery");', 20000)
                         .fail(function () {
                             // If the Gallery button is not present, swipe right to reveal the Gallery button!
                             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"]')
+                                .waitForElementByAndroidUIAutomator('new UiSelector().text("Gallery");', 20000)
                         })
                         .click()
                         // always wait before performing touchAction
@@ -160,17 +152,9 @@ describe('Camera tests Android.', function () {
                 }
                 // taking a picture from camera
                 return driver
-                    .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\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]')
+                    .waitForElementByAndroidUIAutomator('new UiSelector().resourceIdMatches(".*shutter.*")', MINUTE / 2)
                     .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\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]')
+                    .waitForElementByAndroidUIAutomator('new UiSelector().resourceIdMatches(".*done.*")', MINUTE / 2)
                     .click();
             })
             .then(function () {
@@ -179,7 +163,7 @@ describe('Camera tests Android.', function () {
                 }
                 if (options.allowEdit) {
                     return driver
-                        .waitForElementByXPath('//*[contains(@resource-id,\'save\')]', MINUTE)
+                        .waitForElementByAndroidUIAutomator('new UiSelector().text("Save")', MINUTE)
                         .click();
                 }
             })
@@ -220,17 +204,11 @@ describe('Camera tests Android.', function () {
             // always wait before performing touchAction
             .sleep(7000)
             .performTouchAction(holdTile)
-            .elementByXPath('//android.widget.TextView[@text="Delete"]')
-            .elementByXPath('//android.widget.TextView[@text="Delete"]')
-            .elementByXPath('//android.widget.TextView[@text="Delete"]')
-            .elementByXPath('//android.widget.TextView[@text="Delete"]')
+            .elementByAndroidUIAutomator('new UiSelector().text("Delete")')
             .then(function (element) {
                 return element
                     .click()
-                    .elementByXPath('//android.widget.Button[@text="OK"]')
-                    .elementByXPath('//android.widget.Button[@text="OK"]')
-                    .elementByXPath('//android.widget.Button[@text="OK"]')
-                    .elementByXPath('//android.widget.Button[@text="OK"]')
+                    .elementByAndroidUIAutomator('new UiSelector().text("OK")')
                     .click();
             }, function () {
                 // couldn't find Delete menu item. Possibly there is no image.
@@ -280,7 +258,7 @@ describe('Camera tests Android.', function () {
                             .then(spec);
                     });
             })
-            .fail(saveScreenshotAndFail);
+            .fail(gracefullyFail);
     }
 
     // produces a generic spec function which
@@ -331,7 +309,7 @@ describe('Camera tests Android.', function () {
     it('camera.ui.util determine screen dimensions', function (done) {
         checkSession(done, /*skipResolutionCheck?*/ true); // skip the resolution check here since we are about to find out in this spec!
         driver
-            .context('NATIVE_APP')
+            .context(CONTEXT_NATIVE_APP)
             .getWindowSize()
             .then(function (size) {
                 screenWidth = Number(size.width);
@@ -394,16 +372,12 @@ describe('Camera tests Android.', function () {
                     .then(function () {
                         return getPicture(options, true);
                     })
-                    .context('NATIVE_APP')
+                    .context(CONTEXT_NATIVE_APP)
                     .then(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"]')
-                            .elementByXPath('//android.widget.TextView[@text="Gallery"]')
-                            .elementByXPath('//android.widget.TextView[@text="Gallery"]')
+                            .waitForElementByAndroidUIAutomator('new UiSelector().text("Gallery")', 20000)
                             .then(function (element) {
                                 return element.click();
                             }, function () {
@@ -414,19 +388,13 @@ describe('Camera tests Android.', function () {
                         // if the gallery is opened on the videos page,
                         // there should be a "Choose video" caption
                         return driver
-                            .elementByXPath('//*[@text="Choose video"]')
-                            .elementByXPath('//*[@text="Choose video"]')
-                            .elementByXPath('//*[@text="Choose video"]')
-                            .elementByXPath('//*[@text="Choose video"]')
+                            .elementByAndroidUIAutomator('new UiSelector().text("Choose video")')
                             .fail(function () {
                                 throw 'Couldn\'t find "Choose video" element.';
                             });
                     })
                     .deviceKeyEvent(BACK_BUTTON)
-                    .elementByXPath('//android.widget.TextView[@text="Gallery"]')
-                    .elementByXPath('//android.widget.TextView[@text="Gallery"]')
-                    .elementByXPath('//android.widget.TextView[@text="Gallery"]')
-                    .elementByXPath('//android.widget.TextView[@text="Gallery"]')
+                    .elementByAndroidUIAutomator('new UiSelector().text("Gallery")')
                     .deviceKeyEvent(BACK_BUTTON)
                     .finally(function () {
                         return driver
@@ -473,12 +441,8 @@ describe('Camera tests Android.', function () {
                     .then(function () {
                         return getPicture(options, true);
                     })
-                    .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\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'cancel\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'cancel\')]')
+                    .context(CONTEXT_NATIVE_APP)
+                    .waitForElementByAndroidUIAutomator('new UiSelector().resourceIdMatches(".*cancel.*")', MINUTE / 2)
                     .click()
                     .then(function () {
                         return checkPicture(false);
@@ -504,24 +468,11 @@ describe('Camera tests Android.', function () {
                     .then(function () {
                         return getPicture(options, true);
                     })
-                    .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\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'shutter\')]')
+                    .waitForElementByAndroidUIAutomator('new UiSelector().resourceIdMatches(".*shutter.*")', MINUTE / 2)
                     .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\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]')
-                    .elementByXPath('//android.widget.ImageView[contains(@resource-id,\'done\')]')
+                    .waitForElementByAndroidUIAutomator('new UiSelector().resourceIdMatches(".*done.*")', MINUTE / 2)
                     .click()
-                    .waitForElementByXPath('//*[contains(@resource-id,\'discard\')]', MINUTE / 2)
-                    .elementByXPath('//*[contains(@resource-id,\'discard\')]')
-                    .elementByXPath('//*[contains(@resource-id,\'discard\')]')
-                    .elementByXPath('//*[contains(@resource-id,\'discard\')]')
-                    .elementByXPath('//*[contains(@resource-id,\'discard\')]')
+                    .waitForElementByAndroidUIAutomator('new UiSelector().resourceIdMatches(".*discard.*")', MINUTE / 2)
                     .click()
                     .then(function () {
                         return checkPicture(false);
@@ -651,7 +602,7 @@ describe('Camera tests Android.', function () {
             // delete exactly one latest picture
             // this should be the picture we've taken in the first spec
             driver
-                .context('NATIVE_APP')
+                .context(CONTEXT_NATIVE_APP)
                 .deviceKeyEvent(BACK_BUTTON)
                 .sleep(1000)
                 .deviceKeyEvent(BACK_BUTTON)
@@ -659,15 +610,9 @@ describe('Camera tests Android.', function () {
                 .deviceKeyEvent(BACK_BUTTON)
                 .elementById('Apps')
                 .click()
-                .elementByXPath('//android.widget.TextView[@text="Gallery"]')
-                .elementByXPath('//android.widget.TextView[@text="Gallery"]')
-                .elementByXPath('//android.widget.TextView[@text="Gallery"]')
-                .elementByXPath('//android.widget.TextView[@text="Gallery"]')
+                .elementByAndroidUIAutomator('new UiSelector().text("Gallery")')
                 .click()
-                .elementByXPath('//android.widget.TextView[contains(@text,"Pictures")]')
-                .elementByXPath('//android.widget.TextView[contains(@text,"Pictures")]')
-                .elementByXPath('//android.widget.TextView[contains(@text,"Pictures")]')
-                .elementByXPath('//android.widget.TextView[contains(@text,"Pictures")]')
+                .elementByAndroidUIAutomator('new UiSelector().textContains("Pictures")')
                 .click()
                 .then(deleteImage)
                 .deviceKeyEvent(BACK_BUTTON)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org