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的requests网络编程包使用教程
Jul 11 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
Python发送http请求解析返回json的实例
Mar 26 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
基于python 凸包问题的解决
Apr 16 Python
python中def是做什么的
Jun 10 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
浅析Python 序列化与反序列化
Aug 05 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
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
php中函数的形参与实参的问题说明
2010/09/01 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
JQuery遍历元素的父辈和祖先的方法
2016/09/18 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
Python enumerate内置库用法解析
2020/02/24 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
python集合的新增元素方法整理
2020/12/07 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
印尼网上商店:Alfacart.com
2019/03/11 全球购物
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
酒店管理自荐信
2013/10/23 职场文书
中等生评语大全
2014/05/04 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
网络营销计划书
2015/01/17 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
圣诞晚会主持词
2015/07/01 职场文书
《春酒》教学反思
2016/02/22 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers