移动测试相关&appium使用

一、环境搭建

准备工作:

        (python、pycharm安装配置好)

        1、Java SDK 安装配置

Java Downloads | Oracle

                下载安装后配置系统环境变量:JAVA_HOME(jdk根目录路径)和path(jdk根目录下的bin目录路径)

        2、Android SDK下载安装(也可以通过Android Studio下载)

AndroidSDK下载及安装 - 陈晓猛 - 博客园

 Android 开发者  |  Android Developers

                下载安装后配置系统环境变量:ANDROID_HOME(SDK根目录路径)和path(platform-tools目录和tools目录两个路径)

        3、模拟器安装(夜神模拟器、mumu等)

                 用AndroidSDK中platform-tools目录下的adb.exe文件替换模拟器bin目录下的adb.exe和nox_adb.exe文件(目的是使AndroidSDK中的adb与模拟器中的adb文件版本相同)

        4、cmd中:pip install Appium-Python-Client(appium客户端)

注:pip安装不了的话直接使用pycharm的settings下载安装

 

        5、下载安装appium服务端:Appium: Mobile App Automation Made Awesome.

                安装后检查EditConfigurations中的环境变量是否跟本机配置的系统变量一致

 二、ADB的使用(Android Debug Bridge 安卓调试桥梁)

作用:通过命令去操作手机

服务(发现代码连不上手机时)

adb kill-server

adb start-server

查看设备

adb devices

进入手机终端

adb shell

(进入终端后根据Linux命令操作)

获取手机安卓版本

adb shell getprop ro.build.version.release

获取当前运行的程序和界面的名称

adb shell dumpsys window windows | findstr mFocusedApp

文件传输

adb push 电脑上的文件 手机上的位置 
adb pull 手机上的文件 电脑上的位置

(模拟器上可以直接拖拉文件实现上传)

软件 安装&卸载

adb install  电脑上的apk文件的路径
adb uninstall 应用的包名

获取其他信息

adb shell am start -w  包名\.启动名

完整实例

 appium基本操作可以看这个文章

Appium中文API文档_小叶丶的博客-CSDN博客_appium中文文档

连接设备

(appium服务和夜神模拟器处于开启状态)

使用命令:adb devices 检查服务是否已连接

import time
from appium import webdriver

desired_caps={}#连接移动设备必须的参数
# 当前要测试的设备的名称(可能开了多个模拟器或者多台手机)
desired_caps['deviceName']='127.0.0.1:62001'#cmd中adb devices
# 操作系统
desired_caps['platformName']='Android'
# 操作系统的版本
desired_caps['platformVersion']='7.1'#模拟器中查看

#远程调用手机,command_executor调用的地址(从appium服务器获得),desired_capabilities字典
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)

time.sleep(2)
driver.close_app()#关闭app
driver.quit()#释放资源

 打开应用

cmd中通过指令获取adb shell dumpsys window windows | findstr mFocusedApp 获取包名和页面地址

import time
from appium import webdriver

desired_caps={}#连接移动设备必须的参数
# 当前要测试的设备的名称(可能开了多个模拟器或者多台手机)
desired_caps['deviceName']='127.0.0.1:62001'#cmd中adb devices
# 操作系统
desired_caps['platformName']='Android'
# 操作系统的版本
desired_caps['platformVersion']='7.1'#模拟器中查看

#cmd中adb shell dumpsys window windows | findstr mFocusedApp 获取包名和页面地址

# 需要启动的APP的名称(Android系统为APP包名)
desired_caps['appPackage']='com.android.settings'
# 要启动的APP的页面地址
desired_caps['appActivity']='.Settings'

#远程调用手机,command_executor调用的地址(从appium服务器获得),desired_capabilities字典
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)

time.sleep(2)

driver.close_app()#关闭app
driver.quit()#释放资源

 appium server中内容片段:

 appium基本操作

# 基础操作API
driver.close_app()# 关闭应用
driver.quit()# 断开链接
driver.install_app("apk在电脑的绝对路径")# 安装应用
driver.remove_app("应用包名")# 卸载应用
driver.is_app_installed()# 判断应用是否安装
driver.push_file()# 目标位置,base64编码内容
driver.pull_file()# 来源位置,返回值是base64编码内容
driver.page_source# 获取界面XML源码
driver.find_element()#定位元素
driver.find_elements()#定位元素
driver.current_package# 获取当前操作的应用的包名
driver.current_activity# 获取当期操作的界面的名称
driver.find_element().text# 获取元素文本内容
driver.find_element().click()# 点击元素对应位置
driver.find_element().get_attribute()# (属性名称)获取属性值
driver.find_element().location# 获取元素左上角的坐标(相对于屏幕的左上角)
driver.find_element().size# 获取元素的宽高(字典)
driver.find_element().send_keys()# 输入文本

通过AndroidSDK中tools里的uiautomatorviewer.bat工具定位元素

(没有这个bat工具的话去上面下载sdk的链接中下载tools压缩包解压复制进去就可以了)获取元素进行操作

 

 通过detail信息进行元素定位

安装应用

import time
from appium import webdriver

