selenium+Page Objects(第二话)
前面介绍了什么是po模式,并且简单分析了一下使用po模式编写脚本的思路,接下来开始正式编写
1.先编写一个页面基类BasePage.py,里面封装每个页面常用的一些方法
# coding: utf-8
# author: hmk
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException class BasePage(object): # 如果没有明确要继承的类,默认继承object,当然这里留空也行
"""基类封装其他页面都会用到的方法""" base_url = 'http://localhost/UnifiedReporting/bid/caption?' def __init__(self, driver):
self.driver = driver # 构造器中定义一个driver驱动,后续所有操作都引用这个driver,保持前后driver一致性 def open(self, url):
"""定义打开url方法"""
url = self.base_url + url
self.driver.get(url)
self.driver.maximize_window() def find_element(self, *locator):
"""定位页面元素位置的方法"""
try:
# element = WebDriverWait(self.driver, 30).until(lambda x: x.find_element(*locator)) # 这个方法我没有成功,总是定位不到元素
element = WebDriverWait(self.driver, 30).until(EC.presence_of_element_located(locator))
return element # 返回页面元素的位置对象 # 类型是<class 'selenium.webdriver.remote.webelement.WebElement'>
except NoSuchElementException:
print("%s 页面中未能找到 %s 元素" % (self, locator)) def switch_frame(self, loctor):
"""切换iframe表单"""
return self.driver.switch_to_frame(loctor) def script(self, src):
"""执行js脚本"""
self.driver.execute_script(src) def send_keys(self, locator, value, clear_first=True):
"""封装send_keys()方法"""
try:
# locator = getattr(self, "_%s"% locator)
if clear_first:
self.find_element(*locator).clear() # 判断是否需要清除输入框信息
self.find_element(*locator).send_keys(value)
except AttributeError:
print("%s 页面中未找到 %s 元素" % (self, locator)) def click(self, locator):
"""封装click()方法"""
self.find_element(*locator).click() def get_current_url(self):
"""获取当前页面url"""
return self.driver.current_url def get_url_title(self):
"""获取当前页面title"""
return self.driver.title
注释写得也比较详细,不过多赘述了,后续需要其他操作的话,也可以继续添加进来
2.编写locators文件,把每个页面中的元素位置都事先定义好
# coding: utf-8
# author: hmk from selenium.webdriver.common.by import By class Locators(object):
"""元素定位器"""
first_page_locators = {
"agree_button": (By.ID, "btn_argee"),
"disagree_button": (By.XPATH, "//a[@aria-label='不同意']")
}
second_page_locators = {
"handle": (By.ID, "start_handle"),
"back": (By.XPATH, "//a[text()='上一步']")
}
third_page_locators = {
"custName": (By.NAME, "custName"), # 企业名称
"custAddr": (By.NAME, "custAddr"), # 企业地址
"custLegalMan": (By.NAME, "custLegalMan"), # 法定代表人
"custCerId": (By.NAME, "custCerId"), # 法定代表人证件
"custContactPerson": (By.NAME, "custContactPerson"), # 经办人姓名
"custCardId": (By.NAME, "custCardId"), # 经办人证件
"nextstep": (By.ID, "basicinfo_next_btn"), # 下一步
"backstep": (By.XPATH, "//a[text()='上一步']") # 上一步
}
fourth_page_locators = {
"upload_button1": (By.XPATH, ".//*[@id='uploadAttachList_body']/tr[1]/td[5]/a"), # 材料列表第一个材料的上传按钮
"upload_true": (By.CSS_SELECTOR, "#i_select_files>input"), # 去掉上传隐藏属性后的真实上传按钮
"upload_t": (By.XPATH, "//div[@class='layui-layer-content']//a[@aria-label='本地上传']"), # 必须双斜杠
"confirm": (By.XPATH, "//div[@class='layui-layer-content']//a[text()='确定']"), # 上传弹窗的确定按钮
"nextstep": (By.ID, "upload_next_btn"), # 下一步按钮
"backstep": (By.CLASS_NAME, "btn") # 上一步按钮
} if __name__ == "__main__":
t = Locators()
print(t.first_page_locators["agree_button"])
这里简单地把所有页面中用到的元素都写在了这里面,每个页面各自以字典形式存放元素,当然也可以拆分为几个文件分别存放,后面元素位置发生变化,可以在这里修改
2018-05-11 11:54:42
selenium+Page Objects(第二话)的更多相关文章
- selenium+Page Objects(第三话)
写好BasePage基类和页面元素定位后,就可以针对每个页面写业务逻辑了 1.编写每个页面page类,拿其中一个页面为例 fourth_page.py(名字我随便取的,实际中希望能取一些有意义的名字) ...
- selenium+Page Objects(第一话)
简单介绍一种selenium用来做web自动化测试的设计模式:Page Objects 一.Page Objects介绍 用官话说它是selenium中的一种页面对象设计模式(不是测试框架!是一种开展 ...
- Selenium - WebDriver: Page Objects
This chapter is a tutorial introduction to page objects design pattern. A page object represents an ...
- 通过Java + selenium +testNG + Page Objects 设计模式 实现页面UI的自动化
Page Objects 设计模式 简单的讲,类似与Java面向对象编程,把每个页面都抽象为一个对象类,将页面元素的定位.业务逻辑操作分离开,然后我们可以通过testNG实现业务流程的控制 与 测试 ...
- 移动UI自动化-Page Objects Pattern
移动UI自动化,看起来美好,践行起来却难.做个目光短见的务实主义者.Page Objects Pattern是Selenium官方推崇的方式,最近研究写测试用例最佳实践之Page Objects,同时 ...
- [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式
写在最前面 这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得.这几年,做了一些自动化测试框架以及团队的构建的工作.过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的 ...
- Page Objects
Page Objects 原文地址:https://github.com/SeleniumHQ/selenium/wiki/PageObjects Within your web app's UI t ...
- selenium webdriver (python) 第二版
前言 对于大多软件测试人员来讲缺乏编程经验(指项目开发经验,大学的C 语言算很基础的编程知识)一直是难以逾越的鸿沟,并不是说测试比开发人员智商低,是国内的大多测试岗位是功能测试为主,在工作时间中,我们 ...
- [Protractor] Testing With Protractor Page Objects
Protractor Page Objects are a recommended for testing your AngularJS applications. Page Objects abst ...
随机推荐
- linux下安装与部署redis
一.Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...
- opencv学习之路(9)、对比度亮度调整与通道分离
一.对比度亮度调整 #include<opencv2/opencv.hpp> using namespace cv; #define WIN_NAME "输出图像" M ...
- 【Python48--魔法方法:迭代器&生成器】
一.迭代器 1.iter() __iter__() 2.next() __next__() 二.用while语句实现for语句相同的功能 for each in range(5): print(eac ...
- Python3 tkinter基础 LabelFrame Radiobutton 形成两组不相互限制的单选按钮
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 配置named服务之前的 相关术语意思
putty: [p^ti]: 油灰, 腻子,像 clay 粘土一样起 连接作用. 非常简洁,只有500多kB, 不需要安装,纯绿色的,版本还是0.x, Simon Tatham, 甚至没有主界面,没有 ...
- Centos7.5安装VirtualBox-5.2
1.查看自己的内核版本 [root@localhost /]# rpm -qa |grep kernel kernel-tools-libs-3.10.0-862.6.3.el7.x86_64 ker ...
- SpringBoot 解决HttpServletRequest只能读取一次
业务逻辑,通过filter读取请求的request,获取token,并将token传递后面流程使用 BodyReaderHttpServletRequestWrapper: public class ...
- Depth-first search and Breadth-first search 深度优先搜索和广度优先搜索
Depth-first search Depth-first search (DFS) is an algorithm for traversing or searching tree or grap ...
- Centos 7 官网下载安装mysql server 5.6
Centos 7 官网下载安装 mysql server # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rp ...
- 论文阅读:CNN-RNN: A Unified Framework for Multi-label Image Classification
CNN-RNN: A Unified Framework for Multi-label Image Classification Updated on 2018-08-07 22:30:41 Pap ...