自动化测试讲究的是简单,快捷,便于维护。对于自动化维护这一块最重要的也就属元素定位了。
思路
写代码之前我们养成先把思路理清楚,这样再写代码的时候才不会不知道如何下手了。
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自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。