Python Android测试-appium的基础使用方法

环境配置:

Python = 3.11

appium = 4.0.1(截止2024/7/26,此为最新版,命令与之前版本有所不同,运行代码之前需要查看自己的版本,然后更改具体的命令)

selenium = 4.23.0

Java = 1.8.0_421

还需要Android的SDK,现在官网已经不支持单独下载SDK了,建议通过Android studio来进行下载,具体下载方法可看这篇文章:

Android studio Android SDK下载安装_android studio sdk下载-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_45966674/article/details/135095836下载SDK时注意安装路径自己能找到就行,尽量也不要有中文,如果没有让你选择SDK的下载路径,卸载Android studio再安装就行。

还需要下载appium server,具体的呢也可以看这一篇:Appium下载安装与配置-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Java_CXZJ/article/details/127388007

也可以去官网下载,下载后的安装办法是一样的,建议将文章中的 Appium Inspector也一并下载,后续在查看控件属性时可以更方便。

安卓的环境配置比较复杂,主要是appium的更新带来了很多变化,我当时看着去年的课在今年的网站上面找资源,那叫一个迷茫啊。好在还是有很多博主写了相关的文章,帮助我们后来人快速学习。

入门案例

这里是打开手机设置的一个代码案例:

from appium import webdriver
from appium.options.common.base import AppiumOptions
import time

# 连接手机里必须的参数
appPackage = 'com.android.settings'
options = AppiumOptions()
# options.set_capability('driver', '127.0.0.1:62001')
# 当前测试的手机名称
options.set_capability('deviceName', '127.0.0.1:62001')
# 1.系统
options.set_capability('platformName', 'Android')
# 2.系统版本
options.set_capability('platformVersion', '7.1')
# 3.要启动的app的名称(包名,桌面也是一个app)
# 查看当前页面的软件包名(cmd中输入):  adb shell dumpsys window windows | findstr mFocusedApp
options.set_capability('appPackage', appPackage)
# 4.要启动的app的哪个界面
options.set_capability('appActivity', '.Settings')
# 连接服务器,连接手机
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',options=options)

time.sleep(5)
# 打印界面信息
print(driver.page_source)

# 关闭app
driver.terminate_app(appPackage)
# 退出
driver.quit()

 在查看app包名时,在cmd中输入 adb shell dumpsys window windows | findstr mFocusedApp(adb shell dumpsys window | findStr mCurrentFocus) 即可查看此时手机显示的app信息,我这里是将手机的设置软件先打开,然后输入指令,就获得了图片中的内容,其中'u0'到'/'的内容为app的包名,'/'到't30'的内容为app的界面(包括settings前面的 ' . ')

C:\Users\86173>adb shell dumpsys window windows | findstr mFocusedApp
  mFocusedApp=AppWindowToken{2c5d8d9 token=Token{4a8b623 ActivityRecord{b84a352 u0 com.android.settings/.Settings t30}}}

 查找元素

查找元素我们需要从selenium中导入一个by的用法:

from selenium.webdriver.common.by import By

app的定位和web类似,依然有ID、classname、xpath等方法,但是app中ID、classname并不一定唯一,使用时需要查看其属性是否唯一,虽然xpath运行速度较慢,但依旧是最常用的方法.需要注意的是,app中所有信息都为属性,包括text,不能像web中使用"//*[text='文本']",需要在text前面加上@表示属性,例如:

# 点击文本为‘显示’的元素
driver.find_element(By.XPATH,'//*[@text="显示"]').click()

 基本操作

# 安装app
driver.install_app('apk在电脑上的路径')
# 卸载app,依然是按照包名查找
if driver.is_app_installed("需要卸载的软件包名"):
    driver.remove_app("需要卸载的软件包名")
# 获取手机时间
print(driver.device_time)
# 获取手机屏幕大小
print(driver.get_window_size())
# 获取手机网络信息  1:飞行模式 2:wifi 4:移动数据 6 = 2+4
print(driver.network_connection)
# 设置手机网络信息 ()填网络模式数字
driver.set_network_connection(2)
# 截图
driver.get_screenshot_as_file('屏幕截图.png')
# driver.save_screenshot()  # 和.get_screenshot_as_file一样
# 打开通知栏
driver.open_notifications()

模拟手势

模拟滑动界面操作:

# 按照手机屏幕的相对位置来滑动,前面两个参数是起始位置的(x,y),后两个参数是终止位置的(x,y)
# 获取手机像素
size = driver.get_window_size()
width = size['width']
height = size['height']
# 滑动,默认时间600毫秒(duration),坐标按照像素
driver.swipe(width/2,height/3*2,width/2,height/4)

# 按照控件的位置来滑动,从el1滑动到el2的位置
# 滚动,控制控件从这个位置传到指定控件的位置
el1 = driver.find_element(By.XPATH,'//*[@text="位置信息"]')
el2 = driver.find_element(By.XPATH,'//*[@text="超级用户"]')
driver.scroll(el1,el2)

