Selenium是当前主流的web自动化工具,提供了多种浏览器的支持(Chrome,Firefox, IE等等),当然大家也可以用自己喜欢的语言(Java,C#,Python等)来写用例,很容易上手。当大家写完第一个自动化用例的时候肯定感觉”哇...好牛x“,但是大家用余光扫了一下代码后,内心也许是崩溃的,因为太乱了!像这样:
__author__ = 'xua' from selenium import webdriver from selenium.webdriver.common.keys import Keys import unittest class TCRepeatLogin(unittest.TestCase): def setUp(self): #webdriver 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/" def test_(self): driver = self.driver driver.get(self.base_url) #enter username and password driver.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 check dialogTitle = driver.find_element(By.XPATH,'//html/body/div[7]/div/div/div[1]/h3') self.assertEqual("Sign in",dialogTitle.text) #find cancel button and click cancelBtn = 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 = driver class LoginPage(BasePage): #page element identifier usename = (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 username def set_username(self,username): name = self.driver.find_element(*LoginPage.usename) name.send_keys(username) #Get password textbox and input password, then hit return def set_password(self, password): pwd = self.driver.find_element(*LoginPage.password) pwd.send_keys(password + Keys.RETURN) #Get pop up dialog title def get_DiaglogTitle(self): digTitle = self.driver.find_element(*LoginPage.dialogTitle) return digTitle.text #Get "cancel" button and then click def 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 BasePage class Test_Login(unittest.TestCase): #Setup def 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/" #tearDown def tearDown(self): self.driver.close() def test_Login(self): #Step1: open base site self.driver.get(self.base_url) #Step2: Open Login page login_page = BasePage.LoginPage(self.driver) #Step3: Enter username login_page.set_username("sbXadmin") #Step4: Enter password login_page.set_password("IGTtest1") #Checkpoint1: Check popup dialog title self.assertEqual(login_page.get_DiaglogTitle(),"Sign in") #Step5: Cancel dialog login_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自动化中做到游刃有余。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]