找回密码
 会员注册
查看: 27|回复: 0

Python之Appium2自动化测试(Android篇)

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71625
发表于 2024-9-6 14:49:25 | 显示全部楼层 |阅读模式
一、环境搭建及准备工作1、Appium2环境搭建请参考另一篇文章:Windows系统搭建Appium2和AppiumInspector环境2、安装Appium-Python-Client,版本要求3.0及以上和Selenium版本要求4.0及以上pipinstallAppium-Python-ClientVersion:3.1.0pipinstallseleniumVersion:4.15.2123453、手机连接电脑,并在dos窗口启动AppiumServer4、演示环境APP软件:ES文件浏览器、随手记5、查看元素唯一方法复制id,点击搜索图标选择id,粘贴内容,点击Search,查看二、编写自动化脚本fromappiumimportwebdriverfromappium.options.common.baseimportAppiumOptionsfromappium.webdriver.common.appiumbyimportAppiumBydefcreate_driver():"""AppiumOptions():用于配置Appium测试的通用选项,可用于Android和iOS平台可以设置通用的测试选项,如平台名称、版本、自动化引擎等"""#创建AppiumOptions对象options=AppiumOptions()#加载测试的配置选项和参数(Capabilities配置)options.load_capabilities({#自动化测试的引擎"automationName":"uiautomator2",#平台名称"platformName":"Android",#系统版本"platformVersion":"11",#设备的名称"deviceName":"RK3399",#待测试应用的包名"appPackage":"com.estrongs.android.pop",#待测试应用的活动(Activity)名称"appActivity":".app.openscreenad.NewSplashActivity",#设置使用Unicode编码方式发送字符串到设备的键盘"unicodeKeyboard":"true",#设置重置设备的软键盘状态并隐藏键盘"restKeyboard":"true"})#Appium服务器地址端口,本地用http://127.0.0.1:4723appium_host='http://192.168.100.15:4723'returnwebdriver.Remote(appium_host,options=options)defclose_driver(driver):"""关闭驱动"""ifdriver:driver.quit()if__name__=="__main__":driver=create_driver()#设置隐式等待时间为10秒driver.implicitly_wait(10)#元素定位代码...#关闭驱动close_driver(driver)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455三、元素定位方式1、根据id定位#ID定位方法el=driver.find_element(AppiumBy.ID,"com.estrongs.android.pop:id/txt_grant")el.click()1232、根据xpath定位#xpath方法el1=driver.find_element(AppiumBy.XPATH,'//android.widget.TextView[@resource-id="android:id/title"and@text="密码设置"]')el1.click()#xpath简写方法el2=driver.find_element(AppiumBy.XPATH,'//*[@text="密码设置"]')el2.click()12345673、根据class定位(建议少用,重复名称较多)#使用classname定位el3=driver.find_element(AppiumBy.CLASS_NAME,"android.widget.ImageButton")el3.click()1234、根据AccessibilityID定位#使用AccessibilityID定位el4=driver.find_element(AppiumBy.ACCESSIBILITY_ID,'转到上一层级')el4.click()1235、根据UIAutomator定位UIAutomator元素定位是Android系统原生支持的定位方式,虽然与xpath类似,但比它更加好用,且支持元素全部属性定位.定位原理是通过android自带的androiduiautomator的类库去查找元素。Appium元素定位方法其实也是基于Uiautomator来进行封装的。#使用UIAutomator定位元素(id定位)el5=driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'newUiSelector().resourceId("com.estrongs.android.pop:id/txt_grant")')el5.click()#使用UIAutomator定位元素(test定位)el6=driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'newUiSelector().text("搜索")')el6.click()#使用UIAutomator定位元素(classname定位)el7=driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'newUiSelector().className("android.widget.ImageButton")')el7.click()12345678910116、相同元素定位如上图,三个输入框的class属性都是一样的,如果要根据class属性分别来获取这三个值,就使用driver.find_elements方式。代码实现如下(注意driver.find_elements多个s):#使用classname和索引定位,查找的元素列表中的特定元素el8=driver.find_elements(AppiumBy.CLASS_NAME,"android.widget.EditText")#输入邮箱el8[0].send_keys("123456789@qq.com")#输入验证码el8[1].send_keys("654321")#输入密码el8[2].send_keys("123456")12345678四、点击-输入-清空操作#运行ES文件浏览器软件,并点击同意el=driver.find_element(AppiumBy.ID,"com.estrongs.android.pop:id/txt_grant")el.click()#单机操作(相当于鼠标点击):click()el1=driver.find_element(AppiumBy.XPATH,'//*[@text="搜索"]')el1.click()#输入:send_keys()el2=driver.find_element(AppiumBy.CLASS_NAME,"android.widget.EditText")el2.send_keys("Android自动化")#清空:clear()el3=driver.find_element(AppiumBy.CLASS_NAME,"android.widget.EditText")el3.clear()123456789101112131415五、swipe()方法模拟滑动操作滑动操作是模拟用户在应用程序界面上进行手势滑动的操作。在Appium中,可以使用swipe()方法来执行滑动操作。它需要指定起始点和终止点的坐标,并且可以设置滑动的持续时间。滑动操作通常用于测试应用程序界面的可滚动性、页面切换和内容展示等功能。swipe(起始横坐标,起始纵坐标,目标横坐标,目标纵坐标,时间)时间:指滑动使用多长时间,单位为毫秒,可为空(去掉duration=****)简单示例:#获取屏幕宽度和高度width=driver.get_window_size()["width"]height=driver.get_window_size()["height"]#从下向上滑动屏幕driver.swipe(width*0.5,height*0.9,width*0.5,height*0.1,duration=500)#从上向下滑动屏幕driver.swipe(width*0.5,height*0.1,width*0.5,height*0.9,duration=500)#从右向左滑动屏幕driver.swipe(width*0.9,height*0.5,width*0.1,height*0.5,duration=500)#从左向右滑动屏幕driver.swipe(width*0.1,height*0.5,width*0.9,height*0.5,duration=500)123456789101112131415封装示例:classScreenSlider():def__init__(self,driver):"""初始化屏幕滑动器"""self.driver=driverdefget_screen_size(self):"""获取屏幕尺寸"""screen_size=self.driver.get_window_size()returnscreen_size["width"],screen_size["height"]defswipe_up(self,duration=500):"""从下向上滑动屏幕x轴不变,y轴变动"""width,height=self.get_screen_size()self.driver.swipe(width*0.5,height*0.9,width*0.5,height*0.1,duration=duration)defswipe_down(self,duration=500):"""从上向下滑动屏幕x轴不变,y轴变动"""width,height=self.get_screen_size()self.driver.swipe(width*0.5,height*0.1,width*0.5,height*0.9,duration=duration)defswipe_left(self,duration=500):"""从右向左滑动屏幕x轴变动,y轴不变"""width,height=self.get_screen_size()self.driver.swipe(width*0.9,height*0.5,width*0.1,height*0.5,duration=duration)defswipe_right(self,duration=500):"""从左向右滑动屏幕x轴变动,y轴不变"""width,height=self.get_screen_size()self.driver.swipe(width*0.1,height*0.5,width*0.9,height*0.5,duration=duration)12345678910111213141516171819202122232425262728293031六、连续滑动方法  swipe滑动操作,一般是两点之间的滑动,而实际使用过程中用户可能要进行一些多点连续滑动操作。如手势密码操作,切西瓜等场景。那么在Appium2中该如何模拟这类操作呢?W3CWebDriveractions  Appium2进行了一次重大更新,其中最重要的变化是弃用了MultiAction和TouchAction,并全面采用了W3CWebDriveractions。过去,MultiAction和TouchAction被广泛用于模拟复杂手势和多点触控操作,但现在W3CWebDriveractions成为了首选解决方案。这个决策带来了更统一、标准化的操作方式,同时也提供了更好的跨平台兼容性和稳定性。方法:#导入所需模块,用于执行W3Cactions操作fromselenium.webdriver.common.action_chainsimportActionChainsfromselenium.webdriver.common.actionsimportinteractionfromselenium.webdriver.common.actions.action_builderimportActionBuilderfromselenium.webdriver.common.actions.pointer_inputimportPointerInput#创建ActionChains对象actions=ActionChains(driver)#将w3c_actions属性替换为使用触摸(touch)指针交互的ActionBuilder对象actions.w3c_actions=ActionBuilder(driver,mouse=PointerInput(interaction.POINTER_TOUCH,"touch"))#移动到坐标(start_x,start_y)的位置actions.w3c_actions.pointer_action.move_to_location(start_x,start_y)#执行指针按下操作(类似按下鼠标左键)actions.w3c_actions.pointer_action.pointer_down()#暂停1秒钟actions.w3c_actions.pointer_action.pause(1)#移动到坐标(end_x,end_y)的位置actions.w3c_actions.pointer_action.move_to_location(end_x,end_y)#执行指针释放操作(类似松开鼠标左键)actions.w3c_actions.pointer_action.release()#执行动作actions.perform()12345678910111213141516171819202122以下用随手记APP操作演示方法一、在AppiumInspector获取坐标方法二、在设备端开发者选项中开启指针位置获取坐标fromappiumimportwebdriverfromappium.options.common.baseimportAppiumOptionsfromappium.webdriver.common.appiumbyimportAppiumByfromtimeimportsleep#ForW3Cactionsfromselenium.webdriver.common.action_chainsimportActionChainsfromselenium.webdriver.common.actionsimportinteractionfromselenium.webdriver.common.actions.action_builderimportActionBuilderfromselenium.webdriver.common.actions.pointer_inputimportPointerInputdefcreate_driver():"""连接Android手机,并运行随手记APP"""options=AppiumOptions()options.load_capabilities({"automationName":"uiautomator2","platformName":"Android","platformVersion":"11","deviceName":"RK3399","appPackage":"com.mymoney","appActivity":".biz.home.HomeActivity","unicodeKeyboard":"true","restKeyboard":"true"})appium_host='http://127.0.0.1:4723'returnwebdriver.Remote(appium_host,options=options)defclose_driver(driver):"""关闭驱动"""ifdriver:driver.quit()if__name__=="__main__":driver=create_driver()#设置隐式等待时间为10秒driver.implicitly_wait(10)actions=ActionChains(driver)actions.w3c_actions=ActionBuilder(driver,mouse=PointerInput(interaction.POINTER_TOUCH,"touch"))#定位到"我的",点击driver.find_element(AppiumBy.ID,"com.mymoney:id/ll_user").click()#从下往上滑动页面actions.w3c_actions.pointer_action.move_to_location(950,792)actions.w3c_actions.pointer_action.pointer_down()actions.w3c_actions.pointer_action.move_to_location(954,432)actions.w3c_actions.pointer_action.release()actions.perform()#定位到"设置",点击driver.find_element(AppiumBy.XPATH,'//*[@text="设置"]').click()#定位到"密码保护",点击driver.find_element(AppiumBy.ID,'com.mymoney:id/setting_right_tip').click()sleep(0.5)#启用密码保护driver.find_element(AppiumBy.ID,'com.mymoney:id/right_switch').click()#定位到"手势密码",点击driver.find_element(AppiumBy.ID,'com.mymoney:id/iv_gesture_psd').click()#设置手势密码,需要设置两次foriinrange(2):actions.w3c_actions.pointer_action.move_to_location(806,284)actions.w3c_actions.pointer_action.pointer_down()actions.w3c_actions.pointer_action.move_to_location(1107,284)actions.w3c_actions.pointer_action.pause(1)actions.w3c_actions.pointer_action.move_to_location(806,594)actions.w3c_actions.pointer_action.pause(1)actions.w3c_actions.pointer_action.move_to_location(1103,585)actions.w3c_actions.pointer_action.pause(1)actions.w3c_actions.pointer_action.release()actions.perform()#等待2秒,再次确认密码sleep(2)close_driver(driver)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 06:03 , Processed in 0.428401 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表