上一篇文章介绍安装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

再一次运行appium程序,自动化运行成功!!!!

【Mac + Appium + Python3.6学习(二)】之Android自动化测试,appium-desktop配置和简易自动化测试脚本的更多相关文章

  1. 【Mac + Appium + Python3.6学习(五)】之常用的Android自动化测试API总结

    Github测试样例地址:https://github.com/appium-boneyard/sample-code/tree/master/sample-code/examples ①定位text ...

  2. 【Mac + Appium + Python3.6学习(三)】之IOS自动化测试环境配置

    在做这一节之前先配置我的另一篇文章所需要安装的前提准备条件:<[Mac + Appium学习(一)]之安装Appium环境前提准备> 一.安装IOS自动化测试环境 配置环境: Appium ...

  3. 【Mac + Appium + Python3.6学习(四)】之常用的IOS自动化测试API总结

    环境: Appium:1.9.1 Appium-desktop:1.7.1 Xcode:10.0 IOS:iPhone5S(10.3.3) Mac:10.13.6 ①获取手机屏幕size:长.宽 &l ...

  4. 【Mac + Appium + Python3.6学习(六)】之安装Android模拟器(Genymotion)并运行模拟器进行自动化

    环境: MacOS:10.13.6 Virtualbox:5.2.22 Genymotion:genymotion-2.12.2 本文Virtualbox.Genymotion下载地址: 链接:htt ...

  5. 【Mac + Python3.6 + ATX基于facebook-wda】之IOS自动化(二):安装facebook-wda库并编写简易自动化测试脚本

    上一篇介绍完如何安装WDA,接下来开始正式安装开发库并编写自动化脚本. 目录: 一.安装facebook-wda库 二.通过WEditor定位元素 三.附录:学习资料 一.安装facebook-wda ...

  6. Python3.5 学习二十四

    本节课程大纲: -------------------------------------------------------------------------------------------- ...

  7. Python3.5 学习二十二

    回顾: 发送请求时:发送请求头和请求数据 request.META和request.request.body 响应请求时:响应头和响应返回数据 response.HEADER和response.bod ...

  8. Python3.5 学习二十一

    本节内容概要: 上节回顾及补充知识点: 一.请求周期: URL->路由->函数或类->返回字符串或者模板 Form表单提交: 提交->url-函数或者类中的方法 -....(执 ...

  9. Python3.5 学习二十

    学会用三种方法检索数据 1.对象方式 2.字典方式 3.元组方式 models后面,如果是.values() 则为字典方式 如果是value_list() 则为元组方式 跨表操作时,如果是对象,可以用 ...

随机推荐

  1. ionic 打包成apk后,所有网络请求404

    无论怎么改 config.xml <allow-navigation href="http://*/*" /> <allow-intent href=" ...

  2. MathType输入矩阵或者向量的注意事项

    如图A区域是换行搞得,BC是插入矩阵,AC明显看着不一样,就是说行间不要使用换行,列间隔不要用空格(ctrl+shift+space),直接插入矩阵,向量就是矩阵的行或者列数目是1. 还有就是需要注意 ...

  3. Inno Setup入门(十五)——Inno Setup类参考(1)

    Inno setup脚本能够支持许多的类,这些类使得安装程序的功能得到很大的加强,通过对这些类的使用,将会创建出许多让人惊奇的安装程序,下面开始类的学习. 创建自定义向导页 自定义向导页需要在Init ...

  4. 【js】js中const,var,let区别

    在node.js使用例子中,第一次看到const的声明,查询了一下,可以看得出来: http://www.cnblogs.com/ksl666/p/5944718.html 参考 主要内容是:js中三 ...

  5. Queue 队列的用法

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. 以下实例演示了队 ...

  6. 排查java.lang.OutOfMemoryError: GC overhead limit exceeded

    帮助客户排查java.lang.OutOfMemoryError: GC overhead limit exceeded错误记录: 具体网址: https://support.oracle.com/e ...

  7. iOS:二维码的扫描

    iOS 中二维码的扫描借用#import <AVFoundation/AVFoundation.h> 实现,会用到<AVCaptureMetadataOutputObjectsDel ...

  8. mongodb权限管理(转)

    Mongodb 预定义角色 Mongodb 中预定义了一些角色,把这些角色赋予给适当的用户上,用户就只能进行角色范围内的操作. 数据库用户角色 (所有数据库都有) read 用户可以读取当前数据库的数 ...

  9. tile uv

    alpha通道 用uvtile分成4份 可以放4张masks 真省 省贴图,手机对精度要求不那么高

  10. 详解Python中的生成器表达式(generator expression)

    介绍 1.生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列 ...