selenium +python之Page Obiect设计模式

PageObject是selenium自动化测试项目开发实践的最佳设计模式之一,它主要体现对界面交互细节的封装,这样可以使测试案例更关注于业务而非界面细节,从而提高测试案例的可读性。

1.认识PageObject

PageObject设计模式的优点如下:

*减少代码的重复

*提高测试用例的可读性

*提高测试用例的可维护性,特别针对UI频繁变动的项目。

当为web页面编写测试是,需要操作该web页面上的元素。然而,如果在测试代码中直接操作HTML元素,代码是及其脆弱的,因为ui的变动性会很大。我们可以将page对象封装成一个HTML页面,然后通过提供应用程序特定的API来操作页面元素。而不是在HTML中来定位。

page对象的一个基本经验法则是:凡是人能够做的事,page对象通过软件客户端都能够做到。因此,他应该提供一个易于编程的接口并隐藏窗口底层的部件。所以访问一个文本框应该通过一个访问方法(accessor method)来实现字符串的获取与返回,复选框应当使用布尔值,按钮应当被表示为行为导向的方法名。page对象应当将在GUI控件上所有查询和操作数据的行为封装为方法

一个好的经验法则是:即使改变具体的控件,page对象的接口也不应当发生改变

尽管该术语是:“页面”对象,但是并不意味着需要针对每个页面建立一个这样的对象。例如:页面有重要意义的元素可以独立为一个page对象。经验法则的目的是通过给页面建模,时期对应用程序的使用者变得更有意义。

 1 from selenium import webdriver
 2 from selenium.webdriver.common.by import By
 3 from time import sleep
 4
 5
 6 class Page(object):
 7     """
 8     基础类,用于页面对象类的继承
 9     """
10     login_url = ‘http://mail.163.com/‘
11
12     def __init__(self, selenium_driver, base_url=login_url):
13         self.base_url = base_url
14         self.driver = selenium_driver
15         self.timeout = 30
16
17     def on_page(self):
18         return self.driver.current_url == (self.base_url + self.url)
19
20     def _open(self, url):
21         url = self.base_url + url
22         self.driver.get(url)
23         assert self.on_page(), ‘Did not land on %s‘ % url
24
25     def open(self):
26         self._open(self.url)
27
28     def find_element(self, *loc):
29         return self.driver.find_element(*loc)
30
31
32 class LoginPage(Page):
33     """
34     126邮箱登陆页面模型
35     """
36     url = ‘/‘
37     # 定位器
38     username_loc = (By.ID, "idInput")
39     password_loc = (By.ID, "pwdInput")
40     submit_loc = (By.ID, "loginBtn")
41
42     # Action
43     def type_username(self, username):
44         self.find_element(*self.username_loc).send_keys(username)
45
46     def type_password(self, password):
47         self.find_element(*self.password_loc).send_keys(password)
48
49     def submit(self):
50         self.find_element(*self.submit_loc).click()
51
52
53 def test_user_login(driver, username, password):
54     """
55      测试获取的用户名/密码是否可以登陆
56      """
57     login_page = LoginPage(driver)
58     login_page.open()
59     login_page.type_username(username)
60     login_page.type_password(password)
61     login_page.submit()
62
63
64 def main():
65     try:
66         driver = webdriver.Chrome()
67         username = ‘[email protected]‘
68         password = ‘********‘
69         test_user_login(driver, username, password)
70         sleep(3)
71         text = driver.find_element_by_xpath("//span[@id = ‘spnUid‘]").text
72         assert (text == ‘[email protected]‘), "用户名称不匹配,登陆失败!"
73     finally:
74         # 关闭浏览器窗口
75         driver.close()
76
77
78 if __name__ == ‘__main__‘:
79     main()

 代码解释如下:

1、创建page类

 1 class Page(object):
 2     """
 3     基础类,用于页面对象类的继承
 4     """
 5     login_url = ‘http://mail.163.com/‘
 6
 7     def __init__(self, selenium_driver, base_url=login_url):
 8         self.base_url = base_url
 9         self.driver = selenium_driver
