上一篇文章介绍安装appium测试环境,这一片研究介绍如何测试Android自动化。
上一篇地址:《【Mac + Appium学习(一)】之安装Appium环境》
这一篇参考:《Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)》
配置环境:
- Appium version :1.9.1
- Appium-desktop:后改为1.7.1
- Android:6.0.1
- Mac:10.13.6
一、appium-desktop配置连接Android真机
1、开启appium服务
如果报错:参考上一篇解决办法(第二节第6小点)
2、配置连接真机的参数
参数配置如下: 参考《Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)》
其中,appPackage、appActivity如何获取呢(有坑):
参考:《获取app的 appPackage和appActivity》
输入如下:
$ adb shell shell@R9s:/ $ dumpsys activity | grep mFocusedActivity mFocusedActivity: ActivityRecord{f8dacd9 u0 cn.sqm.citymine_safety/.LoginActivity(这块有问题,见下面) t64}
其中:cn.sqm.citymine_safety/.LoginActivity是我们需要的
可以点击【Save As】进行保存
然后点击【Start Session】按钮。
但是报错:An unknown server-side error occurred while processing the command. Original error: Error occured while starting App. Original error: Permission to start activity denied.
经查询得知是:appActivity这块的问题
《Error occured while starting App. Original error: Permission to start activity denied.错误的解决方法》
解决如下,命令行输入:
adb shell dumpsys activity activities >/Users/xxx/Desktop/activity.txt
打开文档,如下:
3、检查器
修改后再一次运行,会打开The Inspector:
检查器是应用程序状态的可视化表示具有在应用程序中执行某些交互的能力Appium。
4、解决每次启动时都安装setting和unlock app方法
但是有一个问题是,以后每次启动都要安装setting和unlock app,为了解决,如下:
《关掉appium setting 和unlock自动安装的方法》*
==========================================================
下面两个因为不是在appium-desktop下修改的,所以对本文不适。
①《MacBook Appium 禁止每次运行都会启动appium setting 、appium unlock》
②《appium解决每次运行都需要安装Unlock以及AppiumSetting的问题》
==========================================================
1)首先修改...lib/android-helpers.js文件
从网上找了很多修改的方法但是统一都在appium下的android-helpers.js修改,屡试不爽,经过查询得知应该在appium-desktop下修改,可能是因为我用的是这个软件吧:
它的路径为:
# 修改android-helpers.js
open
/Applications/Project/Appium1.7.1.app/Contents/Resources/app/node_modules/appium/node_modules/appium-android-driver/lib
打开android-helpers.js文件
①搜索下面代码后注释掉:328行
await adb.install(unicodeIMEPath, false);
如图:
②接着注释掉下面两行代码:469、472行
await helpers.pushSettingsApp(adb);
await helpers.pushUnlock(adb);
这个文件就算改完了,保存并退出。
2)其次修改.../build/lib/android-helpers.js文件
# 修改android-helpers.js
open /Applications/Project/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-android-driver/build/lib/
①注释掉代码并在下一行添加一行代码:892、893行
// return _regeneratorRuntime.awrap(adb.install(_appiumAndroidIme.path, false)); return context$1$0.abrupt('return',defaultIME);
②接着注释下面并添加一行:1287、1288行;1297、1298行
// return _regeneratorRuntime.awrap(helpers.pushSettingsApp(adb)); return context$1$0.abrupt('return',defaultIME); // return _regeneratorRuntime.awrap(helpers.pushUnlock(adb)); return context$1$0.abrupt('return',defaultIME);
ok,保存并且退出。重启appium-desktop即可。不会再无休止地让你安装Unlock和AppiumSetting了。
二、 Android自动化py脚本编写
写一下简易的代码如下:
desired_capabilities.py
def get_desired_capabilities(): desired_caps = { "platformName": "Android", "platformVersion": "6.0.1", "deviceName": "OPPO", "appPackage": "cn.sqm.citymine_safety", "appActivity": ".activity.LauncherActivity", "udid": "608ad0fe" } return desired_caps def get_uri(): return 'http://localhost:4723/wd/hub'
test.py
from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import unittest import time from time import sleep import Mine.Appium.desired_capabilities as desired_capabilities from selenium.webdriver.common.by import By class AndroidTest(unittest.TestCase): @classmethod def setUpClass(self): desired_cap = desired_capabilities.get_desired_capabilities() uri = desired_capabilities.get_uri() self.d = webdriver.Remote(uri,desired_cap) @classmethod def tearDownClass(self): sleep(10) self.driver.quit() pass def setUp(self): print("=======start!=======") sleep(5) size = self.d.get_window_size() print(size) # 输入用户名 userName = self.d.find_element(By.ID,"cn.sqm.citymine_safety:id/et_login_id") userName.send_keys("xxx") # 输入密码 password = self.d.find_element(By.ID,"cn.sqm.citymine_safety:id/et_login_password") password.send_keys("xxx") # 登录密码 button = self.d.find_element(By.ID,"cn.sqm.citymine_safety:id/btn_login") button.click() def tearDown(self): print("=======stop!=======") def test1(self): print("测试开始!") # 发起任务 self.d.find_element_by_id("cn.sqm.citymine_safety:id/rl_add_task").click() # 任务类型 self.d.find_element_by_id("cn.sqm.citymine_safety:id/tv_select_task_type").click() self.d.swipe(534, 1630, 534, 1583, 500) # 向上拖动 self.d.swipe(500, 1270, 500, 500, 500) # 获取值 text = self.d.find_element_by_id("cn.sqm.citymine_safety:id/tv_get_location").text self.assertEqual(text,"公园1","定位不对!") if __name__=='__main__': unittest.main()
但是报错:
selenium.common.exceptions.WebDriverException: Message: Parameters were incorrect. We wanted {"required":["value"]} and you sent ["text","value","id","sessionId"]
解决参考如下:
《appium+webdriveragent+Python+真机/模拟器 app自动化测试》
找到原因是selenium版本的问题,把selenium版本降到3.0.1 就可以了,执行命令如下:
# 查看命令: pip show selenium //查看当前包的版本信息 # 卸载命令: pip uninstall selenium //卸载当前安装的包 # 安装命令: pip install selenium==3.0.1 //指定版本号安装 # 查看命令: pip show selenium //查看当前包的版本信息
但是再一次执行appium程序时又遇到如下报错:
ImportError: cannot import name 'InvalidArgumentException'
参考解决如下:《执行appium程序时遇到如下报错,ImportError: cannot import name 'InvalidArgumentException'》
在此路径下的exceptions.py文件中添加一段代码:
/Users/xxx/.pyenv/versions/3.6.1/lib/python3.6/site-packages/selenium/common/exceptions.py
class InvalidArgumentException(WebDriverException): """ """ pass