Appium+Python3+ Android入门

前言:

Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用。


一、环境配置

1、安装Node.js

https://nodejs.org/

2、安装Appium

http://appium.io/ 

3、安装Android SDK

http://tools.android-studio.org/index.php/sdk

4、安装Python-client

pip3 install Appium-Python-Client

5、安装Appium-client

npm install wd

最后,打开命令行,输入“appium-doctor”命令,如果出现以下提示,说明你Appium所需要的各项环境都已准备完成。


二、服务关键字

Desired Capabilities在启动session的时候是必须提供的。

Desired Capabilities本质上是以key value字典的方式存放,客户端将这些键值对发给服务端,告诉服务端我们想要怎么测试。

复制代码

desired_caps = {}

desired_caps['platformName'] ='Android'

desired_caps['platformVersion'] ='6.0.1'

desired_caps['deviceName'] ='e0bbc8b7'

desired_caps['appPackage'] ='com.ximalaya.ting.android'

desired_caps['appActivity'] ='com.ximalaya.ting.android.host.activity.WelComeActivity'

desired_caps["unicodeKeyboard"] ="True"

desired_caps["resetKeyboard"] ="True"

self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

复制代码

 

它告诉appium Server这样一些事情:

•deviceName:启动哪种设备,是真机还是模拟器?iPhone Simulator,iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4…

•automationName:使用哪种自动化引擎。appium(默认)还是Selendroid。

•platformName:使用哪种移动平台。iOS, Android, orFirefoxOS。

•platformVersion:指定平台的系统版本。例如指的Android平台,版本为5.1。

•appActivity:待测试的app的Activity名字。比如MainActivity、.Settings。注意,原生app的话要在activity前加个”.“。

•appPackage:待测试的app的Java package。比如com.example.android.myApp, com.android.settings。


三、定位控件

1、ID定位

使用方法:driver.find_element_by_id(‘com.android.calculator2:id/formula’)

 

2、name定位

使用方法:driver.find_element_by_name("9"))

 

3、class name定位

