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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。