10         self.timeout = 30
11
12     def on_page(self):
13         return self.driver.current_url == (self.base_url + self.url)
14
15     def _open(self, url):
16         url = self.base_url + url
17         self.driver.get(url)
18         assert self.on_page(), ‘Did not land on %s‘ % url
19
20     def open(self):
21         self._open(self.url)
22
23     def find_element(self, *loc):
24         return self.driver.find_element(*loc)首先创建一个基础类Page,在初始化方法__init__()中定义驱动(driver),基本的URL(base_url)和超时时间(timeout)等,定义open()方法用于打开URL网站,但是它本身并未做这件事情,而是交由_open()方法来实现。关于Url地址的断言部分,则交由on_page()方法来实现,而find_element()方法用于元素的定位。

2.创建LoginPage类

Page类中定义的这些方法都是页面操作的基本方法。下面根据登陆页的特点再创建LoginPage类并继承page类,这也是page object设计模式中最重要的对象层。

 1 class LoginPage(Page):
 2     """
 3     126邮箱登陆页面模型
 4     """
 5     url = ‘/‘
 6     # 定位器
 7     username_loc = (By.ID, "idInput")
 8     password_loc = (By.ID, "pwdInput")
 9     submit_loc = (By.ID, "loginBtn")
10
11     # Action
12     def type_username(self, username):
13         self.find_element(*self.username_loc).send_keys(username)
14
15     def type_password(self, password):
16         self.find_element(*self.password_loc).send_keys(password)
17
18     def submit(self):
19         self.find_element(*self.submit_loc).click()LoginPage类中主要对登陆页面上的元素进行封装,使其成为更具体的操作方法。例如,用户名,密码和登陆按钮都被封装成了方法。

3.创建test_user_login()函数

1 def test_user_login(driver, username, password):
2     """
3      测试获取的用户名/密码是否可以登陆
4      """
5     login_page = LoginPage(driver)
6     login_page.open()
7     login_page.type_username(username)
8     login_page.type_password(password)
9     login_page.submit()

test_user_login()函数将单个的元素操作组成一个完整的动作,而这个动作包含了打开浏览器,输入用户名/密码,点击登陆等单步操作。在使用该函数时需要将driver,username、password等信息作为函数的入参,这样该函数具有很强的可重用性。

4.创建main()函数

 1 def main():
 2     try:
 3         driver = webdriver.Chrome()
 4         username = ‘[email protected]‘
 5         password = ‘********‘
 6         test_user_login(driver, username, password)
 7         sleep(3)
 8         text = driver.find_element_by_xpath("//span[@id = ‘spnUid‘]").text
 9         assert (text == ‘[email protected]‘), "用户名称不匹配,登陆失败!"
10     finally:
11         # 关闭浏览器窗口
12         driver.close()
13
14
15 if __name__ == ‘__main__‘:
16     main()

main()函数更接近于用户的操作行为,对用户来说,要进行邮箱登陆,需要关心的就是通过哪个浏览器打开邮箱网址,登陆的用户名和密码是什么,至于输入框,按钮时如何定位的,则不需要关心。

这样分层的好处是,不同的层关心不同的问题。页面对象层只关心元素定位的问题,测试用例只关心测试数据。

一个有分歧的地方是page对象是否应自身包含断言,或者仅仅提供数据给测试脚本来设置断言。在page对象中包含断言的倡导者认为,这又助于避免在测试脚本中出现重复的断言,可以更容易的提供更好的错误信息,并且提供更接近只做不问风格的API。不在page对象中包含断言的倡导者认为,包含断言会混合访问页面数据和实现断言逻辑的职责,并且导致page对象过于臃肿。

在page对象中不包含断言,虽然我们可以通过为常用的断言提供断言库的方式来消除重复,提供更好的诊断,但从用户的角度去自动化的观点来看,判断是否登陆成功是用户需要做的事情,不该交由页面对象层来完成。

