appium---定位封装

597 篇文章 17 订阅
39 篇文章 1 订阅

自动化测试讲究的是简单,快捷,便于维护。对于自动化维护这一块最重要的也就属元素定位了。

思路

写代码之前我们养成先把思路理清楚,这样再写代码的时候才不会不知道如何下手了。

1、通过yaml(或者其他工具)管理元素和定位方法

2、封装读取yaml(或者其他工具)函数

3、通过读取yaml信息把定位信息和元素分离出来并填入对应的定位方法中

PS:这里通过淘宝登陆练习。

编写元素和定位方法
这里我们可以把页面元素和定位方法通过yaml数据进行填写在同一个yaml中。

这里通过“>”进行把定位方法(by)和元素内容进行分开了,方便后面进行提取。

# element。yaml

login: 登录
username: id>com.taobao.taobao:id/aliuser_login_mobile_et
password: android>resourceId("com.taobao.taobao:id/aliuser_register_sms_code_et")
login_button: className>android.widget.Button

读取封装的yaml函数

这里封装一个函数进行读取yaml文件内容。

# read_yaml.py

import yaml
import os
class   GetYaml():
    def __init__(self,file_path):
        # 判断文件是否存在
        if os.path.exists(file_path):
            self.file_path = file_path
        else:
            print('没有找到%s文件路径'%file_path)
        self.data = self.read_yaml()
    def read_yaml(self):
         with open(self.file_path,'r',encoding='utf-8')as f:
            p = f.read()
            return p
    def get_data(self,key=None):
        result = yaml.load(self.data,Loader=yaml.FullLoader)
        if key == None:
            return result
        else:
            return result.get(key)

if __name__ == '__main__':
    read_yaml = GetYaml('element.yaml')
    xx = read_yaml.get_data('login')
    print(xx)

封装定位方法

好了,最重要的封装定位来了。

小思路:

1、前面也提到了,如果元素和定位方法都写在了一起,首先要把其分开;

2、需要对定位方法进行判断,然后把元素放入到对应的定位方法中;

3、这里为了保证代码的正常运行,安静这里直接运用了显示等待的方法。

# coding:utf-8
# get_by_local.py

from common.read_yaml import GetYaml
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class GetByLocal:
    def __init__(self,driver):
        self.driver = driver
    def get_element(self,path,key):
        # 获取到yaml地址,并进行读取器
        yaml_data = GetYaml(path)
        local = yaml_data.get_data(key)
        if local != None:
            by = local.split('>')[0]
            local_by = local.split('>')[1]
            try:
                if by == 'id':
                    element = WebDriverWait(self.driver, 10, 0.5).until(lambda x: x.find_element_by_id(local_by))
                elif by == 'className':
                    element = WebDriverWait(self.driver, 10, 0.5).until(lambda x: x.find_element_by_class_name(local_by))
                elif by == 'xpath':
                    element = WebDriverWait(self.driver, 10, 0.5).until(lambda x: x.find_element_by_xptah(local_by))
                elif by == 'android':
                    element = WebDriverWait(self.driver, 10, 0.5).until(lambda x: x.find_element_by_android_uiautomator(local_by))
                else:
                    loc = (by,local_by)  # 元祖
                    element = WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_element_located(loc))
                return element
            except:
                    return None
        else:
            return None

提取页面信息

这里运用了安静把一个页面上的元素的封装到一个文件中了,方便我们进行使用和调用

注:这里只把用户名,密码,已经登录按钮的提取出来了,小伙伴们也可以把其他的一起写进来(忘记密码,注册,以及显示toast方法)

# login_page.py
# coding:utf-8

from common.get_by_local import GetByLocal

class LoginPage:
    def __init__(self,driver):
        self.get_by_local = GetByLocal(driver)
    def get_username_element(self,path):
        return self.get_by_local.get_element(path,'username')

    def get_password_element(self,path):
        return  self.get_by_local.get_element(path,'password')

    def get_login_button_element(self,path):
        return self.get_by_local.get_element(path,'login_button')

编写用例

前面的准备工作都已经完成了,这里我们开始编写测试用例了。(这里没有用unittest的方法,只是简单的走一个流程,注重的是方法)

from appium import webdriver
from pages.login_page import LoginPage
import time
import os
path  =os.path.dirname(os.getcwd())
# 获取到yaml文件路径
yaml_path = os.path.join(os.path.join(path,'config'),'element.yaml')
class BaseDriver:
    def android_driver(self):
        desired_caps = {
                         'platformName': 'Android',  # 测试版本
                         'deviceName': 'emulator-5554',   # 设备名
                         'platformVersion': '5.1.1', # 系统版本
                        "appPackage": "com.taobao.taobao",   # app包名
                        "appActivity": "com.ali.user.mobile.login.ui.UserLoginActivity",   # 启动launch Activity
                        "noReset": True,  # 不清空数据
                        "unicodeKeyboard": True,    # 使用Unicode编码方式发送字符串
                        "resetKeyboard": True,      # 键盘隐藏起来
                                }
        driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        return driver
    def login(self,driver):
            page =LoginPage(driver)
            time.sleep(8)
            # 获取用户名元素以及输入内容
            use = page.get_username_element(yaml_path)
            use.send_keys('1111')
            # 获取密码元素以及输入内容
            pas = page.get_password_element(yaml_path)
            pas.send_keys('22222')
            # 进行点击登录
            button = page.get_login_button_element(yaml_path)
            button.click()

if __name__ == '__main__':
    x = BaseDriver()
    xx = x.android_driver()
    x.login(xx)

通过小的例子来完成了对元素和定位方法的封装,后面我们的自动化代码就便于维护,定位元素更改了,我们只需要在yaml文件中进行更改。减少了维护成本。

封装方法千千万,哪种方便用哪种,仅供参考。

点赞关注~~持续分享,加入我们,了解更多。642830685,免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值