desired_caps={}#连接移动设备必须的参数
# 当前要测试的设备的名称(可能开了多个模拟器或者多台手机)
desired_caps['deviceName']='127.0.0.1:62001'#cmd中adb devices
# 操作系统
desired_caps['platformName']='Android'
# 操作系统的版本
desired_caps['platformVersion']='7.1'#模拟器中查看

driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)#远程调用手机,command_executor调用的地址(从appium服务器获得),desired_capabilities字典

time.sleep(1)
driver.install_app(r"D:\pyCode\appCode\iBiliPlayer-bili.apk")#使用绝对路径,r代表原始字符
time.sleep(5)

driver.close_app()#关闭app
driver.quit()#释放资源

卸载应用

import time
from appium import webdriver

desired_caps={}#连接移动设备必须的参数
# 当前要测试的设备的名称(可能开了多个模拟器或者多台手机)
desired_caps['deviceName']='127.0.0.1:62001'#cmd中adb devices
# 操作系统
desired_caps['platformName']='Android'
# 操作系统的版本
desired_caps['platformVersion']='7.1'#模拟器中查看

driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)#远程调用手机,command_executor调用的地址(从appium服务器获得),desired_capabilities字典

time.sleep(1)
#先判断应用是否已安装
if driver.is_app_installed("tv.danmaku.bili"):
    driver.remove_app("tv.danmaku.bili")
time.sleep(5)

driver.close_app()#关闭app
driver.quit()#释放资源

获取元素属性&输入文本等操作

import time

from appium import webdriver
from appium.webdriver.common.appiumby import By

desired_caps={}#连接移动设备必须的参数
# 当前要测试的设备的名称(可能开了多个模拟器或者多台手机)
desired_caps['deviceName']='127.0.0.1:62001'#cmd中adb devices
# 操作系统
desired_caps['platformName']='Android'
# 操作系统的版本
desired_caps['platformVersion']='7.1'#模拟器中查看

#cmd中adb shell dumpsys window windows | findstr mFocusedApp 获取包名和页面地址
# 需要启动的APP的名称(Android系统为APP包名)
desired_caps['appPackage']='com.android.settings'#cmd中adb shell dumpsys window windows | findstr mFocusedApp
# 要启动的APP的哪个界面
desired_caps['appActivity']='.Settings'

driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)#远程调用手机,command_executor调用的地址(从appium服务器获得),desired_capabilities字典

#获取元素属性
time.sleep(1)
el=driver.find_element(By.XPATH,"//*[@text='显示']")#通过XPATH元素属性定位元素并操作
print(el.size)
print(el.text)
print(el.get_attribute("text"))
time.sleep(1)
print(driver.current_package)
print(driver.current_activity)

#输入文本内容
search=driver.find_element(By.XPATH,"//*[@resource-id='com.android.settings:id/search']")
search.click()
time.sleep(1)
searchText=driver.find_element(By.XPATH,"//*[@text='搜索…']")
searchText.send_keys("搜索内容")
searchText.send_keys("search")
time.sleep(1)
searchText.clear()
time.sleep(2)



driver.close_app()#关闭app
driver.quit()#释放资源

模拟手势操作

滑动屏幕,方法一

使用swipe通过屏幕坐标进行滑动操作

import time
from appium import webdriver

desired_caps={}
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformName']='Android'
desired_caps['platformVersion']='7.1'
desired_caps['appPackage']='com.android.settings'
desired_caps['appActivity']='.Settings'
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)

time.sleep(1)
#滑动手势模拟
driver.swipe(start_x=270,start_y=640,end_x=270,end_y=360,duration=800)#开始坐标、移动坐标、滑动时间(默认是600毫秒),以屏幕分辨率为参考起始坐标左上为(0,0),终点坐标为(540,960)
time.sleep(2)

driver.close_app()
time.sleep(1)
driver.quit()

上面方法以分辨率540*960为例,缺点是换了分辨率后会得到不同结果,为兼容不同分辨率手机,可以先获取屏幕分辨率,如下:

import time
from appium import webdriver

desired_caps={}
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformName']='Android'
desired_caps['platformVersion']='7.1'
desired_caps['appPackage']='com.android.settings'
desired_caps['appActivity']='.Settings'
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)

time.sleep(1)
#滑动手势模拟
wSize=driver.get_window_size()
width=wSize['width']
height=wSize['height']
driver.swipe(start_x=width/2,start_y=height/3*2,end_x=width/2,end_y=height/3,duration=800)
time.sleep(2)

driver.close_app()
time.sleep(1)
driver.quit()

滑动屏幕,方法二

通过scroll方法进行滑动操作,该方法通过元素相对位置进行操作,不受分辨率控制

import time
from appium import webdriver
from appium.webdriver.common.appiumby import By

desired_caps={}
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformName']='Android'
desired_caps['platformVersion']='7.1'
desired_caps['appPackage']='com.android.settings'
desired_caps['appActivity']='.Settings'
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)

time.sleep(1)
#滑动手势模拟
el1=driver.find_element(By.XPATH,"//*[@text='通知']")
el2=driver.find_element(By.XPATH,"//*[@text='WLAN']")
driver.scroll(el1,el2)
time.sleep(2)

