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 用 root 用户都无法删除的文件如何删除
要查看隐藏文件用 ls -a 看文件有没有被锁定(i属性) [root@linux ~]# lsattr YourFile ---i---------- YourFile 去除i属性再删除 [root ...
- 20165310 《Java程序设计》课程总结
20165310 <Java程序设计>课程总结 一.每周作业及实验报告博客链接汇总 预备作业一:我期望的师生关系 20165310 我期望的师生关系 预备作业二:学习基础和C语言基础调查 ...
- rsync命令解析
!rsync同步模式sync在进行同步或备份时,使用远程shell,或TCP连接远程daemon,有两种途经连接远程主机.shell模式,不需要使用配置文件,也不需要启动远端rsync.远程传输时一般 ...
- SpringBoot 统一异常处理
统一异常处理: @ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactor ...
- NodeJs完全迁移到D盘,形成绿色安装版
查看npm配置 D:\Git\AG-Admin-v2. (master) $ npm config ls ; cli configs metrics-registry = "https:// ...
- Eclipse 创建maven项目 报错 one or more constraints have not been satisfied
首先 在 pom.xml > plugins 中添加 <plugin> <groupId>org.apache.maven.plugins</groupId> ...
- (zhuan) Speech and Natural Language Processing
Speech and Natural Language Processing obtain from this link: https://github.com/edobashira/speech-l ...
- 【JS】JavaScript中innerHTML与innerText,createTextNode的区别
innerHTML和innerText 它们都会把元素内内容替换掉,区别在于: innerHTML 会把替换内容里的 HTML 标记解释执行. innerText 会把替换内容里的 HTML 标记原样 ...
- [转载]error while loading shared libraries的解決方法
转自:https://blog.csdn.net/dumeifang/article/details/2963223 error while loading shared libraries的解決方法 ...
- 17秋 SDN课程 第二次上机作业
1.控制器floodlight所示可视化图形拓扑的截图,及主机拓扑连通性检测截图 拓扑 连通性 2.利用字符界面下发流表,使得'h1'和'h2' ping 不通 流表截图 连通性 3.利用字符界面下发 ...