基于python的电子菜单设计-PageFactory设计模式基于python实现

前言

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值