前言
Appium自动化测试中的常见模拟操作涵盖了多种用户交互行为,这些操作对于自动化测试框架来说至关重要,因为它们能够模拟真实用户的使用场景,从而验证应用程序的功能和稳定性。
今天讲解滑动和拖拽事件操作:
1、swipe滑动事件
示例:driver.swipe(startx, starty, endx, endy, duration=None)
说明:duration用来降低滑屏的速度及惯性, 单位是ms
2、swipe滑动事件封装
# 定义一个封装滑屏操作的方法
def slide_screen(driver, direction, count=1):
w = driver.get_window_size()["width"] # 获取手机屏幕的宽度
h = driver.get_window_size()["height"] # 获取手机屏幕的高度
# w=1080 h=1920
if direction == "up": # 往上滑
zb = (w/2, h*0.9, w/2, h*0.1)
elif direction == "down": # 往下滑
zb = (w/2, h*0.1, w/2, h*0.9)
elif direction == 'left': # 往左滑
zb = (w*0.9, h/2, w*0.1, h/2)
elif direction == 'right': # 往右滑
zb = (w*0.1, h/2, w*0.9, h/2)
else:
print("无法识别滑动方向,请重新输入!")
for i in range(count):
driver.swipe(*zb, duration=1200)
time.sleep(1)
3、swipe边滑动边查找封装
目的:针对频道类的元素进行滑动选择对应的频道
# 封装一个边滑动边查找的方法
def search_while_sliding(driver, element, element_info):
ele_size = element.size # 获取元素大小
width = ele_size["width"] # 获取元素的宽度
height = ele_size["height"] # 获取元素的高度
# 获了element元素左上角点的坐标
ele_position = element.location
x = ele_position["x"] # 获取左上角点的x坐标值
y = ele_position["y"] # 获取左上角点的y坐标值
start_x = x + width*0.9 # 获取的是起始点X的值
y = y + height*0.5 # 获取的是起始及终止点的Y的值
end_x = x + width*0.1 # 获取的是终止点X的值
while True:
page = driver.page_source # 记录查找前的页面资源,通过对比页面资源来退出死循环
try:
driver.find_element(*element_info).click() # 如果有找到对应的元素那么点击并返回
return True
except Exception as e:
print("没有找到该元素!")
driver.swipe(start_x, y, end_x, y, duration=1000) # 没有找到元素,那么滑屏后再对比并重新查找
time.sleep(1)
if page == driver.page_source:
print("滑屏操作完成且没有找到元素信息")
return False
备注:
-
while True:创建一个无限循环。
-
page = driver.page_source:记录查找前的页面资源,用于后续对比以判断是否退出循环。
-
driver.find_element(*element_info).click():尝试查找并点击指定元素,如果找到则返回True。
-
except Exception as e:如果没有找到元素,打印提示信息。
-
driver.swipe(start_x, y, end_x, y, duration=1000):没有找到元素时,执行滑屏操作。
-
time.sleep(1):等待一段时间。
-
if page == driver.page_source:如果滑屏操作完成后页面资源没有变化,说明没有找到元素,打印相关提示并返回False.
4、scroll滑动事件
示例:
driver.scroll(source_element, target_element)
说明:scroll是通过元素来进行滑动的
-
source_element表示原元素;target_element表示目标元素,滑动原理是由原元素拖动到目标元素的位置
-
scroll无法设置滑动的持续时间,带有一定惯性。主要用于IOS中,android高版本系统可以使用。
import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC
# 定义一个初始化APP的方法
def start_app(app_package, app_activity):
# 定义desired_caps 字典,初始化app的配置信息
desired_caps = {
"platformName": "android", # 表示的是android
"platformVersion": "10", # 表示的是设备系统的版本号
"deviceName": "DWV6R19A10002101", # 表示的是设备的ID名称
"appPackage": app_package, # 表示的是app的包名
"appActivity": app_activity, # 表示的是app的界面名
"newCommandTimeout": 100000,
"noReset": True, # 用来记住app的session,如果有登陆或做过初始化的操作,为True时,后面不需要再操作
"resetKeyboard": True, # 重置设备的输入键盘
"unicodeKeyboard": True # 采用unicode编码输入
}
# 创建 Appium 驱动实例
options = UiAutomator2Options().load_capabilities(desired_caps)
driver = webdriver.Remote("http://localhost:4723/wd/hub", options=options)
# 启动应用程序
driver.wait_activity(desired_caps, 5)
return driver
# 定义一个获取元素的方法
def get_element_new(driver, element):
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))
return element
if __name__ == "__main__":
# 本次启动的应用程序包名和活动名(作业帮)
app_package_zyb = "com.baidu.homework"
app_activity_zyb = ".activity.index.IndexActivity"
# 启动应用程序
driver_zyb = start_app(app_package_zyb, app_activity_zyb)
# 进入「我的」tab
my_tab = (By.XPATH, '//android.widget.RelativeLayout[@resource-id="com.baidu.homework:id/tab_my_layout"]')
get_element_new(driver_zyb, my_tab).click()
# 找到「我的活动」元素
My_activities = (By.XPATH, '//android.widget.TextView[@resource-id='
'"com.baidu.homework:id/user_item_title" and @text="我的活动"]')
my_activities = get_element_new(driver_zyb, My_activities)
# 找到「我的订单」元素
my_order = (By.ID, 'com.baidu.homework:id/user_item_title')
my_order_element = get_element_new(driver_zyb, my_order)
# 滑动
driver_zyb.scroll(my_activities, my_order_element)
# 关闭驱动
time.sleep(3)
print("代码执行完毕")
driver_zyb.quit()
5、drag_and_drop拖拽事件
原理:从一个元素滑动到另外一个元素的位置, 同时也能实现将一个元素拖动另一个元素当中。
示例:
driver.drag_and_drop(source_element, target_element)
说明:
-
source_element 表示的是被拖动的元素对象
-
target_element 表示的是目标元素对象
import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC
# 定义一个初始化APP的方法
def start_app(app_package, app_activity):
# 定义desired_caps 字典,初始化app的配置信息
desired_caps = {
"platformName": "android", # 表示的是android
"platformVersion": "10", # 表示的是设备系统的版本号
"deviceName": "DWV6R19A10002101", # 表示的是设备的ID名称
"appPackage": app_package, # 表示的是app的包名
"appActivity": app_activity, # 表示的是app的界面名
"newCommandTimeout": 100000,
"noReset": True, # 用来记住app的session,如果有登陆或做过初始化的操作,为True时,后面不需要再操作
# "resetKeyboard": True, # 重置设备的输入键盘 (连接虚拟机时使用)
# "unicodeKeyboard": True # 采用unicode编码输入(连接虚拟机时使用)
}
# 创建 Appium 驱动实例
options = UiAutomator2Options().load_capabilities(desired_caps)
driver = webdriver.Remote("http://localhost:4723/wd/hub", options=options)
# 启动应用程序
driver.wait_activity(desired_caps, 5)
return driver
# 定义一个获取元素的方法
def get_element_new(driver, element):
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))
return element
if __name__ == "__main__":
# 本次启动的应用程序包名和活动名(作业帮)
app_package_zyb = "com.baidu.homework"
app_activity_zyb = ".activity.index.IndexActivity"
# 启动应用程序
driver_zyb = start_app(app_package_zyb, app_activity_zyb)
# 进入「我的」tab
my_tab = (By.XPATH, '//android.widget.RelativeLayout[@resource-id="com.baidu.homework:id/tab_my_layout"]')
get_element_new(driver_zyb, my_tab).click()
# 找到「我的活动」元素
My_activities = (By.XPATH, '//android.widget.TextView[@resource-id='
'"com.baidu.homework:id/user_item_title" and @text="我的活动"]')
my_activities = get_element_new(driver_zyb, My_activities)
# 找到「我的订单」元素
my_order = (By.ID, 'com.baidu.homework:id/user_item_title')
my_order_element = get_element_new(driver_zyb, my_order)
# 通过拖动来实现滑屏操作
driver_zyb.drag_and_drop(my_activities, my_order_element)
# 关闭驱动
time.sleep(3)
print("代码执行完毕")
driver_zyb.quit()
下期分享:高级手势操作&toast操作,欢迎关注!
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。