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笔记(叁)继续学习
Oct 24 Python
Python装饰器入门学习教程(九步学习)
Jan 28 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
Python面向对象之类的封装操作示例
Jun 08 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
Kears+Opencv实现简单人脸识别
Aug 28 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
Python中Cookies导出某站用户数据的方法
May 17 Python
总结Python变量的相关知识
Jun 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
PHP生成月历代码
2007/06/14 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
js读取配置文件自写
2014/02/11 Javascript
解释&&和||在javascript中的另类用法
2014/07/28 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
Python程序设计入门(2)变量类型简介
2014/06/16 Python
Python算法应用实战之队列详解
2017/02/04 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
JSP&Servlet技术面试题
2015/05/21 面试题
设计毕业生简历中的自我评价
2013/10/01 职场文书
技术副厂长岗位职责
2013/12/26 职场文书
社会实践心得体会
2014/01/03 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android