一、App自动化测试原理
自动化脚本—发送指令—>appium server—转发指令—>Android SDK(软件工具包/框架)—操作手机终端—>被测手机终端(模拟器/真机)
二、Desired Capabilities-Appium自动化配置项
设置参数:
操作系统:plateformName 值
版本 plateformVersion
设备名称
app ???apk的路径(自动安装到终端)
包名(应用程序)
入口启动项
Desired Capabilities-Appium
三、常用的adb命令
1. 连接模拟器:adb connect 127.0.0.1:62001
其它模拟器:雷神(5555) 夜神(62001) mumu(7555) 逍遥(21503)
2. 查看连接的设备:adb devices
3. 查看被测app的包名及入口启动页面
aapt dump badging apk的路径
四、python代码实现手机终端
以考研帮app为例:
五、appium日志的查看
六、appium元素定位工具
Android SDK自带的定位工具
位置:D:\Andriod_SDK\tools\uiautomatorviewer.bat
Jdk:支持jdk1.8或1.8以下版本
元素常见几个属性:
text:
resoureid:
class:元素标签
content-desc/description:元素功能描述-语音播报
Appium server自带的定位工具
Uiautomator2 python第三方库 通过appUI自动化测试框架
安装(在dos下进行):
命令01:pip install Uiautomator2
命令02:python -m uiautomator2 init
命令03:pip install weditor==0.6.4???(可能出错,需要降低版本)
确认安装:weditor --help
使用:weditor,会在浏览器中打开weditor
七、Appium界面元素定位方法(id/ClassName/accessibility/xpath)
版本:appium-python-client:2.11.1,selenium:4.10.0------不推荐使用
AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'
解决方法:
python用appium进行安卓测试时,find_elements_by_*提示没有这个方法的解决方案_没有find_element_by-CSDN博客
注意:1、appium1.5版本后不再支持Name定位
??????2、Selenium4.0不再支持find_elements_by_*方法,只支持finf_element(by,value)和find_elements(by.value)这两种定位方法,关键在于by的值都有哪些,如下:
第一类是继承Selenium库中的by值,在selenium.webdriver.common.by文件中,可以看到by值有以下几种:
第二类是appium封装其他库的接口(比如uiautomator2),在appium.webdriver.common.appiumby文件中,可以看到by值有以下几种(在框架中使用):
3、也可以通过AppiumBy来进行定位,如下:
from appium.webdriver.common.appiumby import AppiumBy
? ? ?
4、特殊页面元素定位(contexts):
版本:Appium-Python-Client :1.2.0,selenium:3.141.0------推荐使用,JDK:1.8
版本安装推荐如下,安装Appium-Python-Client时会自动安装selenium
pip install appium-python-client==1.2.0
解决方法:1.重启appium
2.卸载
3.在dos下执行python -m weditor
driver.find_element_by_android_uiautomator('new UiSelector().text("登录").resourceId("com.tal.kaoyan:id/login_login_btn")')
el_pass=driver.find_element_by_accessibility_id('密码 安全')
el_pass.click()
time.sleep(1)
el_pass.send_keys('1234567890')
注意:
driver.find_element_by_xpath("//*[@resource-id='com.tencent.mobileqq:id/btn_login']")
click()、send_keys()、get_attibute()、text()
get_attibute():可以输出属性值(如输入框的值、按钮值)
el_login.get_attribute('text')
Swipe(self:T,start_x:int,start_y:int,end_x:int,end_y:int,duration:int=0)
参数说明:
start_x:开始位置的x坐标
start_y:开始位置的y坐标
end_x: 结束位置的x坐标
end_y: 结束位置的y坐标
duration:延时多少毫秒
上滑:driver.swipe(360,1000,360,100,1500)
下滑:driver.swipe(360,100,360,1000,1500)
左滑:driver.swipe(650,640,100,640,1500)
右滑:driver.swipe(100,640,650,640,1500)
例():
#获取屏幕尺寸
app_size=driver.get_window_size()
print('手机屏幕的尺寸',app_size)
x=app_size['width']
y=app_size['height']
#左滑(2次)
for i in range(0,2):
driver.swipe(start_x=x*0.9,
start_y=y*0.5,
end_x=x*0.3,
end_y=y*0.5,
duration=1000)
time.sleep(1)
#点击立即体验
el_tiyan=driver.find_element_by_id("com.tal.kaoyan:id/activity_splash_guidfinish")
el_tiyan.click()
print('输入用户名')
# el_user = driver.find_element_by_id("com.tal.kaoyan:id/login_email_edittext")
el_user=driver.find_element_by_android_uiautomator('new UiSelector().text("请输入用户名")')
el_user.send_keys("xugang")
print('输入密码')
el_passwd = driver.find_element_by_id("com.tal.kaoyan:id/login_password_edittext")
el_passwd.send_keys('xugang_123')
print("请点击登录")
el_login=driver.find_element_by_android_uiautomator('new UiSelector().text("登录").resourceId("com.tal.kaoyan:id/login_login_btn")')
el_login.click()
time.sleep(10)
driver.quit()
#将元素e1拖拽到元素e2
driver.drag_and_drop(e1,e2)
from appium.webdriver.common.touch_action import TouchAction
#press:点击坐标,move_to:移动到某个坐标,release:释放鼠标,perform:执行以上所有操作
TouchAction(driver).press(x=650,y=640).wait(1500).move_to(x=100,y=640).release().perform()
driver.open_notifications()
返回键:
driver.press_keycode(4)
home键:
driver.press_keycode(3)
#通过元素定位查看元素的左边边界
#计算中点,得到被点击的坐标
driver.tap([650,51])
注意:由于不同手机的分辨率不同,导致通过坐标进行点击会出现不稳定的情况
解决办法:
size=driver.get_window_size() #获取屏幕尺寸
#driver.tap([(650,50)]) #原先元素的坐标
print(650/size['width'],50/size['height']) #得到一个百分比 0.9 0.039
driver.tap([(int(size['width']*0.9),int(size['height']*0.039))]) #通过百分比换算的元素坐标
from appium.webdriver.common.touch_action import TouchAction
TouchAction(driver).press(x=1009, y=122).release().perform()
el=driver.find_element_by_id('su')
#duration=10000:长按10秒
TouchAction(driver).long_press(el,duration=10000).perform()
TouchAction(self.driver).tap(self.locator(loc)).wait(200).tap(self.locator(loc)).perform()
#安装指定路径下的apk
driver.install_app(r'F:\手机测试_python\微信小程序开发和Appium\4.Appium-概念和入门案例\要用的软件\被测的app\kaoyan3.1.0.apk')
#打开指定包名的app
driver.activate_app('com.tal.kaoyan')
#后台运行10秒,再切换回前台
driver.background_app(10)
#终止指定包名app的运行
driver.terminate_app('com.tal.kaoyan')
#卸载指定包名的app
driver.remove_app('com.tal.kaoyan')