使用page object模式之后的另外一个好处就是有助于降低冗余。如果需要在10个用例中输入不同的用户名/密码登陆,那么main()方法竟会变得非常简洁。

原文地址:https://www.cnblogs.com/xiaohuhu/p/9339168.html

时间: 2024-08-28 19:33:12

selenium +python之Page Obiect设计模式的相关文章

Page Object Model (Selenium, Python)

时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 SeleniumPython We have come a long way since our post on implementing the Page Object Model - Implementing the Page Object Model (Selenium + Python) Whil

selenium+python面试题目总结

1. WebDriver原理 webDriver是按照client/server模式设计,client就是我们的测试代码,发送请求,server就是打开的浏览器来打开client发出的请求并做出响应. 具体的工作流程: ·webdriver打开浏览器并绑定到指定端口.启动的浏览器作为remote server. ·client通过commandExecuter发送httpRequest给remote server的的侦听端口(the      webdriver wire control通信协议

selenium+python

原文链接: http://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html 1.起因:在网页抓取的过程中,有些内容是通过js加载的,但是直接抓取是抓取不到的 2.selenium+python 映入眼帘 3.selenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium ,相因为它相比QTP有诸多有点: *  免费,也不用再为破解QTP而大伤脑筋 *  小巧,对于不同的语言它只是一个包而已,而QTP需要下载

<译>Selenium Python Bindings 3 - Navigating

当你想要通过webdriver导航到一个链接,正常的方式点是通过调用get方法: driver.get("http://www.google.com") Interacting with the page在页面中的HTML元素.如果我们需要找到定位一个.那么webdriver提供了许多方法来寻找元素.例如给了一个HTML的标签: <input type="text" name="passwd" id="passwd-id"

13、Selenium+python+API分类总结

Selenium+python+API分类总结 http://selenium-python.readthedocs.org/index.html 分类 方法 方法描述 客户端操作 __init__(self, host, port, browserStartCommand, browserURL) 构造函数.host:selenium server的ip:port:elenium server的port,默认为4444:browserStartCommand:浏览器类型,iexplore,fi

Page Object设计模式实践

Page Object模式是使用Selenium的广大同行最为公认的一种设计模式.在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织. Page Object模式,创建一个对象来对应页面的一个应用.故我们可以为每个页面定义一个类,并为每个页面的属性和操作构建模型.体现在对界面交互细节的封装,测试在更上层使用页面对象,在底层的属性或者操作的更改不会中断测试.减少代码重复,提高测试代码的可读性和可维护性. 下面将以登录qq邮箱为例,通过Page Object设计模式来实现.

Page Object 设计模式介绍

Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,Page Object 的主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案例的可读性. 1.认识 Paget Object Page Object 设计模式的优点如下: 减少代码的重复: 提高测试用例的可读性: 提高测试用例的可维护性,特别是针对 UI 频繁变化的项目: Paget Object 使用注意: public方法代表Page提供的功能 尽量不要暴露Page的内

selenium+python在mac环境上的搭建

前言 mac自带了python2.7的环境,所以在mac上安装selenium环境是非常简单的,输入2个指令就能安装好 需要安装的软件: 1.pip 2.selenium2.53.6 3.Firefox44.dmg 4.Pycharm (环境搭配selenium2+Firefox46及以下版本兼容,selenium3+Firefox47+geckodriver) 一.selenium安装 1.mac自带了python2.7,python里面又自带了easy_install工具,所以安装pip用e

python爬虫积累(一)--------selenium+python+PhantomJS的使用

最近按公司要求,爬取相关网站时,发现没有找到js包的地址,我就采用selenium来爬取信息,相关实战链接:python爬虫实战(一)--------中国作物种质信息网 一.Selenium介绍 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试.换句话说叫 Selenium 支持这些浏览器驱动.Selenium支持