十一 selenium之设计模式与数据驱动
一 Page Object Model(POM模式)

Page Object是Selenium的一种测试设计模式,主要将每个页面看作是一个class.class的内容主要包括属性和方法,属性就是这个页面中的元素对象.比如输入用户名的输入框,登录按钮等.而方法主要是指对这些元素的操作(即对这些元素执行操作的页面方法),如用户名的输入框可以用来 输入.
POM的优势:
①POM提供了一种在UI层操作,业务流程与验证分离的模式,这使得测试代码变得更加清晰和高可读性.
②对象库与用例分离,使得我们更好的复用对象,甚至能与不同的工具进行深度结合应用.
③可复用的页面方法,代码会变得更加优化.
④更加有效的命名方式使得我们更加清晰的知道所操作的UI元素.例如我们要返回首页,方法名命名为gotoHomePage(),通过方法名即可清晰的知道具体的功能实现.
POM实现示例:

# basePage.py代码如下 # _*_ coding:utf-8 _*_ __author__ = '苦叶子' import sys reload(sys) sys.setdefaultencoding("utf-8") # pages基类 class Page(object): """ Page基类,所有page都应该继承该类 """ def __init__(self, driver, base_url=u"http://www.baidu.com"): self.driver = driver self.base_url = base_url self.timeout = 30 def find_element(self, *loc): return self.driver.find_element(*loc) def input_text(self, loc, text): self.find_element(*loc).send_keys(text) def click(self, loc): self.find_element(*loc).click() def get_title(self): return self.driver.title # searchPage.py 代码如下 # _*_ coding:utf-8 _*_ __author__ = '苦叶子' import sys from selenium.webdriver.common.by import By from pages.basePage import Page reload(sys) sys.setdefaultencoding("utf-8") # 百度搜索page class SearchPage(Page): # 元素集 # 搜索输入框 search_input = (By.ID, u'kw') # 百度一下 按钮 search_button = (By.ID, u'su') def __init__(self, driver, base_url=u"http://www.baidu.com"): Page.__init__(self, driver, base_url) def gotoBaiduHomePage(self): print u"打开首页: ", self.base_url self.driver.get(self.base_url) def input_search_text(self, text=u"开源优测"): print u"输入搜索关键字: 开源优测 " self.input_text(self.search_input, text) def click_search_btn(self): print u"点击 百度一下 按钮" self.click(self.search_button) # testSearchPage.py代码如下 # _*_ coding:utf-8 _*_ __author__ = '苦叶子' import unittest import sys from selenium import webdriver from pages.searchPage import SearchPage reload(sys) sys.setdefaultencoding("utf-8") # 百度搜索测试 class TestSearchPage(unittest.TestCase): def setUp(self): self.driver = webdriver.Ie() def testSearch(self): driver = self.driver # 百度网址 url = u"http://www.baidu.com" # 搜索文本 text = u"开源优测" # 期望验证的标题 assert_title = u"开源优测_百度搜索" print assert_title search_Page = SearchPage(driver, url) # 启动浏览器,访问百度首页 search_Page.gotoBaiduHomePage() # 输入 搜索词 search_Page.input_search_text(text) # 单击 百度一下 按钮进行搜索 search_Page.click_search_btn() # 验证标题 self.assertEqual(search_Page.get_title(), assert_title) def tearDown(self): self.driver.quit() # 主入口程序代码如下 # _*_ coding:utf-8 _*_ __author__ = '苦叶子' import unittest import sys from common import HTMLTestRunner from testcase.testSearchPage import TestSearchPage reload(sys) sys.setdefaultencoding("utf-8") if __name__ == '__main__': testunit = unittest.TestSuite() testunit.addTest(TestSearchPage('testSearch')) # 定义报告输出路径 htmlPath = u"page_demo_Report.html" fp = file(htmlPath, "wb") runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"百度测试", description=u"测试用例结果") runner.run(testunit) fp.close()
Python PageFactory-使用配置文件动态生成页面PageObject:https://www.jianshu.com/p/3d8150d1ff4c
二 数据驱动
import unittest from selenium import webdriver from ddt import ddt, data, unpack from time import sleep @ddt class developTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.driver.maximize_window() self.driver.get("https://www.baidu.com") @data(('', '', u'请您输入手机/邮箱/用户名'), ('admin', '', u'请您输入密码'), ('admin', 'admin', u'帐号或密码错误,请重新输入或者找回密码')) @unpack def testlogin(self, sendValue1, sendValue2, expected): self.driver.find_element_by_link_text(u'登录').click() sleep(2) self.driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn').click() # 输入百度账号 userName = self.driver.find_element_by_id('TANGRAM__PSP_10__userName') userName.clear() userName.send_keys(sendValue1) password = self.driver.find_element_by_id('TANGRAM__PSP_10__password') password.clear() password.send_keys(sendValue2) self.driver.find_element_by_id('TANGRAM__PSP_10__submit').click() # 获取返回的错误信息 errorText = self.driver.find_element_by_id('TANGRAM__PSP_10__error').text self.assertTrue(errorText, expected) def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()
浙公网安备 33010602011771号