{ "info": { "author": "\u7f57\u79d1\u5cf0", "author_email": "lkf20031988@163.com", "bugtrack_url": null, "classifiers": [], "description": "# rtsf-app\n\u57fa\u4e8ertsf\u6d4b\u8bd5\u6846\u67b6\uff0c\u5173\u952e\u5b57\u9a71\u52a8Android UI,\u8fdb\u884c\u81ea\u52a8\u5316\u7684\u529f\u80fd\u6d4b\u8bd5\n\n\n# \u73af\u5883\u51c6\u5907\n\n## window\u5b89\u88c5 appium.js\n1. [\u4e0b\u8f7d\u5b89\u88c5node.js](https://nodejs.org/en)\n2. \u6267\u884c\u547d\u4ee4\uff0c\u5b89\u88c5cnpm: npm install -g cnpm --registry=https://registry.npm.taobao.org\n3. \u6267\u884c\u547d\u4ee4\uff0c\u5b89\u88c5appium: cnpm install appium -g\n4. \u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u9a8c\u8bc1appium: appium.cmd --command-timeout 120000 -p 4723 -U DEVICE_ID\n\n> appium.cmd\u5176\u5b9e\u5c31\u662f: node \"%appdata%\\npm\\node_modules\\appium\\build\\lib\\main.js\" --command-timeout 120000 -p 4723 -U DEVICE_ID\n\n![appium-cmd.png](https://raw.githubusercontent.com/RockFeng0/img-folder/master/rtsf-app-img/appium-cmd.png)\n\n## \u8bbe\u7f6eANDROID_HOME\u73af\u5883\u53d8\u91cf\n1. [\u4e0b\u8f7dsimple_android_home](https://github.com/RockFeng0/rtsf-app/releases/tag/v1.0.39)\n2. \u89e3\u538b\u6587\u4ef6android_home.zip\uff0c\u65b0\u589e\u73af\u5883\u53d8\u91cf ANDROID_HOME\uff0c\u4e3a\u89e3\u538b\u540e\u7684\u6839\u76ee\u5f55\u7684\u8def\u5f84\n3. \u5728\u73af\u5883\u53d8\u91cfpath\u4e2d\uff0c\u8ffd\u52a0 %ANDROID_HOME%\\platform-tools\n\n> \u5982\u679c\u4f60\u5b89\u88c5\u4e86 android SDK\uff0c\u5e76\u8bbe\u7f6e\u4e86 ANDROID_HOME, \u786e\u4fdd adb \u548c aapt\u547d\u4ee4\u53ef\u4ee5\u88ab\u8c03\u7528\n\n![android-tools.png](https://raw.githubusercontent.com/RockFeng0/img-folder/master/rtsf-app-img/android-tools.png)\n\n## \u4e0b\u8f7dselenium-server-standalone.jar\n\n> \u53c2\u89c1[rtsf-web](https://github.com/RockFeng0/rtsf-web)\u9879\u76ee\uff0c\u73af\u5883\u51c6\u5907\u680f\uff0c\u7ed9\u51fa\u7684\u4e0b\u8f7d\u94fe\u63a5\n\n## \u5b89\u88c5rtsf-app\npip install rtsf-app \n\n# \u547d\u4ee4\u4ecb\u7ecd\n\n## \u5de5\u5177\u547d\u4ee4\n1. \u67e5\u770b\u8bbe\u5907\u4fe1\u606f, \u683c\u5f0f: \u8bbe\u5907id:\u8bbe\u5907\u5c5e\u6027 ,\u8bbe\u5907\u5c5e\u6027\u4e2d\uff0candroid_version\u5c31\u662f\u8bbe\u5907\u7248\u672c\uff0c\u5373android device platform version\n\n```\n# PC\u4e2d\uff0c\u6267\u884cainfo\u547d\u4ee4\uff0c\u6253\u5370\u8be5PC\u8fde\u63a5\u7684\u6240\u6709\u8bbe\u5907\u4fe1\u606f\u53ca\u8bbe\u5907\u5c5e\u6027\n> ainfo\n{'127.0.0.1:6555': {'ip': None, 'model': 'SAMSUNG-SM-N900A', 'cpu': 'x86', 'pad_version': 'hlteatt-userdebug 4.4.4 tt eng.jenkins.20171226.140228 release-keys', 'android_version': '4.4.4', 'android_api_version': '19', 'linux_version': 'Linux version 3.10.0+ (ttvm@TianTian-Dev) (gcc version 4.6 20120106 (prerelease) (GCC) ) #13 SMP PREEMPT Mon Dec 18 11:26:12 CST 2017'}}\n```\n\n![ainfo-cmd.png](https://raw.githubusercontent.com/RockFeng0/img-folder/master/rtsf-app-img/ainfo-cmd.png)\n\n2. \u67e5\u770bapk\u4fe1\u606f\uff0c\u5176\u4e2d\u4e3b\u8981\u5173\u6ce8\uff0cappPackage\u548cappActivity \n\n```\n# PC\u4e2d\uff0c\u6267\u884cainfo --apk APK_FILE \u547d\u4ee4\uff0c\u67e5\u770bapk\u4fe1\u606f\n> ainfo --apk C:\\ApiDemos-debug.apk\n{'platformName': 'Android', 'deviceName': None, 'platformVersion': None, 'app': 'C:\\\\d_disk\\\\auto\\\\buffer\\\\test\\\\tools\\\\android\\\\ApiDemos-debug.apk', 'appPackage': 'io.appium.android.apis', 'appWaitPackage': 'io.appium.android.apis', 'appActivity': 'io.appium.android.apis.ApiDemos', 'unicodeKeyboard': True, 'resetKeyboard': True, 'newCommandTimeout': 120000}\n```\n\n## \u573a\u666f\u4e00 \u672c\u5730\u6d4b\u8bd5\n\n\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u5c31\u662f\u4e00\u53f0PC\uff0c\u8fde\u63a5\u4e00\u53f0\u8bbe\u5907\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u6b65\u9aa4\u5982\u4e0b\n\n**1.\u6d4b\u8bd5\u573a\u666f\u5047\u8bbe**\n\n```\n apk(\u5f85\u6d4b\u8bd5\u7684apk): C:\\ApiDemos-debug.apk\n case(\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b): C:\\test_case.yaml\n\n PC_A_IP(\u672c\u673a): 192.168.1.1\n PC_A_Android_Device_ID(\u5929\u5929\u6a21\u62df\u5668): 127.0.0.1:6555\n```\n\n**2.\u5f00\u542fappium server,\u5e76\u7ed1\u5b9a\u5f85\u6d4b\u8bbe\u5907**\n\n```\n# PC_A\uff0c\u76d1\u542c4723\u7aef\u53e3\uff0c\u8be5\u7aef\u53e3\u7ed1\u5b9a id\u4e3a127.0.0.1:6555\u5e76\u4e14\u7248\u672c\u4e3a4.4.4\u7684\u8bbe\u5907\uff1b\u6ce8\u610f\uff0c\u76d1\u542c\u7aef\u53e3+1\u4e5f\u4f1a\u88ab\u5360\u7528\n> appserver 192.168.1.1:4723 --device-name 127.0.0.1:6555 --device-version 4.4.4\n\n```\n\n**3.aldriver\u9a71\u52a8\u6d4b\u8bd5**\n\n```\n# aldriver\u547d\u4ee4\u6267\u884c\u672c\u5730\u6d4b\u8bd5\uff0c\u8be5\u547d\u4ee4\u4e3b\u52a8\u8fde\u63a5\u672c\u5730PC_A\u76844723\u7aef\u53e3\uff0c\u5e76\u9a71\u52a8adb\u8fde\u63a5\u7684\u7b2c\u4e00\u4e2a\u8bbe\u5907\u8fdb\u884c\u6d4b\u8bd5\n# \u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\uff0c\u5728\u5047\u8bbe\u573a\u666f\u4e2d\uff0c\u8981\u6c42appserver\u4f7f\u7528PC_A\u4f7f\u7528\u672c\u673aIP\u548c4723\u7aef\u53e3\uff0c\u5e76\u7ed1\u5b9a\u540d\u5b57\u662f 127.0.0.1:6555 \u7684\u8bbe\u5907\n> aldriver C:\\test_case.yaml --apk C:\\ApiDemos-debug.apk\n\n# \u5982\u679c\uff0c\u4f60\u6ca1\u6709apk,\u4f46\u662f\u901a\u8fc7 \u5de5\u5177\u547d\u4ee4\uff0c\u83b7\u53d6\u5230 appPackage\u548cappActivity\uff0c\u53ef\u4ee5\u4f7f\u7528\u4e0b\u8ff0\u547d\u4ee4\uff1b\u539f\u7406\u76f8\u5f53\u4e8eappium\u4e2d\u7684\uff0cstart_activity(package, activity)\n#> aldriver C:\\test_case.yaml --package io.appium.android.apis --activity io.appium.android.apis.ApiDemos\n\n# \u5f53\u7136\uff0c\u4e5f\u53ef\u4ee5\u8865\u5168\u6240\u6709\u53c2\u6570\n#> aldriver C:\\test_case.yaml --apk C:\\ApiDemos-debug.apk --package io.appium.android.apis --activity io.appium.android.apis.ApiDemos\n```\n\n**4.\u91ca\u653e\u7aef\u53e3\u5360\u7528**\n\n> ctrl + c \u7ed3\u675f\u7aef\u53e3\u5360\u7528\n\n![scene-1.png](https://raw.githubusercontent.com/RockFeng0/img-folder/master/rtsf-app-img/scene-1.png)\n\n## \u573a\u666f\u4e8c \u8fdc\u7a0b\u63a7\u5236\u6d4b\u8bd5-Selenium Grid Mode\n\n**\u6d4b\u8bd5\u80cc\u666f\u53ca\u5206\u6790**\n\n```\n\u80cc\u666f: \n \u6bd4\u5982\uff0c\u624b\u4e0a\u67091000\u6761\u76f8\u5bf9\u72ec\u7acb\u7684\u6d4b\u8bd5case\uff0c\u4e00\u53f0PC\u4e00\u53f0\u8bbe\u5907\u7684\u65b9\u5f0f\u5b8c\u6210\u8fd9\u4e9bcase\u7684\u9a8c\u8bc1\uff0c\u6548\u7387\u8f83\u4f4e\u3002\u90a3\u4e48\uff0c\u5e76\u884c\u6d4b\u8bd5\u662f\u6700\u597d\u7684\u89e3\u51b3\u529e\u6cd5\n\n\u5206\u6790: \n 1.\u591a\u53f0PC\u8fde\u63a5\u591a\u53f0\u8bbe\u5907\u7684\u6d4b\u8bd5\u573a\u666f\u5047\u8bbe,\u5176\u539f\u7406\u662f\u57fa\u4e8eselenium RC\uff0c\u4f7f\u7528selenium Grid\u7684\u65b9\u5f0f\uff0c\u4f7f\u5f97appium server\u4f5c\u4e3anode\u8282\u70b9\uff0c\u8fdb\u884c\u5206\u5e03\u5f0f\u6d4b\u8bd5\n 2.\u53ef\u662f\uff0c\u5373\u4f7f\u662f\u5206\u5e03\u5f0f\u6d4b\u8bd5\uff0c\u5b83\u7684\u8fc7\u7a0b\u4e5f\u662f\u4e00\u4e2a\u5e76\u53d1\u7684\u8fc7\u7a0b\uff0c\u6bcf\u53f0\u8bbe\u5907\u5206\u522b\u90fd\u8981\u6d4b\u8bd51000\u6761case\u3002\u597d\u6bd4\u5f88\u591a\u8f66\u5728\u652f\u8def\u4e0a\u8dd1\uff0c\u6c47\u5165\u7684\u4e3b\u5e72\u9053\u5374\u53ea\u6709\u4e00\u6761\n 3.\u9700\u8981\u505a\u7684\uff0c\u5c31\u662f\u8ba9\u8fd91000\u6761case\uff0c\u5206\u914d\u7ed9\u8fd9\u4e9b\u8bbe\u5907\uff0c\u8ba9\u5b83\u4eec\u5e76\u884c\u6d4b\u8bd5\u3002\u89e3\u51b3\u65b9\u6cd5\uff1a\u591a\u91cdhub\n```\n\n\u591a\u53f0PC,\u8fde\u63a5\u591a\u53f0\u8bbe\u5907,\u5e76\u884c\u6d4b\u8bd5case\u573a\u666f\uff0c\u6b65\u9aa4\u5982\u4e0b\n\n**1.\u6d4b\u8bd5\u573a\u666f\u5047\u8bbe**\n\n```\n apk(\u5f85\u6d4b\u8bd5\u7684apk): C:\\ApiDemos-debug.apk\n case1(\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b): C:\\test_case1.yaml\n case2(\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b): C:\\test_case2.yaml\n ...\n\n PC_Server_IP(Grid Hub\u7aef): 192.168.1.254\n\n PC_A_IP(\u672c\u673a): 192.168.1.1\n PC_A_Android_Device_ID(\u5929\u5929\u6a21\u62df\u5668): 127.0.0.1:6555\n ...\n\n PC_B_IP(\u8fdc\u7aef\u673a): 192.168.1.2\n PC_B_Android_Device_ID(\u5929\u5929\u6a21\u62df\u5668): 127.0.0.1:6555\n ...\n\n\u6ce8\u610f: adb.exe\u6700\u591a\u652f\u6301\u6bcf\u53f0pc\u94fe\u63a520\u53f0\u8bbe\u5907\n\u5e76\u884c\u6d4b\u8bd5: PC_A\u8fde\u63a5\u7684\u6240\u6709\u673a\u5668\uff0c\u6d4b\u8bd5case1;PC_B\u8fde\u63a5\u7684\u6240\u6709\u673a\u5668,\u6d4b\u8bd5case2\n```\n\n![grid-hub.png](https://raw.githubusercontent.com/RockFeng0/img-folder/master/rtsf-app-img/grid-hub.png)\n\n**2.\u5f00\u542fselenium grid hub**\n\n\u547d\u4ee4\u8be6\u89e3\uff0c\u53c2\u89c1[rtsf-web](https://github.com/RockFeng0/rtsf-web)\n\n```\n# PC_Server\u8bbe\u7f6ePC_A\u7684hub\n> wrhub C:\\selenium-server-standalone-3.14.0.jar --port 4444\n\n# PC_Server\u8bbe\u7f6ePC_B\u7684hub\n> wrhub C:\\selenium-server-standalone-3.14.0.jar --port 5555\n```\n\n**3.\u5f00\u542fappium server node**\n\n```\n# PC_A 4723\u7aef\u53e3\u7ed1\u5b9a\u8bbe\u5907\uff0c\u5e76\u6ce8\u518cnode\u8282\u70b9 \n> appserver 192.168.1.1:4723 --device-name 127.0.0.1:6555 --device-version 4.4.4 --hub-ip 192.168.1.254 --hub-port 4444\n\n# PC_A 4725\u7aef\u53e3\u7ed1\u5b9a\u8bbe\u5907\uff0c\u5e76\u6ce8\u518cnode\u8282\u70b9 \n> appserver 192.168.1.1:4725 --device-name DEVICE_ID --device-version DEVICE_VERSION --hub-ip 192.168.1.254 --hub-port 4444\n...\n\n# PC_B, \u540c\u7406\n> appserver 192.168.1.2:4723 --device-name 127.0.0.1:6555 --device-version 4.4.4 --hub-ip 192.168.1.254 --hub-port 5555\n...\n```\n\n**4.ardriver\u9a71\u52a8\u6d4b\u8bd5**\n\n\u6ce8\u610f:\n- \u5982\u679c\u4f7f\u7528 --apk\u53c2\u6570\uff0c\u90a3\u4e48 \u786e\u4fdd PC A \u548c PC B,\u5728\u8be5\u6307\u5b9a\u7684\u6587\u4ef6\u8def\u5f84\u4e2d\uff0c\u5b58\u5728\u8fd9\u4e2aapk\u3002\n- \u5982\u679c\u4f7f\u7528 --package\u548c--activity\u53c2\u6570\uff0c\u90a3\u4e48\u786e\u4fdd\uff0c\u8fde\u63a5\u5230PC\u7684\u624b\u673a\uff0c\u5df2\u7ecf\u88c5\u4e86\u8fd9\u4e2aapk\n- aldriver \u4e0e ardriver\u7684\u533a\u522b\u5c31\u5728\u4e8e: ardriver\u652f\u6301 ip\u548cport\u53c2\u6570\uff0c\u5141\u8bb8grid\u6a21\u5f0f\n\n```\n# ardriver\u672c\u8eab\u662f\u4e2a\u5e76\u53d1\u9a71\u52a8\u6d4b\u8bd5\uff0c\u4f46\u662f\uff0c\u6bcf\u6b21\u4f7f\u7528\u90fd\u4f1a\u5f00\u4e00\u4e2a\u8fdb\u7a0b\uff0c\u5e76\u53d1\u7684\u8fc7\u7a0b\uff0c\u5c31\u91c7\u7528\u591a\u6b21\u6267\u884c\u547d\u4ee4\u5427\n# PC_A\u6267\u884ccase1\uff0c\u6267\u884ccase1\u7684\u6d4b\u8bd5\u9a8c\u8bc1\n> ardriver C:\\test_case1.yaml --apk C:\\ApiDemos-debug.apk --ip 192.168.1.254 --port 4444\n\n# PC_B\u7684\u6240\u6709\u8bbe\u5907\uff0c\u6267\u884ccase2\u7684\u6d4b\u8bd5\u9a8c\u8bc1\n> ardriver C:\\test_case2.yaml --apk C:\\ApiDemos-debug.apk --ip 192.168.1.254 --port 5555\n\n```\n\n## \u6d4b\u8bd5\u62a5\u544a\u53ca\u65e5\u5fd7\n\n> \u6267\u884c\u7ed3\u675f\u540e\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6240\u5728\u8def\u5f84\uff0c\u5c31\u662freport\u751f\u6210\u7684\u8def\u5f84\n\n\n# \u7f16\u5199\u6d4b\u8bd5\u7528\u4f8b\uff0c\u6a21\u677f\u57fa\u4e8ertsf\n\n> \u53d8\u91cf\u5f15\u7528-> $var \u5173\u952e\u5b57(\u51fd\u6570)\u5f15\u7528-> ${function}\n\n- \u5e38\u91cf\u7684\u5b9a\u4e49\uff0c glob_var \u548c glob_regx\n- \u6a21\u677f\u5e38\u7528\u7684\u5173\u952e\u5b57\uff0c\u53c2\u89c1 [rtsf](https://github.com/RockFeng0/rtsf)\u4ecb\u7ecd\n\n## \u57fa\u672c\u7528\u4f8b\n\n\u57fa\u672c\u7528\u4f8b\uff0c\u662f\u6307\u6ca1\u6709\u5206\u5c42\u7684\u60c5\u51b5\u4e0b\uff0c\u7b80\u5355\u7684\u6d4b\u8bd5\u7528\u4f8b\n\n```\n# test_case.yaml\n# yaml\u6d4b\u8bd5\u7528\u4f8b\uff0c\u6a21\u578b\u793a\u4f8b:\n- project:\n name: xxx App\n module: xxx\u6a21\u5757-\u529f\u80fd\u6d4b\u8bd5\n\n- case:\n # id desc \u9009\u586b\uff0c\u975e\u7ea6\u5b9a\u5b57\u6bb5 \n id: ATP-1\n desc: \u6d4b\u8bd5\u7528\u4f8b-\u6a21\u677f\u683c\u5f0f\u7684\u8bbe\u8ba1-\u6a21\u677f\uff08\u5168\u5b57\u6bb5\uff09\n\n # name \u5fc5\u586b\uff0c\u9700\u786e\u4fdd\u552f\u4e00\u6027\n name: android_app_ui_auto_test_demo_1\n\n # responsible \u9009\u586b\n responsible: rockfeng0\n\n # tester \u9009\u586b\n tester: rockfeng0\n\n # \u5b9a\u4e49\u6b63\u5219\u8868\u8fbe\u5f0f, \u5b9a\u4e49\u7684\u5b57\u7b26\u4e32\u4e0d\u4f1a\u89e3\u6790\n glob_regx:\n rex_bar_title: 'Views/Controls/(.*)'\n\n # \u5b9a\u4e49\u53d8\u91cf\uff0c \u6548\u679c\u540c SetVar(name, value)\n glob_var:\n app_package: io.appium.android.apis\n app_main_activity: .ApiDemos\n app_view_webview_activity: .view.WebView1\n app_view_button_activity: .view.Buttons1\n app_view_control_activity: .view.Controls1\n app_view_dragdrop_activity: .view.DragAndDropDemo\n app_graphic_paint_activity: .graphics.TouchPaint\n app_animation_activity: .animation.BouncingBalls\n\n # pre_command \u9009\u586b\n pre_command:\n - ${StartActivity($app_package, $app_view_control_activity)}\n - ${DyStrData(var_bar_title, $rex_bar_title)}\n - ${VerifyVar(var_bar_title, 1. Light Theme)} \n\n # steps \u5fc5\u586b\n steps: \n\n # \u5728appdriver\u4e2d\uff0c\u5b9a\u4f4d\u5143\u7d20\n - appdriver:\n by: id\n value: io.appium.android.apis:id/edit\n index: 0\n timeout: 10\n action: ${SendKeys(\u4f60\u597d - hello)}\n\n - appdriver:\n action: ${TimeSleep(1)}\n\n - appdriver:\n by: -android uiautomator\n value: text(\"Checkbox 1\")\n index: 0\n timeout: 10\n action: ${Tap()}\n\n - appdriver:\n action: ${VerifyElemAttr(checked, true)}\n\n - appdriver:\n action: ${Tap()}\n\n - appdriver:\n action: ${VerifyElemAttr(checked, false)}\n\n - appdriver:\n action: ${TimeSleep(1)} \n\n - appdriver:\n action: ${Swipe(up, 1)}\n\n - appdriver:\n by: id\n value: android:id/text1 \n action: ${Tap()} \n\n - appdriver:\n by: -android uiautomator\n value: 'text(\"Earth\")'\n action: ${Tap()}\n\n # post_command \u9009\u586b\n post_command:\n - ${Back()}\n - ${CloseApp()}\n\n```\n\n## \u5206\u5c42\u7528\u4f8b\n\n- \u5206\u5c42\u7528\u4f8b\uff0c\u662f\u6307\u6a21\u5757\u529f\u80fd\u6d4b\u8bd5\u7684\u65f6\u5019\uff0c\u5bf9\u6d4b\u8bd5\u7528\u4f8b\u8fdb\u884c\u5206\u5c42\uff0c\u6700\u5c0f\u7684\u5355\u5143\u4e3aapi\uff0c\u5176\u6b21\u4e3asuite\uff0c\u6700\u540e\u7ec4\u6210\u7528\u4f8b\n- \u5176\u5b58\u653e\u8def\u5f84\u3001\u7f16\u5199\u89c4\u5219\u7b49\uff0c\u8be6\u89c1 [rtsf](https://github.com/RockFeng0/rtsf)\u76f8\u5173\u4ecb\u7ecd\n- \u793a\u4f8b\u53ef\u4ee5\uff0c\u53c2\u89c1[rtsf-http](https://github.com/RockFeng0/rtsf-http)\u76f8\u5173\u4ecb\u7ecd\n\n\n# \u5c01\u88c5\u7684\u5173\u952e\u5b57(\u5185\u7f6e\u51fd\u6570)\n\n\u5173\u952e\u5b57\u7684\u4f7f\u7528\uff0c\u5728\u524d\u9762\uff0c\u6709\u4ecb\u7ecd\uff0c\u89c4\u5219\u5982\u4e0b\n> \u53d8\u91cf\u5f15\u7528-> $var \u5173\u952e\u5b57(\u51fd\u6570)\u5f15\u7528-> ${function}\n\n## App functions --> android\u8bbe\u5907-\u6d4b\u8bd5\u76f8\u5173\u5e38\u7528\u64cd\u4f5c\n\n```\nLaunchApp() # use current session to launch and active the app \nStartActivity(app_package,app_activity,timeout) # Only support android. start an activity and focus to it. default timeout is 10 seconds\nPageSource() # page source for this activity\nForward() # \u7c7b\u4f3c\u6d4f\u89c8\u5668\u7684 \u524d\u8fdb\nBack() # \u7c7b\u4f3c\u6d4f\u89c8\u5668\u7684 \u540e\u9000\nShake() # \u6a21\u62df\u8bbe\u5907\u6447\u6643 \nBackgroundApp(seconds) # \u5e94\u7528\u4f1a\u88ab\u653e\u5230\u540e\u53f0\u7279\u5b9a\u65f6\u95f4,\u7136\u540e\u5e94\u7528\u4f1a\u91cd\u65b0\u56de\u5230\u524d\u53f0 \nOpenNotifications() # \u6253\u5f00\u901a\u77e5\u680f\nRemoveApp(app_package) # \u5378\u8f7dapp\nSwitchToDefaultContext() # \u5207\u6362\u5230\u9ed8\u8ba4\u4e0a\u4e0b\u6587 \nSwitchToNewContext() # \u5207\u6362\u5230\u65b0\u7684\u4e0a\u4e0b\u6587\nReset() # \u91cd\u7f6eapp, \u5373\u5148closeApp\u7136\u540e\u5728launchAPP\nCloseApp() # only close app . keep the session\nQuitApp() # will close the session\n```\n\n\n## AppElement methods --> \u5143\u7d20\u5b9a\u4f4d\u76f8\u5173\u64cd\u4f5c\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
AppElement methods\u53c2\u6570\u4ecb\u7ecd\u63cf\u8ff0
GetControl() \u83b7\u53d6element controls,\u8fd4\u56de\u5b57\u5178\uff0c\u5982\uff1a{\"by\":None,\"value\":None,\"index\":0,\"timeout\":10}
SetControl(by,value,index,timeout)by: \u6307appium\u7684\u5bfb\u627e\u5143\u7d20\u7684\u65b9\u5f0f:NativeApp\u652f\u6301(\"id\",\"xpath\",\"class name\",'-android uiautomator')\uff0cWebView\u652f\u6301selenium\u6240\u7528\u65b9\u5f0f\uff0c\u9ed8\u8ba4\u4e3aNone\n 1.\u4f9d\u636eapp\u5f53\u524dcontext\uff0c\u8bbe\u7f6eelement controls\uff0c\u7528\u4e8eapp\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u63a7\u5236
\n 2. -android uiautomator\u662fappium\u4f7f\u7528uiautomator\u4e2d\u7684UiSelector\u6765\u5b9a\u4f4d\u5143\u7d20\uff0c\u5e38\u7528\u6765\u4f7f\u7528\u6587\u672c\u5b9a\u4f4d\u5143\u7d20\uff0cvalue\u503c\u5982 text(\"xxxx\")\n
value: \u4e0eby\u914d\u5bf9\u4f7f\u7528\uff0c\u76f8\u5e94by\u7684\u503c
index: \u7d22\u5f15\u503c\uff0c\u9ed8\u8ba4\u4e3a0\uff0c\u5373\u7b2c\u4e00\u4e2a\uff0c \u5982\u679cby,value\u7ec4\u5408\u627e\u5230\u5f88\u591a\u5143\u7d20\uff0c\u901a\u8fc7\u7d22\u5f15index\u6307\u5b9a\u4e00\u4e2a
timeout: \u8d85\u65f6\u65f6\u95f4\uff0c\u9ed8\u8ba410\uff0c\u537310\u79d2\uff0c\u5982\u679cby,value\u7ec4\u5408\u5bfb\u627e\u5143\u7d20\u8d85\u8fc710\u79d2\uff0c\u8d85\u65f6\u62a5\u9519
\n\n\n## AppContext methods --> \u7528\u4e8e\u4e0a\u4e0b\u6587\u7ba1\u7406\n```\nDyAttrData(name,attr) # -> \u5c5e\u6027-\u52a8\u6001\u5b58\u50a8\u53d8\u91cf\uff0c\u9002\u7528\u4e8e\uff0c\u4fdd\u5b58UI\u5143\u7d20\u5c5e\u6027\u503c\u3002name-\u53d8\u91cf\u540d\u79f0\uff0cattr\u4e3aUI\u5143\u7d20\u7684\u5c5e\u6027\u540d\u79f0\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nDyActivityData(name) # -> \u4f7f\u7528\u53d8\u91cf,\u4fdd\u5b58\u5f53\u524dapp activity name\nDyPackageData(name) # -> \u4f7f\u7528\u53d8\u91cf,\u4fdd\u5b58\u5f53\u524dapp package name\nDyStrData(name, regx, index) # -> \u5b57\u7b26\u4e32-\u52a8\u6001\u5b58\u50a8\u53d8\u91cf\uff0c\u9002\u7528\u4e8e\uff0c\u4fdd\u5b58\u9875\u9762html\u4e2d\u6307\u5b9a\u7684\u503c\u3002 name-\u53d8\u91cf\u540d\u79f0\uff0cregx\u5df2\u7f16\u8bd1\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\uff0cindex\u6307\u5b9a\u7d22\u5f15\uff0c\u9ed8\u8ba40\n\n\nGetVar(name) # -> \u83b7\u53d6\u6307\u5b9a\u53d8\u91cf\u7684\u503c\nSetVar(name,value) # -> \u8bbe\u7f6e\u6307\u5b9a\u53d8\u91cf\u7684\u503c\n```\n\n## AppWait methods --> \u7528\u4e8e\u65f6\u95f4\u7684\u63a7\u5236\n```\nTimeSleep(seconds) # -> \u6307\u5b9a\u7b49\u5f85\u65f6\u95f4(\u79d2\u949f)\nWaitForAppearing() # -> \u7b49\u5f85\u5143\u7d20\u51fa\u73b0(\u53ef\u80fd\u662f\u9690\u85cf\uff0c\u4e0d\u53ef\u89c1\u7684)\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nWaitForDisappearing() # -> \u7b49\u5f85\u5143\u7d20\u6d88\u5931\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nWaitForVisible() # -> \u7b49\u5f85\u5143\u7d20\u53ef\u89c1\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\n```\n\n## AppVerify methods --> \u7528\u4e8e\u9a8c\u8bc1\n```\nVerifyVar(name, expect_value) # -> \u9a8c\u8bc1\u53d8\u91cf\u503c\uff0c\u662f\u671f\u671b\u7684expect_value\uff0c\u8fd4\u56deTrue\uff0c\u5426\u5219\u8fd4\u56deFalse\nVerifyAppInstalled(app_package) # -> \u9a8c\u8bc1app package name\u5df2\u7ecf\u5b89\u88c5\nVerifyCurrentActivity(app_activity) # -> \u9a8c\u8bc1\u5f53\u524dapp activity name\u662f\u671f\u671b\u7684app_activity\nVerifyText(text) # -> \u9a8c\u8bc1\u5143\u7d20text\u5c5e\u6027\u503c\uff0c\u4e3a\u671f\u671b\u7684text,**\u914d\u5408SetControl\u4f7f\u7528**\nVerifyElemEnabled() # -> \u9a8c\u8bc1\u5143\u7d20\u662fenabled\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nVerifyElemNotEnabled() # -> \u9a8c\u8bc1\u5143\u7d20\u662fNot Enabled, **\u914d\u5408SetControl\u4f7f\u7528**\nVerifyElemVisible() # -> \u9a8c\u8bc1\u5143\u7d20\u662f\u53ef\u89c1\u7684\uff0c **\u914d\u5408SetControl\u4f7f\u7528**\nVerifyElemNotVisible() # -> \u9a8c\u8bc1\u5143\u7d20\u662f\u4e0d\u53ef\u89c1\u7684\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nVerifyElemAttr(attr_name,expect_value) # -> \u9a8c\u8bc1\u5143\u7d20\u5c5e\u6027attr_name\u7684\u503c\uff0c\u5305\u542b\u503cexpect_value,**\u914d\u5408SetControl\u4f7f\u7528**\nVerifyElemCounts(num) # -> \u9a8c\u8bc1\u5143\u7d20\u6570\u91cf\u4e3anum,**\u914d\u5408SetControl\u4f7f\u7528**\n```\n\n## AppTouchAction methods --> \u7528\u4e8eAndroid\u89e6\u6478\u64cd\u4f5c\n```\nTap() # -> \u5728\u6307\u5b9a\u5143\u7d20\u4e0a\uff0c\u8f7b\u89e6\u70b9\u51fb 1\u6b21\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nLongPress() # -> \u5728\u6307\u5b9a\u5143\u7d20\u4e0a\uff0c\u957f\u6309\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nPress() # -> \u5728\u6307\u5b9a\u5143\u7d20\u4e0a\uff0c\u6309\u4f4f\u4e0d\u91ca\u653e\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nMoveTo() # -> \u79fb\u52a8\u5230\u6307\u5b9a\u5143\u7d20\u4e0a\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nRelease() # -> \u5728\u6307\u5b9a\u5143\u7d20\u4e0a\uff0c\u91ca\u653e\u6309\u4f4f\u7684\u64cd\u4f5c\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nDraw() # -> \u5728\u5f53\u524dactivity\u4e2d\uff0c\u753b\u753b\nSwipe(direction, times) # -> \u5728\u5f53\u524dactivity\u4e2d\uff0c\u6ed1\u52a8.direction\u6ed1\u52a8\u65b9\u5411: up, down, left, right; times\u6ed1\u52a8\u6b21\u6570\uff0c\u9ed8\u8ba41\u6b21\n```\n\n## AppActions methods --> \u7528\u4e8eAndroid\u5e38\u89c4\u64cd\u4f5c\n```\nPinch() # -> \u5728\u6307\u5b9a\u5143\u7d20\u4e0a\u7f29\u5c0f\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nZoom() # -> \u5728\u6307\u5b9a\u5143\u7d20\u4e0a\u653e\u5927\uff0c**\u914d\u5408SetControl\u4f7f\u7528**\nSendKeys(value) # -> \u5728\u6307\u5b9a\u5143\u7d20\u4e0a,\u8f93\u5165\u6587\u672c\u503c\uff0c**\u914d\u5408SetControl\u4f7f\u7528**, \u7ee7\u627f\u81easelenium\uff0c\u53ef\u7528\u4e8eWebView\nclick() # -> \u5728\u6307\u5b9a\u5143\u7d20\u4e0a\uff0c\u70b9\u51fb\u5de6\u952e\u4e00\u6b21\uff0c**\u914d\u5408SetControl\u4f7f\u7528**, \u7ee7\u627f\u81easelenium,\u53ef\u7528\u4e8eWebView\n```\n\n> AppTouchAction\u548cAppActions\uff0c\u5c01\u88c5\u8f83\u5c11\u7684\u539f\u56e0\u662f\u8003\u8651\u5230Appium\u7ee7\u627f\u4e86selenium,\u56e0\u6b64\u6709\u4e9bappium\u63d0\u4f9b\u7684\u65b9\u6cd5\u4e2d,\u5e76\u4e0d\u4f1a\u540c\u65f6\u517c\u5bb9NativeApp\u548cWebviewApp\uff0c\u540c\u65f6\uff0c[rtsf-web](https://github.com/RockFeng0/rtsf-web)\u9879\u76ee\u5df2\u7ecf\u652f\u6301\u4e86selenium\u5bf9web ui\u7684\u6d4b\u8bd5\u3002\n\n## \u81ea\u5b9a\u4e49\uff0c\u5173\u952e\u5b57(\u51fd\u6570\u3001\u53d8\u91cf)\n> \u5728case\u540c\u7ea7\u76ee\u5f55\u4e2d\uff0c\u521b\u5efa preference.py, \u8be5\u6587\u4ef6\u6240\u5b9a\u4e49\u7684 \u53d8\u91cf\u3001\u51fd\u6570\uff0c\u53ef\u4ee5\u88ab\u52a8\u6001\u52a0\u8f7d\u548c\u5f15\u7528\n\n\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u4f7f\u7528 \u53d8\u91cf\u5f15\u7528 \u6216\u8005\u5173\u952e\u5b57\u5f15\u7528\u7684\u65b9\u6cd5\uff0c\u8c03\u7528\uff0c\u81ea\u5b9a\u4e49\u7684\u51fd\u6570\u548c\u53d8\u91cf\n\n```\n# preference.py \u793a\u4f8b\n\ntest_var = \"hello rtsf.\"\ndef test_func():\n return \"nihao rtsf.\"\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/RockFeng0/rtsf-app", "keywords": "test android ui", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "rtsf-app", "package_url": "https://pypi.org/project/rtsf-app/", "platform": "", "project_url": "https://pypi.org/project/rtsf-app/", "project_urls": { "Homepage": "https://github.com/RockFeng0/rtsf-app" }, "release_url": "https://pypi.org/project/rtsf-app/1.2.2/", "requires_dist": [ "Appium-Python-Client", "requests", "rtsf", "rtsf-web" ], "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "summary": "only for android ui test, base on rtsf", "version": "1.2.2" }, "last_serial": 4448695, "releases": { "1.1": [ { "comment_text": "", "digests": { "md5": "ab63b8fe8d958856235290b1e3d40e26", "sha256": "ff4e91857945372995e4a45cc811378159ecf52802f3601000f0214f299ff00f" }, "downloads": -1, "filename": "rtsf_app-1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ab63b8fe8d958856235290b1e3d40e26", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 16489, "upload_time": "2018-10-14T12:14:25", "url": "https://files.pythonhosted.org/packages/8b/42/a4cd967e5dbad450259bff27f1cc7061962058a0c2a296a5866225a4f09f/rtsf_app-1.1-py3-none-any.whl" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "7561b678385680400bb0b0a45f6436be", "sha256": "0ac80a85e7417cab2070f66022db734113657da7161138f6f279a6477b279183" }, "downloads": -1, "filename": "rtsf_app-1.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7561b678385680400bb0b0a45f6436be", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 22921, "upload_time": "2018-11-04T02:04:20", "url": "https://files.pythonhosted.org/packages/b2/db/f7096d040ea1330f0bc6ada3d0d6dedce0169433682cf34404e40dbd26ec/rtsf_app-1.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4a4484c9d23d93be630ce7698931ee1", "sha256": "aa925904397614b5e0f15f44cc00e37308838a639f731ba70f533d65ae15e164" }, "downloads": -1, "filename": "rtsf-app-1.2.1.tar.gz", "has_sig": false, "md5_digest": "d4a4484c9d23d93be630ce7698931ee1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 22817, "upload_time": "2018-11-04T02:04:21", "url": "https://files.pythonhosted.org/packages/38/09/b9605e1f300d2949303a47075e0e03dd0024eff028ee3bc364d0087916c5/rtsf-app-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "ed2dcda3179e4777c62f0ced78192d1e", "sha256": "8619eeae97beb787377575ae7fcb1bf65f3421dc4660d672b85e59d97345062c" }, "downloads": -1, "filename": "rtsf_app-1.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ed2dcda3179e4777c62f0ced78192d1e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 22922, "upload_time": "2018-11-04T02:11:15", "url": "https://files.pythonhosted.org/packages/24/b6/851a0c42fb8d94aaac6209e51879425c4dfb1f2c87bda7f09d507557905c/rtsf_app-1.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ddddb2d12e58097f6e3f6aacaf52b735", "sha256": "8dcc94bd9ae60e2deb0247bd0ca606dded5effaec82145f1f15c5b431eef8a39" }, "downloads": -1, "filename": "rtsf-app-1.2.2.tar.gz", "has_sig": false, "md5_digest": "ddddb2d12e58097f6e3f6aacaf52b735", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 22824, "upload_time": "2018-11-04T02:11:17", "url": "https://files.pythonhosted.org/packages/e1/69/04571459854ed8f8a7c2f6d2b4ee2fb53b2a4c86823ce1500829e1e0bee6/rtsf-app-1.2.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ed2dcda3179e4777c62f0ced78192d1e", "sha256": "8619eeae97beb787377575ae7fcb1bf65f3421dc4660d672b85e59d97345062c" }, "downloads": -1, "filename": "rtsf_app-1.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ed2dcda3179e4777c62f0ced78192d1e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 22922, "upload_time": "2018-11-04T02:11:15", "url": "https://files.pythonhosted.org/packages/24/b6/851a0c42fb8d94aaac6209e51879425c4dfb1f2c87bda7f09d507557905c/rtsf_app-1.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ddddb2d12e58097f6e3f6aacaf52b735", "sha256": "8dcc94bd9ae60e2deb0247bd0ca606dded5effaec82145f1f15c5b431eef8a39" }, "downloads": -1, "filename": "rtsf-app-1.2.2.tar.gz", "has_sig": false, "md5_digest": "ddddb2d12e58097f6e3f6aacaf52b735", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 22824, "upload_time": "2018-11-04T02:11:17", "url": "https://files.pythonhosted.org/packages/e1/69/04571459854ed8f8a7c2f6d2b4ee2fb53b2a4c86823ce1500829e1e0bee6/rtsf-app-1.2.2.tar.gz" } ] }