python+selenium+appium元素定位和各种操作方法的封装

显示等待

显示等待方法可提高自动化测试效率,和用例稳定性;
显示等待实现原理:写个死循环每次获取当前时间去和需等待时间对比,如果在等待时间内找到元素或者当前时间大于等待时间则跳出死循环

# 代码实现
import time

def wait(element,timeout):
    end_time = time.time() + timeout # 结束时间,timeout-需等待时间单位秒
    while True:
        # 需执行的条件
        if element:
            break #等待时间内达到条件跳出循环
        if time.time() > end_time:
            break # 如果当前时间大于等待时间跳出循环   

重新封装find_element方法实现显示等待

使用框架:selenium包

  • WebDriverWait -显示等待
  • expected_conditions.visibilty_of_element_located -查询页面元素

1、新建.py文件,文件名自定

# 导入方法
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as Es

class base_page():
    def __init__(self,driver):
        self.driver = driver # 传入实例化webdriver
        
    # 重新封装find_element,传参传入元祖
    def find_element(self,*loc):
        try:
            WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(*loc))
            return self.driver.find_element(*loc)
        except Exception as e
            raise e
    
    def send_keys(self,values,*loc):
        try:
            self.find_element
### 使用 Python Appium 实现 APP 爬虫的最佳实践 #### 一、环境准备 在 PyCharm 中创建项目并配置好开发环境后,需要确保安装必要的依赖包。可以通过 `pip` 命令来完成依赖库的安装[^1]。 ```bash pip install Appium-Python-Client ``` 此命令用于安装 AppiumPython 客户端支持模块,这是实现自动化测试以及爬取数据的基础工具之一。 --- #### 二、获取 APK 应用的关键参数 为了启动目标应用程序,在编写脚本前需要收集两个重要属性:`appPackage` `appActivity`。这些信息可通过 ADB 工具提取: 1. **获取 appPackage** 执行以下命令可以找到应用对应的包名: ```bash adb shell dumpsys activity recents | find "intent={" ``` 2. **获取 appActivity** 启动目标应用后再执行如下命令可获得其主页面活动名称(即 launcherActivity): ```bash adb shell dumpsys activity | findstr "mResume" ``` 上述操作会返回当前正在运行的应用程序组件路径中的关键字段[^2][^3]。 --- #### 三、初始化 Desired Capabilities 配置 Desired Capabilities 是连接设备与模拟器的核心设置项集合,它定义了测试平台的各种特性及其行为模式。下面是一个典型的例子展示如何指定 Android 平台上的基本选项: ```python from appium import webdriver desired_caps = { 'platformName': 'Android', # 设备操作系统类型 'deviceName': 'emulator-5554', # 连接的具体物理机或者虚拟仿真器ID 'automationName': 'UiAutomator2', # 自动化引擎的选择,默认推荐 UiAutomator2 'appPackage': 'com.example.app', # 替换为目标APK的实际包名 'appActivity': '.MainActivity' # 对应于入口界面的名字 } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) ``` 这里需要注意的是替换掉 `'com.example.app'` 及 `'.MainActivity'` 成实际项目的具体数值。 --- #### 四、构建基础交互逻辑 一旦成功建立了 session,则能够利用 WebDriver API 来控制 UI 组件的操作流程。比如点击按钮、输入文字等动作都可以被封装成函数调用来简化重复劳动过程。 以下是简单的登录场景演示片段: ```python def login(driver, username, password): user_field = driver.find_element_by_id("username_input") # 查找用户名框 pass_field = driver.find_element_by_id("password_input") # 密码栏定位 submit_btn = driver.find_element_by_accessibility_id("login") # 登录按键识别 user_field.send_keys(username) # 输入账号 pass_field.send_keys(password) # 设置密码 submit_btn.click() # 提交表单触发事件 # 调用方法传参实例 login(driver, "test_user", "secure_password!") ``` 以上代码展示了基于 ID 或者 Accessibility Identifier 属性值来进行元素检索的方式,并完成了自动填写表单项的任务处理。 --- #### 五、抓取动态加载的数据 对于现代移动端应用而言,很多内容都是异步请求拉取回来渲染出来的。因此单纯依靠 DOM 结构可能无法满足需求。此就需要借助 Selenium/Appium 内建的支持机制去等待特定条件成立之后再继续下一步骤。 例如当某个列表完全呈现出来以后才允许遍历读取消息条目: ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, timeout=30) try: element_present = EC.presence_of_all_elements_located((By.CLASS_NAME, "list_item")) wait.until(element_present) items = driver.find_elements(By.CLASS_NAME, "list_item") for item in items: print(item.text.strip()) except Exception as e: raise RuntimeError(f"Failed to load list due to {e}") finally: driver.quit() ``` 该部分实现了显式等待策略配合自定义断言规则验证预期结果是否达成;如果超则抛出异常终止进程。 --- ### 总结说明 综上所述,通过合理运用 Appium 提供的功能接口结合 Python 编程技巧完全可以胜任大部分常规性的移动终端网页采集工作。不过鉴于不同业务场景下可能存在特殊定制要求的情况,建议开发者灵活调整方案适应实际情况变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值