1. 程式人生 > 程式設計 >PageFactory設計模式基於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,**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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。