【Mac + Appium + Python3.6学习(二)】之Android自动化测试,appium-desktop配置和简易自动化测试脚本...-程序员宅基地

技术标签: python  测试  移动开发  

上一篇文章介绍安装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程序,自动化运行成功!!!! 

 

转载于:https://www.cnblogs.com/Owen-ET/p/9945164.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30699831/article/details/95517276

智能推荐

AndFix注意事项-程序员宅基地

文章浏览阅读64次。1、生成补丁,修改前后的apk包都必须签名。2、AndFix 不支持修改布局文件。3、文件的路径必须正确。4、AndFix 不支持添加匿名内部类(就是点击事件)。5、AndFix 不支持添加新的类。6、AndFix 支持连续打补丁(注意补丁的名字要求不一样)。转载于:https://www.cnblogs.com/Jackie-zhang/p/10162430.html..._阿里andfix增加内部类

qpushbutton添加menu时不显示三角下表_如何看待奶粉中添加的香精香料?不同人群这样说...-程序员宅基地

文章浏览阅读115次。婴幼儿配方奶粉是作为宝宝在无法母乳喂养时的无奈选择,也是除母乳以外最好的选择,宝妈在选择奶粉时也会格外认真,当看到奶粉中含有香精香料成分时,部分宝妈便不会购买,甚至认为此类成分是对宝宝身体有所危害的,所以坚决抵制购买,那么添加到奶粉中的香精香料到底怎么样,长期吃有没有坏处?我们来看看吧~不同人群,对香精香料有不同看法"宝妈们这样说:前段时间网上一位宝妈的评论吸引了笔者的注意:“我这奶粉买回家一开罐...

【备忘录】 iPad air3 pro 10.5 原装键盘 失灵 维修_ipad10.5键盘套没反应-程序员宅基地

文章浏览阅读2.5k次。并不是苹果说的触点问题,而是软布导线被腐蚀断线问题。用铜箔胶带粘一下就好了。不过二手直接买一个咸鱼上也就三百多,也不贵。这个明显是苹果设计缺陷。直接丢了挺可惜的。拆的时候小心点。我的QQ: 13008312096,有空的话可以帮忙有偿代处理。参考链接如下:nullhttps://www.youtube.com/watch?v=buNYHzMZJdk修复好的样子,毫无违和感:..._ipad10.5键盘套没反应

gif图用photoshop快速抽帧,压缩,去底,修改时间_gif抽帧-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏13次。网上下载的gif图很多都不透底,而且尺寸时间什么的都不合适,用ps简单修改一下就好了1.抽帧很多gif图帧数很多,抽帧可以大幅压缩gif大小1.导入gif到ps2.勾选动作和时间轴面板这时我们发现帧和图层的隐藏显示是相对应的这样的话我们操作图层就会打乱帧,我们要让所有的图层都显示,但又不干扰帧的显示3.这时我们就要把它转换为视频时间轴4.然后再转换帧>>转换为..._gif抽帧

c++ 优先队列_面试必知必会|堆和优先队列-程序员宅基地

文章浏览阅读235次。通过本文将了解到以下内容:优先队列的概念优先队列的实现优先队列的应用1.优先队列的概念优先队列是计算机科学中的一类抽象数据类型。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。优先队列至少需要支持下述操作:a.插入带优先级的元素b.取出具有最高优先级的元素c.查看最高优先级的元素。综合考虑插入和删除的性能 优先队列一般采用堆来实..._优先队列 c++面试

windows系统VMware安装Linux虚拟机、Linux配置JDK环境、Linux安装tomcat、Linux安装mysql、Linux通过SSH连接Navicat 数据库可视化工具_vm中linux下载安装mysql jdk-程序员宅基地

文章浏览阅读281次。windows系统VMware安装Linux虚拟机、配置JDK环境、安装tomcat、安装mysql、安装redis第一部分VMware安装Linux—————————————————————————————————xshell、VMware工具链接:解压之后安装VMware工具xshell不需要安装解压可直接使用..._vm中linux下载安装mysql jdk

随便推点

Ubuntu18.04安装教程——超详细的图文教程_ubuntu系统18.04-程序员宅基地

文章浏览阅读10w+次,点赞112次,收藏974次。Ubuntu18.04镜像_ubuntu系统18.04

二、Json对象、Json数组和Json字符串_json字符串数组-程序员宅基地

文章浏览阅读6.7k次,点赞3次,收藏17次。一、Json字符串和Json对象定义:1、Json字符串:所谓字符串:单引号或者双引号引起来,是一个String类型的字符串:如下:var person='{"name":"shily","sex":"女","age":"23"}';//json字符串console.log(person)console.log(person.name)console.log(typeof person) 2、Json对象:最显著的特征:对象的值可以用 “对象.属性” 进行访问,_json字符串数组

Linux系统100条命令:关于Ubuntu和 CentOS 7 相同功能的不同的终端操作命令_ubuntu 命令跟centos-程序员宅基地

文章浏览阅读718次。CentOS 7:ip link set interface_name up 或 ip link set interface_name down。Ubuntu:ifconfig interface_name up 或 ifconfig interface_name down。CentOS 7:编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 文件。Ubuntu:编辑 /etc/network/interfaces 文件。_ubuntu 命令跟centos

windows10下VS2019编译jpegsrc.v9e.tar.gz为lib静态库(已验证)_jpeg library error vs2019-程序员宅基地

文章浏览阅读652次。jpegsr9e windows vs2019生成方法,以及库下载_jpeg library error vs2019

重磅?华为 Mate60/Pro 系列网速实测结果公布,最高 1205.57 Mbps_华为mate60pro+核实网络-程序员宅基地

文章浏览阅读647次。总的来说,华为Mate 60/Pro系列手机的高速网速表现引起了广泛的关注,这也是消费者对该系列手机购买热情高涨的一个重要因素。可以看出,华为Mate 60/Pro系列手机的网速表现非常出色,这也是消费者购买该系列手机的一个重要原因。此前,华为Mate 60 Pro的供应量已经增至1500万至1700万台,而最新消息称,华为Mate 60 Pro和Mate 60 Pro+的出货量甚至已上调至2000万台。目前,在中国市场上,手机竞争愈发激烈,不仅华为Mate 60系列,其他品牌的手机也都受到了高温的迎接。_华为mate60pro+核实网络

access查找出生日期年份_access怎样利用出生日期计算年龄呀!-程序员宅基地

文章浏览阅读7.1k次。公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解。话题:access怎样利用出生日期计算年龄呀!回答:lt;%set rs = server.createobject("adodb.recordset") curid=request("id") sql = "UPDATE pany SET a_num=a_num+1,day_count=day_count+1 WHERE day_lda..._access出生年份表达式

推荐文章

热门文章

相关标签