diff --git a/.travis.yml b/.travis.yml index cd630de..bd4cbad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,22 +23,24 @@ matrix: include: - os: osx env: TEST_SUITE=ios - osx_image: xcode8.3 + osx_image: xcode9 language: generic before_install: - brew update - - brew install nvm - - source $(brew --prefix nvm)/nvm.sh + - brew install carthage > /dev/null 2>&1 + - brew install ios-webkit-debug-proxy > /dev/null 2>&1 + - brew install nvm > /dev/null 2>&1 - brew install python3 - pip install virtualenv - virtualenv env -p python3 - source env/bin/activate - - brew install ios-webkit-debug-proxy install: - echo Hello Macaca! + - source $(brew --prefix nvm)/nvm.sh - nvm install 7 - nvm use 7 - - npm install -g macaca-cli macaca-ios + - npm i ios-simulator macaca-cli macaca-ios -g + - open -a Simulator --args -CurrentDeviceUDID `ios-simulator -n 'iPhone 6s'` > /dev/null 2>&1 - pip install -r requirements.txt script: - macaca server --verbose & @@ -46,14 +48,16 @@ matrix: - python tests/macaca-ios-sample.test.py - os: linux env: TEST_SUITE=android - jdk: openjdk7 + jdk: oraclejdk8 language: android android: components: - - build-tools-23.0.2 - - android-23 + - tools + - build-tools-25.0.2 + - platform-tools - extra-android-m2repository - - extra-android-support + - extra-google-android-support + - android-25 sudo: required addons: apt: @@ -63,13 +67,17 @@ matrix: - python3.5 before_install: - export CHROME_BIN=chromium-browser - - export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 + - wget http://services.gradle.org/distributions/gradle-3.3-all.zip + - unzip gradle-3.3-all.zip > /dev/null + - export GRADLE_HOME=$PWD/gradle-3.3 + - export PATH=$GRADLE_HOME/bin:$PATH + - export JAVA_HOME=/usr/lib/jvm/java-8-oracle - export ANDROID_HOME=/usr/local/android-sdk - - echo yes | android update sdk --all --filter build-tools-23.0.2 --no-ui --force + - . $HOME/.nvm/nvm.sh - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start before_script: - - echo no | android create avd --force -n test -t android-19 --abi armeabi-v7a + - echo no | android create avd --force -n test -t android-21 --abi armeabi-v7a - emulator -avd test -no-audio -no-window & - android-wait-for-emulator - adb shell input keyevent 82 & @@ -91,7 +99,7 @@ matrix: - TEST_SUITE=pc-browser language: python sudo: false - python: "3.5" + python: 3.5 addons: apt: packages: diff --git a/README.md b/README.md index ef51079..fdf86c6 100644 --- a/README.md +++ b/README.md @@ -9,18 +9,32 @@ ## Install -```shell -$ npm install -g macaca-cli macaca-electron +``` bash +$ npm install -g macaca-cli macaca-electron macaca-ios macaca-android $ pip install -r requirements.txt ``` ## Run test -```shell -$ macaca server +``` bash +$ macaca server --verbose $ python tests/macaca-desktop-sample.test.py +$ python tests/macaca-ios-sample.test.py +$ python tests/macaca-android-sample.test.py ``` + + +## Contributors + +|[
ziczhu](https://github.com/ziczhu)
|[
xudafeng](https://github.com/xudafeng)
+| :---: | :---: | + + +This project follows the git-contributor [spec](https://github.com/xudafeng/git-contributor), auto upated at `Tue Apr 17 2018 00:49:24 GMT+0800`. + + + ## License The MIT License (MIT) diff --git a/tests/macaca-android-sample.test.py b/tests/macaca-android-sample.test.py index 30ae211..0beec22 100644 --- a/tests/macaca-android-sample.test.py +++ b/tests/macaca-android-sample.test.py @@ -4,12 +4,13 @@ import os import time from macaca import WebDriver +from macaca import Keys +from retrying import retry desired_caps = { 'platformName': 'android', 'app': 'https://npmcdn.com/android-app-bootstrap@latest/android_app_bootstrap/build/outputs/apk/android_app_bootstrap-debug.apk', - 'reuse': 3 -} + } server_url = { 'hostname': 'localhost', @@ -30,21 +31,29 @@ class MacacaTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = WebDriver(desired_caps, server_url) - cls.driver.init() + cls.initDriver() @classmethod def tearDownClass(cls): cls.driver.quit() + @classmethod + @retry + def initDriver(cls): + print("Retry connecting server...") + cls.driver.init() + def test_01_login(self): - self.driver \ - .element_by_xpath('//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.EditText[1]') \ + el = self.driver \ + .elements_by_class_name('android.widget.EditText')[0] \ .send_keys('中文+Test+12345678') \ - els = self.driver \ - .elements_by_class_name('android.widget.EditText') + el = self.driver \ + .elements_by_class_name('android.widget.EditText')[1] \ + .send_keys('111111') - els[1].send_keys('111111') + time.sleep(1) + # self.driver.keys(Keys.ENTER.value + Keys.ESCAPE.value) self.driver \ .element_by_name('Login') \ @@ -52,57 +61,46 @@ def test_01_login(self): def test_02_scroll_tableview(self): self.driver \ - .element_by_name('HOME') \ + .wait_for_element_by_name('HOME') \ .click() self.driver \ - .element_by_name('list') \ + .wait_for_element_by_name('list') \ .click() def test_03_gesture(self): - self.driver \ - .touch('drag', { - 'fromX': 200, - 'fromY': 400, - 'toX': 200, - 'toY': 100, - 'steps': 50 - }) - time.sleep(1) + time.sleep(5) self.driver \ - .touch('drag', { - 'fromX': 100, - 'fromY': 100, - 'toX': 100, - 'toY': 400, - 'steps': 50 - }) + .wait_for_element_by_name('Alert') \ + .click() + + time.sleep(5) self.driver \ - .element_by_name('Alert') \ - .click() + .accept_alert() - time.sleep(1) + time.sleep(3) self.driver \ - .accept_alert() \ .back() - time.sleep(1) + time.sleep(3) self.driver \ - .element_by_name('Gesture') \ + .wait_for_element_by_name('Gesture') \ .click() + time.sleep(3) + self.driver \ .touch('tap', { 'x': 100, 'y': 100 }) - time.sleep(1) + time.sleep(5) self.driver \ .touch('doubleTap', { @@ -110,7 +108,7 @@ def test_03_gesture(self): 'y': 100 }) - time.sleep(1) + time.sleep(5) self.driver \ .touch('press', { @@ -119,16 +117,7 @@ def test_03_gesture(self): 'steps': 100 }) - time.sleep(1) - - self.driver \ - .element_by_id('com.github.android_app_bootstrap:id/info') \ - .touch('pinch', { - 'percent': 200, - 'steps': 200 - }) - - time.sleep(1) + time.sleep(5) self.driver \ .touch('drag', { @@ -139,11 +128,11 @@ def test_03_gesture(self): 'steps': 100 }) - time.sleep(1) + time.sleep(5) self.driver.back() - time.sleep(1) + time.sleep(5) self.driver.back() @@ -152,39 +141,39 @@ def test_04_webview(self): .wait_for_element_by_name('Webview') \ .click() - time.sleep(3) + time.sleep(5) self.driver.save_screenshot('./webView.png') # save screen shot switch_to_webview(self.driver) \ - .element_by_id('pushView') \ - .touch('tap') + .wait_for_element_by_id('pushView') \ + .click() switch_to_webview(self.driver) \ - .element_by_id('popView') \ - .touch('tap') + .wait_for_element_by_id('popView') \ + .click() def test_05_web(self): switch_to_native(self.driver) \ - .element_by_name('Baidu') \ - .touch('tap') + .wait_for_element_by_name('Baidu') \ + .click() - time.sleep(3) + time.sleep(5) self.driver.save_screenshot("./baidu.png") switch_to_webview(self.driver) \ - .element_by_id('index-kw') \ + .wait_for_element_by_id('index-kw') \ .send_keys('macaca') self.driver \ - .element_by_id('index-bn') \ - .touch('tap') + .wait_for_element_by_id('index-bn') \ + .click() def test_06_logout(self): switch_to_native(self.driver) \ - .element_by_name('PERSONAL') \ + .wait_for_element_by_name('PERSONAL') \ .click() - self.driver.element_by_name('Logout') \ + self.driver.wait_for_element_by_name('Logout') \ .click() if __name__ == '__main__': diff --git a/tests/macaca-ios-sample.test.py b/tests/macaca-ios-sample.test.py index 7b2142d..ecf97e3 100644 --- a/tests/macaca-ios-sample.test.py +++ b/tests/macaca-ios-sample.test.py @@ -8,11 +8,11 @@ desired_caps = { 'platformName': 'iOS', - 'platformVersion': '10.0', - 'deviceName': 'iPhone 5s', + 'deviceName': 'iPhone 6s', 'app': 'https://npmcdn.com/ios-app-bootstrap@latest/build/ios-app-bootstrap.zip', } + server_url = { 'hostname': 'localhost', 'port': 3456 @@ -53,9 +53,10 @@ def test_01_login(self): .element_by_xpath('//XCUIElementTypeSecureTextField[1]') \ .send_keys('111111') \ + time.sleep(1) + self.driver \ - .element_by_name('Done') \ - .click() + .send_keys('\n') self.driver \ .element_by_name('Login') \ @@ -105,14 +106,6 @@ def test_03_gesture(self): time.sleep(1) - self.driver \ - .touch('doubleTap', { - 'x': 100, - 'y': 100 - }) - - time.sleep(1) - self.driver \ .touch('press', { 'x': 100,