PageFactory设计模式基于python实现
前言
pageFactory的设计模式能在java里执行的原因是java自带了PageFactory类,而在python中没有这样的包,但是已经有人写好了pageFactory在python的包,可以拿来用
pageFactory用于python支持的py文件
__all__=['cacheable','callable_find_by','property_find_by']
defcacheable_decorator(lookup):
deffunc(self):
ifnothasattr(self,'_elements_cache'):
self._elements_cache={}#{callable_id:element(s)}
cache=self._elements_cache
key=id(lookup)
ifkeynotincache:
cache[key]=lookup(self)
returncache[key]
returnfunc
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):
deffunc(self):
#context-driveroracertainelement
ifcontext:
ctx=context()ifcallable(context)elsecontext.__get__(self)#orproperty
else:
ctx=getattr(self,driver_attr)
#'how'AND'using'takeprecedenceoverkeywordarguments
ifhowandusing:
lookup=ctx.find_elementsifmultipleelsectx.find_element
returnlookup(how,using)
iflen(kwargs)!=1orlist(kwargs.keys())[0]notin_strategy_kwargs:
raiseValueError(
"If'how'AND'using'arenotspecified,oneandonlyoneofthefollowing"
"validkeywordargumentsshouldbeprovided:%s."%_strategy_kwargs)
key=list(kwargs.keys())[0];
value=kwargs[key]
suffix=key[:-1]ifkey.endswith('_')elsekey#find_element(s)_by_xxx
prefix='find_elements_by'ifmultipleelse'find_element_by'
lookup=getattr(ctx,'%s_%s'%(prefix,suffix))
returnlookup(value)
returncacheable_decorator(func)ifcacheableelsefunc
defcallable_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)
defproperty_find_by(how=None,using=None,multiple=False,cacheable=False,context=None,driver_attr='_driver',
**kwargs):
returnproperty(_callable_find_by(how,using,multiple,cacheable,context,driver_attr,**kwargs))
调用的例子
frompageobject_supportimportcallable_find_byasby fromseleniumimportwebdriver fromtimeimportsleep classBaiduSearchPage(object): def__init__(self,driver): self._driver=driver#初始化浏览器的api search_box=by(id_="kw") search_button=by(id_='su') defsearch(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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。