前面介绍了什么是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(第二话)的更多相关文章

  1. selenium+Page Objects(第三话)

    写好BasePage基类和页面元素定位后,就可以针对每个页面写业务逻辑了 1.编写每个页面page类,拿其中一个页面为例 fourth_page.py(名字我随便取的,实际中希望能取一些有意义的名字) ...

  2. selenium+Page Objects(第一话)

    简单介绍一种selenium用来做web自动化测试的设计模式:Page Objects 一.Page Objects介绍 用官话说它是selenium中的一种页面对象设计模式(不是测试框架!是一种开展 ...

  3. Selenium - WebDriver: Page Objects

    This chapter is a tutorial introduction to page objects design pattern. A page object represents an ...

  4. 通过Java + selenium +testNG + Page Objects 设计模式 实现页面UI的自动化

    Page Objects 设计模式 简单的讲,类似与Java面向对象编程,把每个页面都抽象为一个对象类,将页面元素的定位.业务逻辑操作分离开,然后我们可以通过testNG实现业务流程的控制 与 测试 ...

  5. 移动UI自动化-Page Objects Pattern

    移动UI自动化,看起来美好,践行起来却难.做个目光短见的务实主义者.Page Objects Pattern是Selenium官方推崇的方式,最近研究写测试用例最佳实践之Page Objects,同时 ...

  6. [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式

    写在最前面 这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得.这几年,做了一些自动化测试框架以及团队的构建的工作.过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的 ...

  7. Page Objects

    Page Objects 原文地址:https://github.com/SeleniumHQ/selenium/wiki/PageObjects Within your web app's UI t ...

  8. selenium webdriver (python) 第二版

    前言 对于大多软件测试人员来讲缺乏编程经验(指项目开发经验,大学的C 语言算很基础的编程知识)一直是难以逾越的鸿沟,并不是说测试比开发人员智商低,是国内的大多测试岗位是功能测试为主,在工作时间中,我们 ...

  9. [Protractor] Testing With Protractor Page Objects

    Protractor Page Objects are a recommended for testing your AngularJS applications. Page Objects abst ...

随机推荐

  1. yolo3(目标检测)实测

    yolo是继faster-r-cnn后,原作者在目标检测领域进行的新研究.到了v3版本以后,虽然已经换人支持,但是更注重工程实践,在实际使用过程中突出感受就是 “非常快”,GPU加速以后能够达到实时多 ...

  2. py4CV例子3Mnist识别和ANN

    1.什么是mnist数据集:  , , ], ,,,,,,,,]], ., ., , , ], ,,,,,,,,]], ., ., , , ])) animals_net.setTermCriteri ...

  3. Black Hat Python3 Chapter4

    mail sniffer 现在的邮箱应用我能找到的都是加密传输了,因此相像书中那样直接从抓到的包里获取到用户名和密码信息除非是自己专门搭建一个邮箱服务器,不然很难做到,为了便于理解代码的运行,多添加一 ...

  4. 【配置详解】Quartz配置文件详解

    我们通常是通过quartz.properties属性配置文件(默认情况下均使用该文件)结合StdSchedulerFactory 来使用Quartz的.StdSchedulerFactory 会加载属 ...

  5. P2055 [ZJOI2009]假期的宿舍

    思路 看到复杂的匹配条件,发现要让一个人和一个床匹配,所以就每个有床的人(指本校学生)和t连一条边,每个需要床的人(指外校的人和不回家的人)和s连一条边,i和j互相认识就把i和j的床连在一起,自己和自 ...

  6. volatile 变量使用

    1,对其它线程可见性.原理是:别的线程每次使用前都是要刷新一下值,并不是原子性同步.所有还是会出现线程不安全. 2,禁止指令重新排序.也就是会出现机器实际执行可能和代码的顺序不一样.使用volatil ...

  7. 用原型封装一个操作DOM的例子

    <script> // 一句话 在构造函数里面写属性 在原型里面写方法 function Elem(d){ this.even=document.getElementById(d); } ...

  8. (转载)C#语言开发规范

    1.  命名规范a) 类[规则1-1]使用Pascal规则命名类名,即首字母要大写.eg:Class Test{...}[规则1-2]使用能够反映类功能的名词或名词短语命名类.[规则1-3]不要使用“ ...

  9. Derek解读Bytom源码-P2P网络 upnp端口映射

    作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...

  10. JS 事件绑定、事件监听、事件委托详细介绍

    原:http://www.jb51.net/article/93752.htm 在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代 ...