appium---定位封装

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

思路

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

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文件中进行更改。减少了维护成本。

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

 

看完安静的博客,如果对您有帮助,可以在右下角点个关注,哪里有不会的或者不懂的,可以下方留言。持续更新中。

 

posted @ 2020-05-15 17:42  测试-安静  阅读(935)  评论(0编辑  收藏  举报