Selenium是当前主流的web自动化工具,提供了多种浏览器的支持(Chrome,Firefox, IE等等),当然大家也可以用自己喜欢的语言(Java,C#,Python等)来写用例,很容易上手。当大家写完第一个自动化用例的时候肯定感觉”哇...好牛x“,但是大家用余光扫了一下代码后,内心也许是崩溃的,因为太乱了!像这样:
__author__ = 'xua'from selenium import webdriver from selenium.webdriver.common.keys import Keys import unittestclass TCRepeatLogin(unittest.TestCase):def setUp(self):#webdriverself.driver = webdriver.Chrome(r'C:\Users\xua\Downloads\chromedriver_win32\chromedriver.exe')self.driver.implicitly_wait(30)self.base_url = "http://10.222.30.145:9000/"def test_(self):driver = self.driverdriver.get(self.base_url)#enter username and passworddriver.find_element_by_id("username").clear()driver.find_element_by_id("username").send_keys("sbxadmin")driver.find_element_by_id("password").clear()driver.find_element_by_id("password").send_keys("IGTtest1"+Keys.RETURN)#find dialog and checkdialogTitle = driver.find_element(By.XPATH,'//html/body/div[7]/div/div/div[1]/h3')self.assertEqual("Sign in",dialogTitle.text)#find cancel button and clickcancelBtn = driver.find_element(By.XPATH,'//html/body/div[7]/div/div/div[3]/button[2]')cancelBtn.click()def tearDown(self):self.driver.close()if __name__ == "__main__":unittest.main()
从几点来分析下上边的代码:
1. 易读性:非常难理解。这么多find element?这难道也是test case?
2. 可扩展性:都是一个个孤立的test case,无扩展性可言
3. 可复用性:无公共方法,很难提到复用
4. 可维护性:一旦页面元素修改,则需要相应修改所有相关用例,effort大
基于以上的问题,Python为我们提供了Page模式来管理测试,它大概是这样子的:(TestCase中的虚线箭头应该是指向各个page,家里电脑没装修改软件,就不改了:))
关于Page模式:
1. 抽象出来一个BasePage基类,它包含一个指向Selenium.webdriver的属性
2. 每一个webpage都继承自BasePage基类,通过driver来获取本页面的元素,每个页面的操作都抽象为一个个方法
3. TestCase继承自unittest.Testcase类,并依赖相应的Page类来实现相应的test case步骤
利用Page模式实现上边的用例,代码如下:
BasePage.py:
__author__ = 'xua'from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys#super class class BasePage(object):def __init__(self, driver):self.driver = driverclass LoginPage(BasePage):#page element identifierusename = (By.ID,'username')password = (By.ID, 'password')dialogTitle = (By.XPATH,'//html/body/div[7]/div/div/div[1]/h3')cancelButton = (By.XPATH,'//html/body/div[7]/div/div/div[3]/button[2]')#Get username textbox and input usernamedef set_username(self,username):name = self.driver.find_element(*LoginPage.usename)name.send_keys(username)#Get password textbox and input password, then hit returndef set_password(self, password):pwd = self.driver.find_element(*LoginPage.password)pwd.send_keys(password + Keys.RETURN)#Get pop up dialog titledef get_DiaglogTitle(self):digTitle = self.driver.find_element(*LoginPage.dialogTitle)return digTitle.text#Get "cancel" button and then clickdef click_cancel(self):cancelbtn = self.driver.find_element(*LoginPage.cancelButton)cancelbtn.click()
Test_Login.py:
__author__ = 'xua'from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.alert import Alert import unittest import time import BasePageclass Test_Login(unittest.TestCase):#Setupdef setUp(self):self.driver = webdriver.Chrome(r'C:\Users\xua\Downloads\chromedriver_win32\chromedriver.exe')self.driver.implicitly_wait(30)self.base_url = "http://10.222.30.145:9000/"#tearDowndef tearDown(self):self.driver.close()def test_Login(self):#Step1: open base siteself.driver.get(self.base_url)#Step2: Open Login pagelogin_page = BasePage.LoginPage(self.driver)#Step3: Enter usernamelogin_page.set_username("sbXadmin")#Step4: Enter passwordlogin_page.set_password("IGTtest1")#Checkpoint1: Check popup dialog titleself.assertEqual(login_page.get_DiaglogTitle(),"Sign in")#Step5: Cancel dialoglogin_page.click_cancel()if __name__ == "__main__":unittest.main()
Ok, 那么我们回头来看,Page模式是否解决了上边的四个方面的问题:
1. 易读性: 现在单看test_login方法,确实有点test case的样子了,每一步都很明了
2. 可扩展性:由于把每个page的元素操作都集成到一个page类中,所以增删改查都和方便
3. 可复用性: page的基本操作都变成了一个个的方法,在不同的test case中可以重复使用
4. 可维护性:如果页面修改,只需修改相应page类中的方法即可,无需修改每个test case
总结:
Page模式给我们提供了一个很好的页面和用例实现的分离机制,降低了耦合,提高了内聚,可以使我们在web自动化中做到游刃有余。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】