python selenium2示例 - Page Object Model

前言

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

原文发布于微信公众号 - 开源优测(DeepTest)

原文发表时间:2017-03-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏晨星先生的自留地

从协议提取到多功能RDP识别脚本

38980
来自专栏分布式系统和大数据处理

C#编写简单的聊天程序

这是一篇基于Socket进行网络编程的入门文章,我对于网络编程的学习并不够深入,这篇文章是对于自己知识的一个巩固,同时希望能为初学的朋友提供一点参考。文章大体分...

19220
来自专栏逸鹏说道

MVCforum 支持多国语言

MVCforum支持多国语言。要创建一个更新的语言,你需要去您的管理面板 /admin/ adminlanguage 在这里,您可以添加新的语言键和关联的值。或...

29740
来自专栏ShaoYL

iOS逆向实战与工具使用(微信添加好友自动确认)

62460
来自专栏腾讯Bugly的专栏

移动App入侵与逆向破解技术-iOS篇

如果您有耐心看完这篇文章,您将懂得如何着手进行app的分析、追踪、注入等实用的破解技术,另外,通过“入侵”,将帮助您理解如何规避常见的安全漏洞,文章大纲: 简单...

3.3K60
来自专栏ShaoYL

iOS逆向实战与工具使用(微信添加好友自动确认)

49480
来自专栏前端萌媛的成长之路

spa

31150
来自专栏极客猴

多线程爬取 unsplash 图库

我公众号文章的封面配图都在 Unsplash 上找的。因为 Unsplash 是一个完全免费的、无版权的高清图片资源网站。

28830
来自专栏技术墨客

Ubuntu修改分辨率 转

通常情况下,图形界面的发行版 linux 可以在 Setting->Device->Display 中直接设置多个屏幕的分辨率。但是坑总是无处不在的,有时候明明...

2K40
来自专栏macOS 开发学习

macOS 应用注入开发简介与实践

本文主要介绍的是动态链接库注入的相关实践,这不仅仅局限于macOS,同时对iOS应用也具有相同的效果,希望大家可以借鉴使用.

21730

扫码关注云+社区

领取腾讯云代金券