使用方法:driver.find_element_by_class_name(“android.widget.Button"))

 

4、XPath定位

使用方法:用class的属性来替代做标签的名字。

driver.find_element_by.xpath(“//android.view.ViewGroup/android.widget.Button”)

 

当果如果出现class相同的情况下可以用控件的属性值进行区分。

复制代码

driver.find_element_by_xpath("//android.widget.Button[contains(@text,'7')]").click();

driver.find_element_by_xpath(”//android.widget.Button[contains(@content-desc,’times')]").click();

driver.find_element_by_xpath("//android.widget.Button[contains(@text,'7')]").click();

driver.ffind_element_by_xpath("//android.widget.Button[contains(@content-desc,'equals')]").click();

复制代码

 

XPath在Appium上的用法依然很强大,有时需要写更臭更长的定位语法,因为APP上元素的class命令本来就长,再加上多层级,结果可想而知。

5、Accessibility ID定位

使用方法:其实,我们的核心是要找到元素的contentDescription属性。它就是元素的content-desc。

driver.find_element_by_accessibility_id("plus").click();

 

6、android uiautomator定位

使用方法:

一个元素的任意属性都可以通过android uiautomator方法来进行定位,但要保证这种定位方式的唯一性。

driver.find_element_by_android_uiautomator("new UiSelector().text(\”8\")").click();

driver.find_element_by_android_uiautomator("new UiSelector().description(\”plus\")").click();

 

 


四、应用操作

1、安装应用

installApp()

安装应用到设备中去。需要apk包的路径。

2、卸载应用

removeApp()

从设备中删除一个应用。

3、关闭应用

closeApp()

关闭打开的应用,默认关闭当前打开的应用,所以不需要入参。这个方法并非真正的关闭应用,相当于按home键将应用置于后台,可以通过launchApp()再次启动。

4、启动应用

launchApp()

启动应用。你一定很迷惑,不是在初始化的配置信息已经指定了应用,脚本运行的时候就需要启动应用,为什么还要有这个方法去启动应用呢?重新启动应用也是一个测试点,该方法需要配合closeApp()使用的。

5、检查应用是否安装

isAppInstalled()

检查应用是否已经安装。需要传参应用包的名字。返回结果为Ture或False。

6、将应用置于后台

runAppInBackground()

将当前活跃的应用程序发送到后台。这个方法需要入参,需要指定应用置于后台的时长。

7、应用重置

resetApp()

重置当前被测程序到出始化状态。该方法不需要入参。


五、键盘操作

1、SendKeys()方法

driver.find_element_by_name(“Name”).send_keys("jack");

2、PressKeyCode()方法

除此之外,Appium扩展提供了pressKeyCode()方法。该方法Android特有。

发送一个键码的操作。(键码对照表请自行百度,此处不展示了。)

driver.press_keycode(3)//点击Android的HOME键

driver.press_keycode(27)//点击拍照键

3、输入法问题:

必须使用appium自带键盘,并添加:

desired_caps["unicodeKeyboard"] = "True"

desired_caps["resetKeyboard"] = "True"


六、TouchAction操作

Appium的辅助类,主要针对手势操作,比如滑动、长按、拖动等。

1、按压控件press()

开始按压一个元素或坐标点(x,y)。通过手指按压手机屏幕的某个位置。

press(WebElement el, int x, int y)

2、长按控件longPress()

开始按压一个元素或坐标点(x,y)。相比press()方法,longPress()多了一个入参,既然长按,得有按的时间吧。duration以毫秒为单位。1000表示按一秒钟。其用法与press()方法相同。

longPress(WebElement el, int x, int y, Duration duration)

3、点击控件tap()

对一个元素或控件执行点击操作。用法参考press()。

tap(WebElement el, int x, int y)

4、移动moveTo()

将指针(光标)从过去指向指定的元素或点。

movTo(WebElement el, int x, int y)

5、暂停wait()

暂停脚本的执行,单位为毫秒。

action.wait(1000);


七、其他操作

其它操作针对移动设备上特有的一些操作。

1、熄屏

方法:lockDevice()

点击电源键熄灭屏幕。

在iOS设备可以设置熄屏一段时间。Android上面不带参数,所以熄屏之后就不会再点亮屏幕了。

driver.lockDevice(1000);// iOS

driver.lockDriice();//Android

2、收起键盘

方法:hideKeyboard()

收起键盘,这个方法很有用,当我们对一个输入框输入完成后,需要将键盘收起,再切换到一下输入框进行输入。

driver.hideKeyboard();//收起键盘

3、滑动

方法:swipe()

模拟用户滑动。将控件或元素从一个位置(x,y)拖动到另一个位置(x,y)。

swipe(int startx, int starty, int endx, int endy, int duration)

* start_x:开始滑动的x坐标。* start_y:开始滑动的y坐标。

* end_x:结束滑动的x坐标。* end_y:结束滑动的y坐标。

* duration:持续时间。

例:driver.swipe(75, 500, 75, 0, 800);

4、截屏

方法:get_screenshot_as_file()

用法:driver.get_screenshot_as_file('../screenshot/foo.png'),参数为保存的图片路径和名称

5、获取控件各种属性

方法:get_attribute()

用法: driver.find_element_by_id().get_attribute(name),

name即是左侧的标志(class,package,checkable,checked....),

可获取的字符串类型:

name(返回content-desc或text)

text(返回text)

className(返回class,只有API=>18才能支持)

resourceId(返回resource-id,只有API=>18才能支持)


八、unittest之断言

在unittest单元测试框架中,TestCase类提供了一些方法来检查并报告故障:

>>assertEqual(first, second, msg=None)

判断first和second的值是否相等,如果不相等则测试失败,msg用于定义失败后所抛出的异常信息。

>>assertNotEqual(first, second, msg=None)

测试first和second不相等,如果相等,则测试失败。

>>assertTure(expr,msg=None)

>>assertFalse(expr,msg=None)

测试expr为Ture(或为False)

>>assertIs(first, second, msg=None)

>>assertIsNot(first, second, msg=None)

测试的first和second是(或不是)相同的对象。

>>assertIsNone(expr, msg=None)

>>assertIsNotNone(expr, msg=None)

测试expr是(或不是)为None

>>assertIn(first, second, msg=None)

>>assertNotIn(first, second, msg=None)

测试first是(或不是)在second中。second包含是否包含first。


九、实例代码(例子app:喜马拉雅FM)

复制代码

import os

import unittest

from appium import webdriver

from time import sleep

# Returns abs path relative to this file and not cwd

PATH =lambdap: os.path.abspath(

os.path.join(os.path.dirname(__file__), p)

)

class Contacts Android Tests(unittest.TestCase):

def setUp(self): 

desired_caps = {}

desired_caps['platformName'] ='Android'

desired_caps['platformVersion'] ='6.0.1'

desired_caps['deviceName'] ='e0bbc8b7'

desired_caps['appPackage'] ='com.ximalaya.ting.android'

desired_caps['appActivity'] ='com.ximalaya.ting.android.host.activity.WelComeActivity'

desired_caps["unicodeKeyboard"] ="True"

desired_caps["resetKeyboard"] ="True"

self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

sleep(6)

def tearDown(self):

self.driver.close_app()

self.driver.quit()

deftest_Login(self):

self.driver.find_element_by_id('com.ximalaya.ting.android:id/tab_myspace').click()

sleep(2)

self.driver.find_element_by_accessibility_id('设置').click()

sleep(2)

width =self.driver.get_window_size()['width']

height =self.driver.get_window_size()['height']

self.driver.swipe(width /2, height *7/8, width /2, height *4/8,1000)

# 不同的手机分辨率不同,所以一个坐标如果用另一个分辨率不同的手机可能位置就有所变化了,为了让apppium 更好的兼容不同分辨率的设备,

# 在执行滑动前先获取屏幕的分辨率。

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_tv_login').click()

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_username').send_keys('18500425217')

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_password').send_keys('wj1234')

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_login').click()

sleep(4)

text =self.driver.find_element_by_id('com.ximalaya.ting.android:id/tab_myspace').text

self.assertEqual(text,'我的')

deftest_Search(self):

sleep(3)

message =self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_item_finding_title').text

self.assertEqual(message,'天天好书')

self.driver.find_element_by_accessibility_id("搜索").click()

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_search_et').send_keys('段子')

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_search_button').click()

self.driver.get_screenshot_as_file('/Users/wangjuan/截图图库/1.jpg')

self.driver.press_keycode(4)

self.assertEqual(message,'天天好书')

if__name__ =='__main__':

suite = unittest.TestLoader().loadTestsFromTestCase(ContactsAndroidTests)

unittest.TextTestRunner(verbosity=2).run(suite)

复制代码

原文地址:https://www.cnblogs.com/rxq-648611643/p/10335724.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


前言:appium可以说是app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本支持java和python。以下为python+appium的安装教程...环境准备...1、配置java环境:见之前随笔--验证jdk和 androidsdk安装是否成功: 2、python安装:见之前随笔 3、安装node.js--官网
(原文:https://www.cnblogs.com/fancy0158/p/10047906.html)TestSuite套件可以添加很多个用例后运行,但是每个用例都需要调用addTest()函数。当测试用例很多时,需要把用例拆分,写到不同的.py文件中。一个简单的测试项目目录如下:测试用例放在同一个文件夹或不同目录下,此时可以使用unit
一Appium介绍1.1含义开源,跨平台,多语言支持的移动应用自动化工具1.2测试对象原生APP:就是专门针对某一类移动设备而生的,所有界面和代码都是专门为平台设计。混合APP:指它的一部分是原生界面和代码,而另一部分是内嵌webapp。移动web APP现在基本上可以打开网页浏览的APP都是
前言:Appium是一个自动化测试开源工具,支持iOS平台和Android平台上的原生应用,web应用和混合应用。一、环境配置1、安装Node.jshttps:/odejs.org/2、安装Appiumhttp://appium.io/ 3、安装AndroidSDKhttp:/ools.android-studio.org/index.php/sdk4、安装Python-c
转:https://blog.csdn.net/Tigerdong1/article/details/80159156前段时间用一种流行语言,一个主流工具,一个实用框架,写了一个美团app自动化测试的Demo,利用appium+python+unittest+uiautomatorviewer,编写了测试用例,并通过HTMLTestRunner输出测试报告。Appium环境搭建的过程就不说了(这
(原文:https://www.cnblogs.com/fancy0158/p/10056418.html)移动端执行完测试case之后,通过邮件自动发送测试报告。大体流程如下:1、通过unittest框架的discover()发现所有测试用例2、使用HTMLTestRunner的run()方法运行测试用例,生成HTML测试报告3、寻找测试报告目录下的最新测试报
输入命令adbshelldumpsyswindoww|findstr\/|findstrname=然后在手机端打开app,电脑上按enter就即可显示以微信为例子 appPackage=com.tencent.mmappActivity=.ui.LauncherUI
appium更新uiautomator后可以获取tost了,大家都尝试,课程中也讲解了,但是这些跑的时候都在单机上,当我们多机并发的时候会出现一个端口问题,因为我们appium最后会调用uiautomator2,但是多个机器的时候只会有一个机器会正常运行。这个就是因为uiautomator2端口占用问题,这个只需要在我
http://www.cnblogs.com/sundalian/p/5629500.html1.定位元素应用元素 1.1通过id定位元素Android里面定位的id一般为resrouce-id:代码可以这样写:WebElementelement=driver.findElement(By.id("com.tencent.mm:id/do"));或者:driver.findElementById("com.tencent.mm:
有时需要测试APP产品的耗电问题,但用自动化又面临了一个USB接电脑供电的问题,从而导致计算出来的功耗与手动跑,存在有很大的误差,因此可使用wifi无线连接到手机进行自动化测试,解决功耗问题。前提条件:1、确保手机已经开启Root权限2、手机和PC要在一个网段(从PC端可以ping通手机端的
1、手机滑动-swip#FileName:Tmall_App.py#Author:Adil#DateTime:2018/3/2517:22#SoftWare:PyCharmfromappiumimportwebdrivercaps={}caps['platformName']='Android'caps['platformVersion']='6.0'
(原文:https://www.cnblogs.com/fancy0158/p/10046333.html)unittest提供的Fixtures用以在测试执行前和执行后进行必要的准备和清理工作,可以定义在模块、类、用例执行前后的工作1、模块在模块中定义setUpModule()和tearDownModule()处理模块执行前后的工作defsetUpModule():
1.ready.py文件defgetport():aport=random.randint(4700,4900)#判断端口是否被占用whilegetDeviceInfo.is_open('127.0.0.1',aport):aport=random.randint(4700,4900)bpport=random.randint(4700,4900)whilegetDeviceInfo.is_open
涉及到的软件:appium、SDK、AVD、夜神模拟器、AIrtest、pycharm以下是基于window环境一、首先部署的环境是:appium+SDK+AVD+pycharm1.java环境:java-version2.node环境:node-V下载地址:https:/odejs.org/en/ 3.SDK安装下载地址:http:/ools.android-studio.org/index.php
windowscmdusages:start/B#启动应用程序,但不创建新窗口。appiumcmdusage(appiumserver):[-aADDRESS]#指定监听的ip,如127.0.0.1[-pPORT]#指定appium端口,如4723[-UUDID]#指定连接的设备名称,如emulator-5554[-bpBOOTSTRAPPORT]#指定appium和设备通信
工具一:uiautomatorviewer1、在SDK的tools目录中找到uiautomatorviewer,双击打开若出现闪退一般是jdk版本不匹配(建议安装jdk1.8的);2、在使用这个工具前,这个工具启动脚本配置有问题,需要我们修改启动批处理代码,否则会出现如下错误;      需要我们手工编辑uiautomatorviewer.
appium配置示例{“platformName”:“Android”,“platformVersion”:“4.4.2”,“deviceName”:“127.0.0.1:62001”,“app”:“E:/dev_doc/appiumxnews.apk”,“appPackage”:“com.tencent.news”,“appActivity”:“com.tencent.news.activity.SplashActivit
Appium之Python运行环境搭建Part1by:授客QQ:1033553122实践环境Win7 Python3.4.0 JAVAJDK1.8.0_121 node.js8.11.1LTS下载地址:https:/odejs.org/en/  Appium-Python-ClientAppium-Python-Client-0.26.tar.gz下载地址:https://pypi.org/project/Appium-Py
环境依赖Node.jsAppiumAppium-desktopAppium-doctorAppium-Python-ClientPythonJDKAndriodSDK安装Node.js下载地址:https:/odejs.org/en/downloadeleases/注意:Node.js版本要注意与Appium兼容,本套教程Appium版本是1.7.2,则选择的Node.js版本为6.11.3安装完成后
夜神模拟器连接adbok,使用appium运行代码断掉连接问题: 最近在学习appium,在配置完环境后,启动夜神模拟器,在cmd窗口输入adbdevices显示已经与模拟器连接了,但是启动appium运行代码的时候,提示没有找到devices,如下图。排查过程:1.再次在cmd里面输入adbdevices,发现无法连接2.在cmd