basepage.py的封装

自定义的库封装(我们有很多方法需要重复调用,例如浏览器的引擎以及basepage.py的封装)
这是我们在第一篇写到的一句话
我们在上一张进行了配置文件的写法,内容,读取数据以及浏览器引擎类的封装,log工具类的创建
方便了我们测试用例使用unittest框架书写时 setup和teardown的书写,还有日志的打印方便我们的维护和调试避免了重复的代码。思路清晰每个py都有自己的分工和功能。

这一章我们需要实现baspage的封装。主要是将公用的方法。页面的基本操作的方法,我们之后在每个页面类实现业务逻辑代码时会继承bas_page.py.可以直接调用封装好的方法。我们放在framework文件下。

如上创建 PS:为什么我的文件名是绿色的,因为我在创建文件时add了git 写完可以直接上传到github比较方便,所以是绿色的


我在basepage中写了很多常用的方法,如果又需要自行补充

首先是定位元素的方法。在这里我们需要有一个思想。每一个页面类继承Basepage。而页面类里有两个东西,一个是元素定位器,一个是业务操作流程代码。 而元素定位器以元祖的形式表现 locator('id' ,'kw')
,所以我们在Base中封装的方法要结合元祖的形式来传入参数。

def find_element ( self, locator, timeou t =  10 ) :
'''
定位元素,参数 locator 为元祖类型
locator = ('id','xxx')
driver.find_element(locator)
'''
element = WebDriverWait (
self.driver, timeout, 1
).until (EC.presence_of_element_located (locator ))
logger.info ( 'Positioning to the %s%s element.' % locator )
return element

将定位元素的函数封装加显性等待加日志。 传入元祖形式的定位器。这样在页面类中结构就会非常清晰。一部分定位我所做页面的所有元素,一部分处理业务逻辑。nice

我封装的方法有
基本函数
1.定位单独的元素
2.定位一组元素
3.点击操作
4.输入操作
5.鼠标移动操作
6.后退
7.刷新
8.关闭
9.获取标题
10.获取文本
11.获取属性
12.执行js
13.聚焦元素
14.滚动条的操作
15.截图

判断函数
判断文本是否在元素里   text_to_be_present_in_element()
判断某个元素的value属性中是否包含预期的字符串  text_to_be_present_in_element_value()
判断元素的标题是否完全等于  title_is()
判断元素的标题是否包含         title_contains()
判断元素是否被选中                element_located_to_be_selected()
判断某元素被选中时的状态是不是符合预期标准      element_located_selection_state_to_be() 
判断是否存在alert           alert_is_present()
判断元素是否可见            visibility_of_element_locator()
判断元素是不是可以点击     element_to_be_clickable()
判断元素有没有被定位到   presence_of_all_elements_locator()


代码如下

from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from Framework.logger import Logger
from selenium.common.exceptions import *
import os
import time

logger = Logger ( 'BaseP' ).getlog ()


class BasePage ( object ) :
'''
在每个页面类常用的一些方法
'''

def __init__ ( self, driver ) :
self.driver = driver

def find_element ( self, locator, timeout = 10 ) :
'''
定位元素,参数 locator 为元祖类型
locator = ('id','xxx')
driver.find_element(locator)
'''
element = WebDriverWait (
self.driver, timeout, 1
).until (EC.presence_of_element_located (locator ))
logger.info ( 'Positioning to the %s%s element.' % locator )
return element

def find_elements ( self, locator, timeout = 10 ) :
'''
定位一组元素
:param locator:
:param timeout:
:return:
'''
elements = WebDriverWait (
self.driver, timeout, 1
).until (EC.presence_of_all_elements_located (locator ))
logger.info ( 'Positioning to the %s elements.' % locator )
return elements

def click ( self, locator ) :
'''
点击操作,传入元素的定位器,调用 findelement 方法接收返回值后执行 click 操作
'''
element = self.find_element (locator )
element.click ()
logger.info ( 'click success %s%s element.' % locator )

def send_keys ( self, locator, text ) :
'''
发送文本,清空后输入
locator = ('id','xxx')
element.send_keys(locator,text)
'''
element = self.find_element (locator )
element.clear ()
element.send_keys (text )
logger.info ( 'SendKeys %s in %s success.' % (text, locator ))

def is_text_in_element ( self, locator, text, timeout = 10 ) :
'''
判断文本在元素里,没有元素返回 false 打印日志,定位到返回判断结果的布尔值
result = driver.text_in_element(locator,text)
'''
try :
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.text_to_be_present_in_element (locator, text ))
except TimeoutException :
logger.info ( 'No location to the element.' )
return False
else :
return result

