十一 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()

 

posted on 2020-03-22 18:06  rwwh  阅读(182)  评论(0)    收藏  举报

导航