如何在Appium中实现多次滑动页面直至定位到目标元素?
Appium 循环滑动查找目标元素实现方案
前置依赖导入
首先补充必要的依赖导入:
from selenium.common.exceptions import TimeoutException from appium.webdriver.common.touch_action import TouchAction from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By import time
核心逻辑说明
- 封装单次滑动逻辑为可复用函数,避免重复代码
- 设置最大滑动次数(示例为10次,可根据页面实际长度调整),防止页面滑到底后出现死循环
- 每次循环先尝试查找目标元素,找到则跳出循环执行后续操作;未找到则捕获超时异常,执行一次滑动后进入下一轮查找
完整可运行代码
# 配置项:可根据实际测试场景调整 MAX_SWIPE_TIMES = 10 # 最大滑动次数 TARGET_EVENT_NAME = "Event name" # 要查找的目标游戏名称 TARGET_GAME_SIZE = "55.68 MB" # 目标游戏标识大小 # 封装单次向下滑动逻辑 def swipe_down(): time.sleep(1) print('正在滑动页面..') touch = TouchAction(driver) # 此处坐标可根据设备分辨率调整,建议优先使用相对坐标适配多设备 touch.long_press(x=500, y=1800).move_to(x=500, y=400).release().perform() time.sleep(2) print('页面滑动完成') # 循环滑动查找目标元素逻辑 event_found = False wait = WebDriverWait(driver, 3) # 单次查找的等待时间缩短,避免每次无意义等待过久 for i in range(MAX_SWIPE_TIMES): try: # 尝试查找目标元素 Event_Name = wait.until(EC.visibility_of_element_located((By.XPATH, f'//*[@text="{TARGET_EVENT_NAME}"]//ancestor::*[contains(@class, "android.widget.LinearLayout")]'))) event_found = True print(f'第{i+1}次尝试找到目标元素,停止滑动') break except TimeoutException: # 未找到则执行滑动 print(f'第{i+1}次尝试未找到目标元素,执行滑动') swipe_down() # 未找到元素的异常处理 if not event_found: print(f"FAIL - 累计滑动{MAX_SWIPE_TIMES}次仍未找到目标游戏{TARGET_EVENT_NAME}") # 可在此处添加终止用例的逻辑 exit(1) # 找到元素后的原有业务逻辑 Event_Name.click() time.sleep(2) Game_title = driver.find_element_by_id('com.project.projectname:id/eventName') print(f'PASS - Step 2. {Game_title.text} game card was clicked') time.sleep(2) wait = WebDriverWait(driver, 15) Game_size_GameName = wait.until(EC.visibility_of_all_elements_located((By.ID, 'com.project.projectname:id/size'))) # 注意:原代码此处存在变量名大小写不一致的问题,已修正 size_match = False for size in Game_size_GameName: if TARGET_GAME_SIZE == size.text: size_match = True print(f'PASS - Step 3. User is on the {Game_title.text} product page') break if not size_match: print('FAIL - Step 3. Failed to redirect user') time.sleep(2) Events_tab_title = wait.until(EC.visibility_of_element_located((By.ID, 'com.project.projectname:id/screenTitle'))) back_button.click() print(f'PASS - Step 11. User is back on the {Events_tab_title.text} tab') time.sleep(2)
可选优化点
- 可将固定坐标改为通过
driver.get_window_size()获取设备屏幕宽高,计算相对滑动坐标,适配不同分辨率的测试设备 - 可增加滑到底判断逻辑:对比两次滑动后的页面源码是否一致,若一致则说明已到页面底部,无需继续滑动
内容的提问来源于stack exchange,提问作者Claudaette
相关产品推荐
相关产品推荐