def is_text_in_value ( self, locator, value, timeout = 10 ) :
'''
判断元素的 value 值,没定位到元素返回 false ,定位到返回判断结果布尔值
result = dirver.text_to_be_present_in_element_value(locator,text)
'''
try :
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.text_to_be_present_in_element_value (locator, value ))
except TimeoutException :
logger.info ( 'No location to the element.' )
return False
else :
return result

def is_title ( self, title, timeout = 10 ) :
'''
判断元素的 title 是否完全等于
'''
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.title_is (title ))
return result

def is_title_contains ( self, title, timeout = 10 ) :
'''
判断元素的 title 是否包含
'''
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.title_contains (title ))
return result

def is_selected ( self, locator, timeout = 10 ) :
'''
判断元素是否被选中
'''
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.element_located_to_be_selected (locator ))
return result

def is_selected_be ( self, locator, selected = True, timeout = 10 ) :
'''
判断元素的状态是不是符合期望的状态, selected 是期望的状态
'''
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.element_located_selection_state_to_be (locator, selected ))
return result

def is_alert_present ( self, timeout = 10 ) :
'''
判断页面是否有 alert, 有的话返回 alert ,没有返回 False
'''
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.alert_is_present ())
return result

def is_visibility ( self, locator, timeout = 10 ) :
'''
元素可见,返回本身,不可见返回 False
'''
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.visibility_of_element_located (locator ))
return result

def is_invisibility ( self, locator, timeout = 10 ) :
'''
元素可见返回本身,不可见返回 Ture, 没有找到元素也返回 Ture
'''
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.invisibility_of_element_located (locator ))
return result

def is_clickable ( self, locator, timeout = 10 ) :
'''
元素可以点击 is_enabled 返回本身,不可点击返回 False
'''
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.element_to_be_clickable (locator ))
return result

def is_located ( self, locator, timeout = 10 ) :
'''
判断元素有没有被定位到 ( 并不意味着可见 ), 定位到返回 element ,没有定位到返回 False
'''
result = WebDriverWait (
self.driver, timeout, 1
).until (EC.presence_of_all_elements_located (locator ))
return result

def move_to_element ( self, locator ) :
'''
鼠标悬停操作
locator=('id','xxx')
driver.move_to_element(locator)
'''
element = self.find_element (locator )
ActionChains ( self.driver ).move_to_element (element ).perform ()
logger.info ( 'ActionChins move to %s' % locator )

def back ( self ) :
self.driver.back ()
logger.info ( 'back driver!' )

def forward ( self ) :
self.driver.forward ()
logger.info ( 'forward driver!' )

def close ( self ) :
self.driver.close ()
logger.info ( 'close driver!' )

def get_title ( self ) :
'''
获取 title
'''
logger.info ( 'git dirver title.' )
return self.driver.title ()

def get_text ( self, locator ) :
'''
获取文本
'''
element = self.find_element (locator )
logger.info ( 'get text in %s' % locator )
return element.text ()

def get_attribute ( self, locator, name ) :
'''
获取属性
'''
element = self.find_element (locator )
logger.info ( 'get attribute in %s' % locator )
return element.get_attribute (name )

def js_execute ( self, js ) :
'''
执行 js
'''
logger.info ( 'Execute js.%s' % js )
return self.driver.execute_script (js )

def js_focus_element ( self, locator ) :
'''
聚焦元素
'''
target = self.find_element (locator )
self.driver.execute_script ( "arguments[0].scrollIntoView();", target )

def js_scroll_top ( self ) :
'''
滚动到顶部
'''
js = 'window.scrollTo(0,0)'
self.driver.js_execute (js )
logger.info ( 'Roll to the top!' )

def js_scroll_end ( self ) :
'''
滚动到底部
'''
js = "window.scrollTo(0,document.body.scrollHight)"
self.js_execute (js )
logger.info ( 'Roll to the end!' )

def get_windows_img ( self ) :
'''
在这里我们把 file_path 这个参数写死,直接保存到我们项目根目录的一个文件夹里, .\Screenshots 下
'''
file_name = time.strftime ( '%Y%m%d%H%M%S' )
file_path = os.path.abspath ( '..' ) + '\Screenshots \\ ' + file_name + '.png'
try :
self.driver.get_screenshot_as_file (file_path )
logger.info ( 'Had take screenshot and save to folder:/screenshots' )
except NameError as e :
logger.info ( 'Failed to take the screenshot!%s' % e )
self.get_windows_img ()

————————————————
版权声明:本文为CSDN博主「测试工程师_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38079422/article/details/79105374

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值