selenium 数据驱动框架自动化从0到1–5
上一篇我们把页面元素的元素表达式提取出放在了一个配置文件里,也封装了解析文件的工具,于是我们这篇就继续改造哪3个涉及页面元素表达式的页面。代码如下:
#encoding = utf-8
from util.get_object_map import * #导入工具
class LoginPage(object):
def __init__(self,driver): #构造方法初始化
self.driver = driver
def switch_frame(self):
try:
#获取frame页面元素对象
frame = get_element(self.driver,'xpath',"//iframe[contains(@id,'x-URS-iframe')]")
self.driver.switch_to.frame(frame) #切换到frame页面
except Exception as e:
raise e
def switch_default_frame(self):
try:
self.driver.switch_to.default_content() #切换到默认的frame页面
except Exception as e:
raise e
def user_name_obj(self):
try:
#获取登录页面的用户名输入框元素对象,并返回给调用者
element = get_element(self.driver, 'xpath', '//input[@name="email"]')
return element
except Exception as e:
raise e
def password_obj(self):
try:
# 获取登录页面的密码输入框元素对象,并返回给调用者
element = get_element(self.driver,'xpath','//input[@name="password"]')
return element
except Exception as e:
raise e
def login_button_obj(self):
try:
# 获取登录页面的登录按钮元素对象,并返回给调用者
element = get_element(self.driver,'id','dologin')
return element
except Exception as e:
raise e
if __name__ == '__main__':
from util.open_browser import *
driver = OpenBrowser() #实例化启动浏览器对象
login = LoginPage(driver) #实例化登录页面对象
login.switch_frame() #切换到frame页面
login.user_name_obj().send_keys('abc_123456qwe') #用户名输入
login.password_obj().send_keys('abc_123456') #密码输入
login.login_button_obj().click() #登录按钮点击
login.switch_default_frame() #切换到默认的frame页面
print('登录成功')
driver.quit() #退出
引入配置文件改造后代码如下:
#encoding = utf-8
from util.get_object_map import * #导入工具
from util.config_file_parse import *
class LoginPage(object):
def __init__(self,driver): #构造方法初始化
self.driver = driver
self.cp = ConfigParseFile() #实例化解析文件类
# 初始化数据,返回‘login_page’选项下的数据,类型为字典
self.pv = self.cp.get_items_section('login_page')
def switch_frame(self):
try:
#从定位表达式配置文件中读取frame 的定位方式和表达式
locateType, locatorExpression = self.pv['lp_frame'.lower()].split(">")
#获取frame页面元素对象
frame = get_element(self.driver,locateType,locatorExpression)
self.driver.switch_to.frame(frame) #切换到frame页面
except Exception as e:
raise e
def switch_default_frame(self):
try:
self.driver.switch_to.default_content() #切换到默认的frame页面
except Exception as e:
raise e
def user_name_obj(self):
try:
#从定位表达式配置文件里读取用户名文本框的定位方式和表达式
locateType, locatorExpression = self.pv['lp_user_name'.lower()].split('>')
#获取登录页面的用户名输入框元素对象,并返回给调用者
element = get_element(self.driver, locateType,locatorExpression)
return element
except Exception as e:
raise e
def password_obj(self):
try:
#从定位表达式配置文件里获取到密码输入框的定位方式和表达式
locateType, locatorExression = self.pv['lp_password'.lower()].split('>')
# 获取登录页面的密码输入框元素对象,并返回给调用者
element = get_element(self.driver,locateType,locatorExression)
return element
except Exception as e:
raise e
def login_button_obj(self):
try:
#从定位表达式配置文件里获取到登录按钮的定位方式和表达式
locateType, locatorExpression = self.pv['lp_login_button'.lower()].split(">")
# 获取登录页面的登录按钮元素对象,并返回给调用者
element = get_element(self.driver,locateType,locatorExpression)
return element
except Exception as e:
raise e
if __name__ == '__main__':
from util.open_browser import *
import time
driver = OpenBrowser() #实例化启动浏览器对象
login = LoginPage(driver) #实例化登录页面对象
login.switch_frame() #切换到frame页面
login.user_name_obj().send_keys('abc_123456qwe') #用户名输入
login.password_obj().send_keys('abc_123456') #密码输入
login.login_button_obj().click() #登录按钮点击
login.switch_default_frame() #切换到默认的frame页面
time.sleep(3)
print('登录成功')
driver.quit() #退出
#encoding = utf-8
from util.get_object_map import *
class HomePage(object):
def __init__(self,driver):
self.driver = driver
def address_book(self):
try:
#获取通讯录按钮元素对象
element = get_element(self.driver,'xpath','//div[text()="通讯录"]')
return element
except Exception as e:
raise e
if __name__ =='__main__':
from util.open_browser import *
from app_models.login_action import LoginAction
driver = OpenBrowser() #创建浏览器实例
lg=LoginAction() #创建登录页面实例
lg.login(driver,'abc_123456qwe','abc_123456') #登录
hg = HomePage(driver) #创建home 页面实例
hg.address_book().click() #点击通讯录按钮
driver.quit() #退出
引入配置文件后改造如下:
#encoding = utf-8
from util.get_object_map import *
from util.config_file_parse import *
class HomePage(object):
def __init__(self,driver):
self.driver = driver
self.cp = ConfigParseFile() # 实例化解析文件类
# 初始化数据,返回‘login_page’选项下的数据,类型为字典
self.pv = self.cp.get_items_section('home_page')
def address_book(self):
try:
#从定位表达式文件里读取通信录按钮的定位方式和表达式
locatetType, locatorExpression = self.pv['hp_address_book'.lower()].split('>')
#获取通讯录按钮元素对象
element = get_element(self.driver,locatetType,locatorExpression)
return element
except Exception as e:
raise e
if __name__ =='__main__':
from util.open_browser import *
from app_models.login_action import LoginAction
import time
driver = OpenBrowser() #创建浏览器实例
lg=LoginAction() #创建登录页面实例
lg.login(driver,'abc_123456qwe','abc_123456') #登录
hg = HomePage(driver) #创建home 页面实例
hg.address_book().click() #点击通讯录按钮
time.sleep(3)
driver.quit() #退出
#encoding = utf-8
from util.get_object_map import *
class AddContactPensonPage(object):
def __init__(self,driver):
self.driver = driver
def add_contact_person_button(self):
try:
#获取添加联系人按钮元素对象返回给调用者
element = get_element(self.driver,'xpath','//span[text()="新建联系人"]')
return element
except Exception as e:
raise e
def user_name(self):
try:
#获取新建联系人姓名元素对象返回给调用者
element = get_element(self.driver,'xpath','//a[@title="编辑详细姓名"]/preceding-sibling::div/input')
return element
except Exception as e:
raise e
def user_person_email(self):
try:
#获取新建联系人电子邮箱元素对象返回给调用者
element = get_element(self.driver,'xpath','//div[@id="iaddress_MAIL_wrap"]//dd/div//input')
return element
except Exception as e:
raise e
def is_star(self):
try:
#获取是否是星标朋友的元素对象返回给调用者
element = get_element(self.driver,'xpath','//span[text()="设为星标联系人"]/preceding-sibling::span/b')
return element
except Exception as e:
raise e
def user_person_phon(self):
try:
#获取联系人手机号码元素对象返回给调用者
element = get_element(self.driver,'xpath','//div[@id="iaddress_TEL_wrap"]//dd/div//input')
return element
except Exception as e:
raise e
def user_person_comment(self):
try:
#获取备注元素对象返回给调用者
element = get_element(self.driver,'xpath','//textarea[@id="input_DETAIL"]')
return element
except Exception as e:
raise e
def save_button(self):
try:
#获取确定按钮元素对象返回给调用者
element = get_element(self.driver,'xpath','//span[text()="确 定"]')
return element
except Exception as e:
raise e
if __name__ =='__main__':
from util.open_browser import *
from app_models.login_action import LoginAction
from page_objects.home_page import *
from time import sleep
driver = OpenBrowser() #创建浏览器实例
lg = LoginAction() #创建登录页面实例
lg.login(driver,'abc_123456qwe','abc_123456') #登录
hg = HomePage(driver) #创建home页面实例
hg.address_book().click() #点击通讯录按钮
cp=AddContactPensonPage(driver) #创建添加联系人页面元素实例
cp.add_contact_person_button().click() #点击添加联系人按钮
sleep(3)
cp.user_name().send_keys('xinzeng') #姓名输入
sleep(3)
cp.user_person_email().send_keys('14432@163.com') #电子邮箱输入
cp.is_star().click() #点击星标按钮
cp.user_person_phon().send_keys('12345324323') #输入电话
cp.user_person_comment().send_keys('gdgfghgfh') #输入备注
cp.save_button().click() #点击确定
sleep(3)
assert u'xinzeng' in driver.page_source #断言xinzeng 是否添加完成
sleep(2)
print('断言成功')
driver.quit() #退出
引入配置文件改造后代码如下
#encoding = utf-8
from util.get_object_map import *
from util.config_file_parse import *
class AddContactPensonPage(object):
def __init__(self,driver):
self.driver = driver
self.cp = ConfigParseFile() # 实例化解析文件类
# 初始化数据,返回‘login_page’选项下的数据,类型为字典
self.pv = self.cp.get_items_section('add_contact_person_page')
def add_contact_person_button(self):
try:
# 从定位表达式配置文件中读取添加联系人按钮 的定位方式和表达式
locateType, locatorExpression = self.pv['cp_add_contact_person_button'.lower()].split(">")
#获取添加联系人按钮元素对象返回给调用者
element = get_element(self.driver,locateType,locatorExpression)
return element
except Exception as e:
raise e
def user_name(self):
try:
# 从定位表达式配置文件中读取添加联系人姓名文本框 的定位方式和表达式
locateType, locatorExpression = self.pv['cp_contact_person_name'.lower()].split(">")
#获取新建联系人姓名元素对象返回给调用者
element = get_element(self.driver,locateType,locatorExpression)
return element
except Exception as e:
raise e
def user_person_email(self):
try:
# 从定位表达式配置文件中读取添加联系人电子邮箱 的定位方式和表达式
locateType, locatorExpression = self.pv['cp_contact_person_email'.lower()].split(">")
#获取新建联系人电子邮箱元素对象返回给调用者
element = get_element(self.driver,locateType,locatorExpression)
return element
except Exception as e:
raise e
def is_star(self):
try:
# 从定位表达式配置文件中读取 是否是星标朋友按钮的定位方式和表达式
locateType, locatorExpression = self.pv['cp_is_star'.lower()].split(">")
#获取是否是星标朋友的元素对象返回给调用者
element = get_element(self.driver,locateType,locatorExpression)
return element
except Exception as e:
raise e
def user_person_phon(self):
try:
# 从定位表达式配置文件中读取添加联系人电话文本框的定位方式和表达式
locateType, locatorExpression = self.pv['cp_contact_person_phon'.lower()].split(">")
#获取联系人手机号码元素对象返回给调用者
element = get_element(self.driver,locateType,locatorExpression)
return element
except Exception as e:
raise e
def user_person_comment(self):
try:
# 从定位表达式配置文件中读取添加联系人备注文本框 的定位方式和表达式
locateType, locatorExpression = self.pv['cp_contact_person_coment'.lower()].split(">")
#获取备注元素对象返回给调用者
element = get_element(self.driver,locateType,locatorExpression)
return element
except Exception as e:
raise e
def save_button(self):
try:
# 从定位表达式配置文件中读取保存按钮 的定位方式和表达式
locateType, locatorExpression = self.pv['cp_contact_person_save_button'.lower()].split(">")
#获取确定按钮元素对象返回给调用者
element = get_element(self.driver,locateType,locatorExpression)
return element
except Exception as e:
raise e
if __name__ =='__main__':
from util.open_browser import *
from app_models.login_action import LoginAction
from page_objects.home_page import *
from time import sleep
driver = OpenBrowser() #创建浏览器实例
lg = LoginAction() #创建登录页面实例
lg.login(driver,'abc_123456qwe','abc_123456') #登录
hg = HomePage(driver) #创建home页面实例
hg.address_book().click() #点击通讯录按钮
cp=AddContactPensonPage(driver) #创建添加联系人页面元素实例
cp.add_contact_person_button().click() #点击添加联系人按钮
sleep(3)
cp.user_name().send_keys('xinzeng') #姓名输入
sleep(3)
cp.user_person_email().send_keys('14432@163.com') #电子邮箱输入
cp.is_star().click() #点击星标按钮
cp.user_person_phon().send_keys('12345324323') #输入电话
cp.user_person_comment().send_keys('gdgfghgfh') #输入备注
cp.save_button().click() #点击确定
sleep(3)
assert u'xinzeng' in driver.page_source #断言xinzeng 是否添加完成
sleep(2)
print('添加联系人完成')
driver.quit() #退出
总结
引用配置文件后我们已经完成了3个页面的改造,这样就实现了页面元素表达式和代码 完全分离(初步框架),即使页面元素有大的变动,我们只要修改配置文件的元素表达式,大大减少了维护成本。但我们还没有实现测试数据和代码完全分离,下一篇我们继续。