拖拽操作,目前代码效果不好,参数'1'是按住“酷安”的时间,按住1秒后会立马放置到“谷歌浏览器”的位置,由于在终止位置停留时间太短,会发生创建一个桌面文件夹的尴尬事件。

el1 = driver.find_element(By.XPATH,'//*[@text="酷安"]')
el2 = driver.find_element(By.XPATH,'//*[@text="谷歌安装器"]')
# 拖拽
driver.drag_and_drop(el1,el2,1)

高级模拟手势:

将每一个复杂操作都细化成一个个简单的操作,即可完成 想要的效果,这其中包括了:按下、等待、滑动、松开的操作,通过这几个操作的叠加,可以完成大部分的手势操作。

由于appium版本缘故,4.0.1不再使用touchaction而使用w3c,所以此处代码与旧版本有较大改动。

需要的库:

from selenium.webdriver import ActionChains

具体的操作代码:

action = ActionChains(driver)
# appium4.0.1操作
# 按下操作,原action.press()
action.w3c_actions.pointer_action.click_and_hold()
# 等待操作,原action.wait()
action.w3c_actions.pointer_action.pause(2)
# 拖拽操作
action.w3c_actions.pointer_action.move_to()
# 释放操作,原action.release()
action.w3c_actions.pointer_action.release()
# 执行代码指令,在使用action指令后,都需要加上执行指令才会执行代码
action.perform()

了解了这些代码,我们就可以完成一些基础的操作了,例如给手机上一个图案锁屏:

from appium import webdriver
from appium.options.common.base import AppiumOptions
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
import time

# 连接手机里必须的参数
appPackage = 'com.android.settings'
options = AppiumOptions()
# options.set_capability('driver', '127.0.0.1:62001')
# 当前测试的手机名称
options.set_capability('deviceName', '127.0.0.1:62001')
# 1.系统
options.set_capability('platformName', 'Android')
# 2.系统版本
options.set_capability('platformVersion', '7.1')
# 3.要启动的app的名称(包名)
# 查看当前页面的软件包名:  adb shell dumpsys window windows | findstr mFocusedApp
options.set_capability('appPackage', appPackage)
# 4.要启动的app的哪个界面
options.set_capability('appActivity', '.Settings')

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

action = ActionChains(driver)
# appium4.0.1操作
# 按下操作
# action.w3c_actions.pointer_action.click_and_hold()
# 等待操作
# action.w3c_actions.pointer_action.pause(2)
# 拖拽操作
# action.w3c_actions.pointer_action.move_to()
# 释放操作
# action.w3c_actions.pointer_action.release()

# 拖拽的元素定位
el1 = driver.find_element(By.XPATH,'//*[@text="应用"]')
el2 = driver.find_element(By.XPATH,'//*[@text="WLAN"]')

# 在el1处按下
action.w3c_actions.pointer_action.click_and_hold(el1)
# 拖拽到el2
action.w3c_actions.pointer_action.move_to(el2)
# 停顿一下,数字单位为秒
# action.w3c_actions.pointer_action.pause(3)
# 释放
action.w3c_actions.pointer_action.release()
# 执行
action.perform()

# 按下"安全"控件
driver.find_element(By.XPATH,'//*[@text="安全"]').click()
driver.implicitly_wait(3)
# 按下"屏幕锁定"控件
driver.find_element(By.XPATH,'//*[@text="屏幕锁定"]').click()
driver.implicitly_wait(3)
# 按下"图案"控件
driver.find_element(By.XPATH,'//*[@text="图案"]').click()
driver.implicitly_wait(3)

# # 按下第一个按钮
# action.w3c_actions.pointer_action.move_to_location(106,455).pointer_down().pause(1)
# # 拖拽到第二个点
# action.w3c_actions.pointer_action.move_to_location(270,455)
# # 拖拽到第三个点
# action.w3c_actions.pointer_action.move_to_location(435,455)
# # 拖拽到第四个点
# action.w3c_actions.pointer_action.move_to_location(270,612)
# # 拖拽到第5个点
# action.w3c_actions.pointer_action.move_to_location(106,780)
# # 拖拽到第6个点
# action.w3c_actions.pointer_action.move_to_location(270,780)
# # 拖拽到第7个点
# action.w3c_actions.pointer_action.move_to_location(435,780)
# # 释放
# action.w3c_actions.pointer_action.release()

# 简洁代码
action.w3c_actions.pointer_action.move_to_location(106,455).pointer_down().pause(1)\
    .move_to_location(270,455).move_to_location(435,455).move_to_location(270,612)\
    .move_to_location(106,780).move_to_location(270,780).move_to_location(435,780).release()
# 执行
action.perform()


time.sleep(5)

# 关闭app
# driver.terminate_app(appPackage)
# 退出
driver.quit()

最后我没有点确认,如果真的需要添加,可以加上一个click()。

结果图片:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值