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基础教程之基本数据类型和变量声明介绍
Aug 29 Python
python开发之thread线程基础实例入门
Nov 11 Python
Python3实现Web网页图片下载
Jan 28 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
使用Django Form解决表单数据无法动态刷新的两种方法
Jul 14 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
python3中rank函数的用法
Nov 27 Python
使用pandas的box_plot去除异常值
Dec 10 Python
Python3 A*寻路算法实现方式
Dec 24 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 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
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
Python数据类型详解(四)字典:dict
2016/05/12 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
Python算术运算符实例详解
2017/05/31 Python
python列表list保留顺序去重的实例
2018/12/14 Python
Python对象的属性访问过程详解
2020/03/05 Python
Django中的session用法详解
2020/03/09 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
Python2与Python3关于字符串编码处理的差别总结
2020/09/07 Python
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
小学生国庆演讲稿
2014/09/05 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
追悼词范文大全
2015/06/23 职场文书