以下实例演示了采用了page Object设计模式的方式登录qq空间:

1、创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(timeout)等

2、创建LoginPage类:Page类中定义的方法是页面操作的基本方法,后面根据登录页面特点创建LoaginPage类并继承Page,这就是page Object设计模式中的对象层

3、创建test_user_login()函数:创建test_user_login()函数将单个元素操作组成一个完整动作,这个动作包含打开浏览器、输入账号密码、登录等操作

4、创建main()函数:main()函数更接近用户操作行为,用户操作只需要关系是那个浏览器打开打开网址,登录的用户名和密码是什么,不会关系是如何去定位输入框的

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep class Page(object):
"""基础类,用于所以页面对象类继承"""
login_url = 'https://i.qq.com'
def __init__(self, selenium_driver, base_url=login_url):
self.base_url = base_url
self.driver = selenium_driver
self.timeout = 30
def on_page(self):
return self.driver.current_url == (self.base_url + self.url)
def _open(self,url):
url = self.base_url+url
self.driver.get(url)
assert self.on_page(),'did not land on %s' % url def open(self):
self._open(self.url) def find_element(self, *loc):
return self.driver.find_element(*loc) class LoginPage(Page): """登录页面模型""" url = '/'
# 定位器
username_loc = (By.ID, 'u')
password_loc = (By.ID, 'p')
submit_loc = (By.ID, 'login_button') def type_username(self, username):
self.find_element(*self.username_loc).send_keys(username) def type_password(self, password):
self.find_element(*self.password_loc).send_keys(password) def type_submit(self):
self.find_element(*self.submit_loc).click() def test_user_login(driver, username, password):
"""测试获取的用户名、密码是否可以登录成功"""
login_page = LoginPage(driver)
login_page.open()
driver.maximize_window()
driver.switch_to_frame('login_frame')
driver.find_element_by_id("switcher_plogin").click()
login_page.type_username(username)
login_page.type_password(password)
login_page.type_submit() def main():
try:
driver = webdriver.Firefox()
username = 'qq号' #调试的时候需要换成对应的QQ号
password = 'qq密码' #需要换成对应的密码
test_user_login(driver, username, password)
sleep(3)
# 断言的方式判断登录是否成功
try:
assert '对应空间的title' in driver.title #调试时候title要换
print ('successful')
except Exception as e :
print ('failed') finally:
driver.close() if __name__ == '__main__':
main()

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

最新文章

  1. JDI tutorial (trace example)
  2. HTML5移动Web开发(十)——在浏览器中启动手机原生应用
  3. 让微信扫描直接下载你的APK
  4. [原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo
  5. BZOJ 1009 GT考试(ac自动机+矩阵DP)
  6. SPOJ 7259 Light Switching (水题,区间01取反)
  7. 从零开始,在windows上用nodejs搭建一个静态文件服务器
  8. nginx和tomcat的响应时间
  9. asp.net 跨页面传值常用方法
  10. svn问题(队列)
  11. visual SVN 反编译破解
  12. 201521123119《Java程序设计》第10周学习总结
  13. jenkins构建基于gradle的springboot项目CI采坑(采用jar方式部署)
  14. c# word interop encrypt with password protect with password
  15. CTFcrackTools-V3 - 一款旨在帮助 CTFer 在 CTF 中发挥作用的一个框架
  16. Azure vm 扩展脚本自动部署Elasticsearch集群
  17. SQL操作查漏补缺
  18. VS2017 IDE开发工具选型、安装和使用
  19. Linux便捷命令
  20. angularJs购物金额实例操作

热门文章

  1. C#中的异步调用及异步设计模式(一)
  2. 【重要】拷贝NIOS II工程后,修改工程前必须要做的10件事
  3. [VSTO] warning CS0467 解决方案
  4. TCP中的seq
  5. C#多线程学习(五) 多线程的自动管理(定时器)
  6. Oracle彻底卸载
  7. C++的可移植性和跨平台开发
  8. Mysql 索引原理《一》索引原理与慢查询1
  9. D. Magic Box(几何)
  10. “全栈2019”Java第六十三章:接口与抽象方法详解