zoukankan      html  css  js  c++  java
  • 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文件中进行更改。减少了维护成本。

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

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

  • 相关阅读:
    C#生成唯一码方法
    解剖常用软件程序都用什么语言开发
    Unity3D笔记七 GUILayout
    函数的递归
    函数
    函数的参数
    函数的返回值
    函数的定义
    文件处理
    集合
  • 原文地址:https://www.cnblogs.com/qican/p/12668441.html
Copyright © 2011-2022 走看看