1:PageObject三层架构分为:
接下来用163邮箱的登录功能来举例说明三层架构的使用。
1:先创建目录结构,如下图
2:在工具Util中,先封装查找元素定位的工具,创建一个find_ele.py文件。内容如下:
from selenium.webdriver.support.wait import WebDriverWait
def find_element(dirver, find_type, find_express):
'''查找元素控件'''
try:
element = WebDriverWait(dirver, 20).until(lambda driver:driver.find_element(find_type, find_express))
# 20秒内,每0.5秒去查找一次元素,直到找到为止,找到就返回,如果20秒还没找到,就抛异常
return element
except Exception as e:
raise e
3:接下来在pageobject三层架构中的第一层对象层,封装登录页面的元素定位及操作
在Object文件夹下创建一个loginpage.py文件,内容如下:
# 对象层
from selenium import webdriver
from Util.find_ele import find_element
from Util.read_ini import ParseConfigFile
class LoginPage:
def __init__(self, driver):
self.driver = driver
def input_username(self, username):
'''定位用户名输入控件,并输入用户名'''
find_element(self.driver, 'name', 'email').send_keys(username)
def input_password(self, password):
'''定位密码输入控件,并输入密码'''
find_element(self.driver, 'name', 'password').send_keys(password)
def switch_frame(self):
'''切换iframe'''
frame = find_element(self.driver, 'tag name', 'iframe')
self.driver.switch_to.frame(frame)
def login_click(self):
'''点击登录'''
find_element(self.driver, 'id', 'dologin').click()
if __name__ == '__main__':
driver = webdriver.Chrome()
# 访问网址
driver.get('https://mail.163.com/')
login = LoginPage(driver) # 初始化LoginPage类
# 执行登录操作
login.switch_frame()
login.input_username('12345')
login.input_password('123456')
login.login_click()
4:下来是pageobject的第二层逻辑层,封装登录功能
在Module文件夹下,创建一个login.py文件,内容如下:
# 逻辑层
from Object.loginpage import LoginPage
from selenium import webdriver
class LoginModule:
def __init__(self):
print('------开始登录------')
def login(self, driver, username, password):
'''登录操作'''
try:
login_page = LoginPage(driver) # 初始化对象层的LoginPage类
login_page.switch_frame()
login_page.input_username(username)
login_page.input_password(password)
login_page.login_click()
except Exception as e:
raise e
if __name__ == '__main__':
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')
login = LoginModule()
login.login(driver, '12345', '123456')
5:pageobject第三层业务层,编写测试用例
在Scripts文件夹下创建一个以test开头的py文件,test_login.py文件内容如下:
# 业务层
from selenium import webdriver
from Moduel.login import LoginModule
def test_login():
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')
login = LoginModule()
login.login(driver, '12345', '123456')
6:pageobject三层架构的核心逻辑已经写完了,但是可以发现,其中的元素定位方式和值是写死的,如果有变动,那么就要去修改对象层的每个元素的定位方式及值。
为了防止改动源文件,我们增加一个.ini文件来管理元素定位的方式及值,每次修改元素定位,就只用修改ini文件即可。
ini文件的格式为:
节[section1]
参数 name=value
参数 name=value
参数 name=value
节[section2]
参数 name=value
参数 name=value
参数 name=value
以节及它的参数来表达定位元素方式和值。section1和section2之间的参数,都是属于section1的。
登录页面的元素定位方式及值,用ini文件来表示,为:
在Setting文件夹下创建一个element_location.ini文件。
[login_page]
login_page.username = name:email
login_page.password = name:password
login_page.loginbutton = id:dologin
login_page.frame = tag name:iframe
7:ini配置文件已经完成,接下来就是要读取ini文件中的内容。
首先在Setting文件夹下,创建一个Config.py文件,用来获取文件路径。
# 获取文件地址
import os
Base_path = os.path.dirname(os.path.dirname(__file__)) # 获取根目录
print(Base_path)
# 元素定位文件
Element_Location_Path = os.path.join(Base_path, 'Setting/element_location.ini')
print(Element_Location_Path)
# 测试用例文件路径
Case_Path = os.path.join(Base_path, 'Scripts')
print(Case_Path)
然后再Util文件夹下,创建一个read_ini.py文件,来封装读取ini文件的工具类。
# 解析config.ini文件
import configparser
from Setting.Config import Element_Location_Path
class ParseConfigFile:
def __init__(self):
self.cf = configparser.ConfigParser() # 初始化类
self.cf.read(Element_Location_Path) # 读取文件
def getSection(self, section_name):
'''获取section_name下的所有参数'''
option_dict = dict(self.cf.items(section_name))
return option_dict
if __name__ == '__main__':
pf = ParseConfigFile()
print(pf.getSection('login_page'))
输出:{'login_page.username': 'name:email', 'login_page.password': 'name:password',
'login_page.loginbutton': 'id:dologin', 'login_page.frame': 'tag name:iframe'}
8:修改Object对象层中的获取元素定位的方式。
修改loginpage.py文件:
# 对象层
from selenium import webdriver
from Util.find_ele import find_element
from Util.read_ini import ParseConfigFile
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.pf = ParseConfigFile()
self.option_dicts = self.pf.getSection('login_page') # 获取定位元素的配置文件内容
def input_username(self, username):
'''定位用户名输入控件,并输入用户名'''
# find_element(self.driver, 'name', 'email').send_keys(username)
# 从读取的配置文件option_dict字典中,获取用户名输入框的定位方式及值
location_name, location_type = self.option_dicts['login_page.username'].split(':')
find_element(self.driver, location_name, location_type).send_keys(username)
def input_password(self, password):
'''定位密码输入控件,并输入密码'''
# find_element(self.driver, 'name', 'password').send_keys(password)
# 从读取的配置文件option_dict字典中,获取密码输入框的定位方式及值
location_name, location_type = self.option_dicts['login_page.password'].split(':')
find_element(self.driver, location_name, location_type).send_keys(password)
def switch_frame(self):
'''切换iframe'''
# frame = find_element(self.driver, 'tag name', 'iframe')
# 从读取的配置文件option_dict字典中,获取iframe的定位方式及值
location_name, location_type = self.option_dicts['login_page.frame'].split(':')
frame = find_element(self.driver, location_name, location_type)
self.driver.switch_to.frame(frame)
def login_click(self):
'''点击登录'''
# find_element(self.driver, 'id', 'dologin').click()
# 从读取的配置文件option_dict字典中,获取登录按钮的定位方式及值
location_name, location_type = self.option_dicts['login_page.loginbutton'].split(':')
find_element(self.driver, location_name, location_type).click()
if __name__ == '__main__':
driver = webdriver.Chrome()
# 访问网址
driver.get('https://mail.163.com/')
login = LoginPage(driver)
login.switch_frame()
login.input_username('YM_yimin')
login.input_password('yimin19960930')
login.login_click()
9:最后,在run.py文件中,进行执行
# 执行入口
import pytest
from Setting.Config import Case_Path
if __name__ == '__main__':
pytest.main(['-s', '-v', Case_Path])
整个PageObject三层架构框架就写完了。