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

以上是 PageFactory设计模式基于python实现 的全部内容, 来源链接: utcz.com/z/349352.html

回到顶部