You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:54:06