driver.close_app()
time.sleep(1)
driver.quit()

 滑动屏幕,方法三

使用TouchAction类进行操作

import time
from appium import webdriver
from appium.webdriver.common.appiumby import By
from appium.webdriver.common.touch_action import TouchAction

desired_caps={}
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformName']='Android'
desired_caps['platformVersion']='7.1'
desired_caps['appPackage']='com.android.settings'
desired_caps['appActivity']='.Settings'
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)

time.sleep(1)
el1=driver.find_element(By.XPATH,"//*[@text='通知']")
el2=driver.find_element(By.XPATH,"//*[@text='WLAN']")
#高级手势模拟TouchAction类,方法可以使用坐标也可以使用元素
action=TouchAction(driver)
# press(坐标或者元素)按下 wait(默认600毫秒)必须 move_to(坐标或元素) release()抬起释放 perform()执行操作
action.press(el1,pressure=500).wait(1000).move_to(el2).release().perform()#拖动元素
time.sleep(2)

driver.close_app()
time.sleep(1)
driver.quit()

拖拽应用(TouchAction)

TouchAction类与MultiAction类操作可以看这个文章

【Python+Appium】开展自动化测试(十)TouchAction类与MultiAction类(控件元素的滑动、拖动,九宫格解锁,手势操作等)_python导入touchaction_软件测试凡哥的博客-CSDN博客

 长按并拖拽应用换位置:

import time
from appium import webdriver
from appium.webdriver.common.appiumby import By
from appium.webdriver.common.touch_action import TouchAction

desired_caps={}
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformName']='Android'
desired_caps['platformVersion']='7.1'
desired_caps['appPackage']='com.android.launcher3'
desired_caps['appActivity']='.launcher3.Launcher'
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)

time.sleep(1)
#拖拽手势模拟
action = TouchAction(driver)
el1=driver.find_element(By.XPATH,"//*[@text='Appium Settings']")
el2=driver.find_element(By.XPATH,"//*[@text='哔哩哔哩']")

# long_press(元素或者坐标,duration=长按时间默认1000毫秒)长按 wait等待时间 move_to移动到 release()抬起 perform()执行操作
action.long_press(el2,duration=1000).wait(1000).move_to(el1).release().perform()
# driver.drag_and_drop(el2,el1)#该方法再夜神模拟器中不适用
time.sleep(2)

driver.close_app()
time.sleep(1)
driver.quit()

实例:绘制屏保手势图案

uiautomatorviewer.bat中获取元素坐标定位点

 绘制如下图:

坐标:
(105,450) (270,450) (435,450)
(270,615)
(105,780)(270,780)(435,780)

import time
from appium import webdriver
from appium.webdriver.common.appiumby import By
from appium.webdriver.common.touch_action import TouchAction

desired_caps={}
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformName']='Android'
desired_caps['platformVersion']='7.1'
desired_caps['appPackage']='com.android.settings'
desired_caps['appActivity']='.Settings'
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)

time.sleep(1)
el1=driver.find_element(By.XPATH,"//*[@text='通知']")
el2=driver.find_element(By.XPATH,"//*[@text='WLAN']")
action=TouchAction(driver)
action.press(el1,pressure=500).wait(200).move_to(el2).release().perform()#拖动元素
time.sleep(2)

#tap(元素或坐标,count=1) 轻触代替单击) count=2 双击
el3=driver.find_element(By.XPATH,"//*[@text='安全']")
action.tap(el3,count=1).perform()

time.sleep(1)
driver.find_element(By.XPATH,"//*[@text='屏幕锁定']").click()
time.sleep(1)
driver.find_element(By.XPATH,"//*[@text='图案']").click()
time.sleep(2)

#坐标:(105,450) (270,450) (435,450) x=165,y=0
# (270,615)
# (105,780)(270,780)(435,780)
action.press(x=105,y=45).wait(200).move_to(x=270,y=450).wait(200).move_to(x=435,y=450).wait(200).move_to(x=270,y=615).wait(200)\
.move_to(x=105,y=780).wait(200).move_to(x=270,y=780).wait(200).move_to(x=435,y=780).wait(200)
action.release()
action.perform()
time.sleep(2)

driver.close_app()
time.sleep(1)
driver.quit()

其他操作

import time
from appium import webdriver
from appium.webdriver.common.appiumby import By

desired_caps={}
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformName']='Android'
desired_caps['platformVersion']='7.1'
# desired_caps['appPackage']='com.android.settings'
# desired_caps['appActivity']='.Settings'
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)

time.sleep(1)

print(driver.device_time)#系统时间
print(driver.network_connection)#当前手机网络信息
driver.set_network_connection(2)#设置网络:1 飞行模式、2 WiFi、4 移动数据、6=2+4
time.sleep(2)
print(driver.network_connection)#当前手机网络信息
print(driver.get_window_size())
# driver.keyevent(数字)#点击按键
driver.get_screenshot_as_file("截图.png")
# driver.save_screenshot()#同上
driver.open_notifications()#打开通知栏

time.sleep(2)
driver.close_app()
time.sleep(1)
driver.quit()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值