PageFactory設計模式基於python實現
阿新 • • 發佈:2020-04-15
前言
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,**kwargs) def property_find_by(how=None,**kwargs): return property(_callable_find_by(how,**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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。