前言
python selenium2是当前主流的web自动化测试框架,提供了多浏览器的支持(chrome、ie、firefox、safari等等),同时支持多种编程语言来写用例(python、ruby、java等等),非常容易上手,但当大家在深入应用时,会发现随着代码量的增加,感觉整个用例测试代码的维护会会越来越庞大,例如:
如上代码在随着进一步新增测试用例的情况会有以下几个问题:
1、易读性,一连串的find element会显得杂乱无章
2、可扩展不好:用例孤立,难以扩展
3、可复用性:无公共方法,很那复用
4、可维护性:一旦页面元素变化,需要维护修改大量的用例
Page模式
基于上述问题,我们采用自动化测试的一种设计模式来进行一定层面的解决,这就是Page模式。什么是Page模式呢?它大概应该长成这样子,如图所示:
Page模式的核心要素:
1、抽象封装一个BasePage基类,基类应该拥有一个指向webdriver实例的属性
2、每一个Page都应该继承BasePage,并通过driver来管理本Page的元素,且将Page才操作都封装成一个个的方法
3、TestCase应该继成unittest.Testcase类,并依赖相应的Page类来实现相应的test step(即测试步骤)
BasePage代码示例如下:
# BaePage
class BasePage(object):
def __init__(self, driver):
self.driver = driver
登录Page代码示例如下:
class LoginPage(BasePage):
# 登录pange元素维护
username = (By.ID, "username")
password = (By.ID, "pass")
login_btn = (By.ID, "loginBtn")
def set_username(self, username): # 输入用户名
name= self.driver.find_element(*LoginPage.usename)
name.send_keys(username)
def set_password(self, password): # 输入密码
pwd= self.driver.find_element(*LoginPage.password)
pwd.send_keys(password)
def click_login(self): # 单击登录
loginbtn= self.driver.find_element(*LoginPage.login_btn)
loginbtn.click()
TestCase代码示例如下:
class Test_Login(unittest.TestCase):
#Setup 初始化
def setUp(self):
self.driver = webdriver.Chrome(r'C:\\chromedriver.exe')
self.driver.implicitly_wait(30)
self.base_url = "http://127.0.0.1:9000/"
#tearDown 清理
def tearDown(self):
self.driver.close()
def test_Login(self):
#Step1: 打开登录页
self.driver.get(self.base_url)
#Step2: 初始化登录Page
login_page = BasePage.LoginPage(self.driver)
#Step3: 输入用户名
login_page.set_username("admin")
#Step4: 输入密码
login_page.set_password("passwd")
#Step5: 单击登录按钮
login_page.click_login()
主运行程序代码:
if__name__=="__main__":
unittest.main()
至此整个Page模式演示就完成了。再来回顾下上述两种方式的代码组织,是不是Page模式的魅力更大?
结束语
Page模式给我们提供了一种很好的设计模式,实现了用例和页面的分离,降低了耦合,提高了内聚,为后续更大规模的应用python selenium2进行自动化测试提供了坚实的基础。