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