PageFactory设计模式基于python实现


Posted in Python onApril 14, 2020

前言

pageFactory的设计模式能在java里执行的原因是java自带了PageFactory类,而在python中没有这样的包,但是已经有人写好了pageFactory在python的包,可以拿来用

pageFactory 用于python支持的py文件

__all__ = ['cacheable', 'callable_find_by', 'property_find_by']
def cacheable_decorator(lookup):
  def func(self):
    if not hasattr(self, '_elements_cache'):
      self._elements_cache = {} # {callable_id: element(s)}
    cache = self._elements_cache

    key = id(lookup)
    if key not in cache:
      cache[key] = lookup(self)
    return cache[key]
  return func
cacheable = cacheable_decorator

_strategy_kwargs = ['id_', 'xpath', 'link_text', 'partial_link_text',
          'name', 'tag_name', 'class_name', 'css_selector']

def _callable_find_by(how, using, multiple, cacheable, context, driver_attr, **kwargs):
  def func(self):
    # context - driver or a certain element
    if context:
      ctx = context() if callable(context) else context.__get__(self) # or property
    else:
      ctx = getattr(self, driver_attr)

    # 'how' AND 'using' take precedence over keyword arguments
    if how and using:
      lookup = ctx.find_elements if multiple else ctx.find_element
      return lookup(how, using)

    if len(kwargs) != 1 or list(kwargs.keys())[0] not in _strategy_kwargs:
      raise ValueError(
        "If 'how' AND 'using' are not specified, one and only one of the following "
        "valid keyword arguments should be provided: %s." % _strategy_kwargs)

    key = list(kwargs.keys())[0];
    value = kwargs[key]
    suffix = key[:-1] if key.endswith('_') else key # find_element(s)_by_xxx
    prefix = 'find_elements_by' if multiple else 'find_element_by'
    lookup = getattr(ctx, '%s_%s' % (prefix, suffix))
    return lookup(value)

  return cacheable_decorator(func) if cacheable else func
def callable_find_by(how=None, using=None, multiple=False, cacheable=False, context=None, driver_attr='_driver',
           **kwargs):
  return _callable_find_by(how, using, multiple, cacheable, context, driver_attr, **kwargs)


def property_find_by(how=None, using=None, multiple=False, cacheable=False, context=None, driver_attr='_driver',
           **kwargs):
  return property(_callable_find_by(how, using, multiple, cacheable, context, driver_attr, **kwargs))

调用的例子

from pageobject_support import callable_find_by as by
from selenium import webdriver
from time import sleep
class BaiduSearchPage(object):
  def __init__(self, driver):
    self._driver = driver #初始化浏览器的api
  search_box = by(id_="kw")
  search_button = by(id_='su')
  def search(self, keywords):
    self.search_box().clear()
    self.search_box().send_keys(keywords)
    self.search_button().click()

支持的定位api

  • id_ (为避免与内置的关键字ID冲突,所以多了个下划线的后缀)
  • name
  • class_name
  • css_selector
  • tag_name
  • xpath
  • link_text
  • partial_link_text

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python import方法引入模块的实例
Aug 02 Python
python difflib模块示例讲解
Sep 13 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
解决python 输出是省略号的问题
Apr 19 Python
数据清洗--DataFrame中的空值处理方法
Jul 03 Python
python中正则表达式与模式匹配
May 07 Python
python设置代理和添加镜像源的方法
Feb 14 Python
Python如何获取文件指定行的内容
May 27 Python
python 如何调用远程接口
Sep 11 Python
浅谈Python 中的复数问题
May 19 Python
5道关于python基础 while循环练习题
Nov 27 Python
python保存图片的四个常用方法
Feb 28 Python
Jupyter notebook 远程配置及SSL加密教程
Apr 14 #Python
jupyter note 实现将数据保存为word
Apr 14 #Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 #Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 #Python
Python用5行代码实现批量抠图的示例代码
Apr 14 #Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 #Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 #Python
You might like
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
PHP学习 运算符与运算符优先级
2008/06/15 PHP
初识PHP
2014/09/28 PHP
js字符串转成JSON
2013/11/07 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
python单线程实现多个定时器示例
2014/03/30 Python
跟老齐学Python之重回函数
2014/10/10 Python
python的变量与赋值详细分析
2017/11/08 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
大学生物业管理求职信
2013/10/24 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
2014年宣传工作总结
2014/11/18 职场文书
入党现实表现材料
2014/12/23 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
Python 键盘事件详解
2021/11/11 Python
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