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文件中进行更改。减少了维护成本。
封装方法千千万,哪种方便用哪种,仅供参考。
看完安静的博客,如果对您有帮助,可以在右下角点个关注,哪里有不会的或者不懂的,可以下方留言。持续更新中。