查看原文
其他

python selenium2示例 - Page Object Model

苦叶子 开源优测 2022-11-13


前言

python selenium2是当前主流的web自动化测试框架,提供了多浏览器的支持(chrome、ie、firefox、safari等等),同时支持多种编程语言来写用例(python、ruby、java等等),非常容易上手,但当大家在深入应用时,会发现随着代码量的增加,感觉整个用例测试代码的维护会会越来越庞大,例如:


如上代码在随着进一步新增测试用例的情况会有以下几个问题:

1、易读性,一连串的find element会显得杂乱无章

2、可扩展不好:用例孤立,难以扩展

3、可复用性:无公共方法,很那复用

4、可维护性:一旦页面元素变化,需要维护修改大量的用例


Page模式

基于上述问题,我们采用自动化测试的一种设计模式来进行一定层面的解决,这就是Page模式。什么是Page模式呢?它大概应该长成这样子,如图所示:

POM


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进行自动化测试提供了坚实的基础。


Hello,伙伴们长按二维码关注我们吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存