Python通过appium对Andriod定位并控制
一、Android第一个脚本
import unittest
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android' #系统
desired_caps['platformVersion'] = '10.0' #系统版本
desired_caps['deviceName'] = 'Android Emulator' #使用的手机类型或模拟器类型
desired_caps['noReset'] = True #不需要每次都重新安装
desired_caps['app'] = PATH('../app.apk')
desired_caps['automationName'] = 'Uiautomator2'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) #指定到appium desktop所监听的端口
INTERVAL = 1
time.sleep(INTERVAL * 5) #主动等待时间
上诉设置好后,下面就可定位进行操作 .click()等
二、Xpath,通过父、兄、弟节点定位元素
2.1 通过父节点定位元素
(定位元素/parent::父亲属性)
‘//android.widget.TextView[contains(@text=“欢迎观临”)]/parent::android.view.ViewGroup’
但实际可通过如下命令达到,操作父子级别的元素 “/”操作的是按钮index为2的按钮,下的一个子元素 ImageView
‘//android.widget.Button[@index=“2”]/android.widget.ImageView’
2.2.1 通过兄节点定位元素
(定位元素/preceding-sibling::兄属性,[2]表示往上第二个哥哥)
‘//android.widget.TextView[contains(@text=“标题1”)]/preceding-sibling::android.view.ViewGroup[2]’
2.2.2 通过弟节点定位元素
(定位元素/following-sibling::弟属性,[2]表示往下第二个弟弟
‘//android.widget.TextView[contains(@text=“标题2”)]/following-sibling::android.view.ViewGroup[2]’
实际可通过如下path定位操作…/表示在任意一个元素下有两个同级元素,TextView与ViewGroup
通过../可定位到一个叫大标题的TextView相邻的ViewGroup元素,并对其操作
‘//android.widget.TextView[@text=“大标题”]/…/android.view.ViewGroup[3]’
2.2.3 跨级别定位,与双条件联合定位
如下命令表示,从任意元素开始;找到一个ViewGroup元素(class实际就是Xpath定位)并且他的index为2,;而后跨过一个为ViewGoup的任意子元素,并且这个子元素下有一个ViewGroup为3的元素。
从而达到,控制元素目的,可以任意组合。
‘//*[@class=“android.view.ViewGroup” and @index=“2”]/android.view.ViewGroup/android.view.ViewGroup[3]’
三、Appium滑动函数:Swipe
Appium处理滑动方法是swipe
滑动API:Swipe(int start x,int start y,int end x,int y,duration)
解释:
int start x-开始滑动的x坐标;
int start y -开始滑动的y坐标 ;
int end x -结束点x坐标;
int end y -结束点y坐标;
duration 滑动时间(默认5毫秒)。
# 导入webdriver控件
from appium import webdriver
# 这里可以get屏幕的长和宽进行百分比控制
_width, _height = self._driver.get_window_size()['width'], self._driver.get_window_size()['height']
# 来进行向上向下向左向右的滑动。
# self 在没有定义类时可不用书写
driver.swipe(_width* 0.5, _height * 0.5, _w * 0.5, _h * 0.7, 1000)
四、python time sleep()方法
sleep()方法语法:上一步完成后,当前等待时间,默认单位0.2s注:在自动化测试时,包括截屏,定位元素,点击元素的前后,如果经常系统提示找不到控件可使用该方法,来增加代码的通过率。
t = 1
time.sleep(t)
也可写成为time.sleep(t*n)
五、Xpath定位
1. 通过EditText定位
//android.widget.EditText[@text="{}"2. 兄弟同级定位
//android.widget.TextView[@text=“管理”]/…/android.view.ViewGroup[1]3. 兄弟向上定位
//android.widget.TextView[contains(@text=“标题1”)]/preceding-sibling::android.view.ViewGroup[2]4. 兄弟向下定位
//android.widget.TextView[contains(@text=“标题2”)]/following-sibling::android.view.ViewGroup[2]5. 父子定位
//android.widget.TextView[contains(@text=“欢迎观临”)]/parent::android.view.ViewGroup6. 跨元素定位,多条件定位
//*[@class=“android.view.ViewGroup” and @index=“6”]/android.view.ViewGroup/android.view.ViewGroup[1]
六、appium+python按系统按键返回、home键等
代码就一句driver.keyevent()括号内填入的是物理按键的数字代号
from appium import webdriver
当然封装成一个可以输出日志方法,并点击按钮的方法
class PrintJournal :
def press_keyevent(self, num):
logging.debug('press keyeven[num:%s]', num)
self._driver.keyevent(num)
pass
再调用此方法
self.PrintJournal.press_keyevent('4')
是用返回
也可直接使用括号里放序号,按键钮
press_keyevent('3') #home
press_keyevent('4') #f返回
七、总结
7.1 常见问题
- 对于配置用例,连接到虚拟机等Appium+python测试app实例
- 定位元素
- 在自动化测试时,包括截屏,定位元素,点击元素的前后,如果经常系统提示找不到控件可sleep()该方法,来增加代码的通过率。从而不报错误
- 系统按键可访问appium+python怎么按系统按键如按下返回键、home键等等
7.2 总结要素
使用Appium+Python进行自动化操作,软件的核心为:
- 编译环境的配置
- Python的运行主要依赖于 selenium+webdriver工具
- 测试实例的建造
可以把测试用例,以及将常用方法封装自定义类,并有一定的体系。 - 元素的定位
可能开始是不好寻找控件,但当熟练后,这就是核心,找到空间并控制它。
通过PythonAppium来自动化控制软件,是十分的简单与方便,可以想象一下自动刷网课,购物聊天,收能量等