PageFactory設(shè)計(jì)模式基于python實(shí)現(xiàn)
前言
pageFactory的設(shè)計(jì)模式能在java里執(zhí)行的原因是java自帶了PageFactory類,而在python中沒(méi)有這樣的包,但是已經(jīng)有人寫好了pageFactory在python的包,可以拿來(lái)用
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))
調(diào)用的例子
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_ (為避免與內(nèi)置的關(guān)鍵字ID沖突,所以多了個(gè)下劃線的后綴)
- name
- class_name
- css_selector
- tag_name
- xpath
- link_text
- partial_link_text
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python基于隨機(jī)采樣一至性實(shí)現(xiàn)擬合橢圓
這篇文章主要為大家詳細(xì)介紹了Python如何基于隨機(jī)采樣一至性實(shí)現(xiàn)擬合橢圓,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下2022-11-11
使用python切片實(shí)現(xiàn)二維數(shù)組復(fù)制示例
今天小編就為大家分享一篇使用python切片實(shí)現(xiàn)二維數(shù)組復(fù)制示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
利用Python通過(guò)獲取剪切板數(shù)據(jù)實(shí)現(xiàn)百度劃詞搜索功能
大家是不是嫌棄每次打開(kāi)百度太麻煩?今天教大家利用Python通過(guò)獲取剪切板數(shù)據(jù)實(shí)現(xiàn)百度劃詞搜索功能,用程序直接打開(kāi)網(wǎng)頁(yè),需要的朋友可以參考下2021-06-06
python二分查找算法的遞歸實(shí)現(xiàn)方法
這篇文章主要介紹了python二分查找算法的遞歸實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python二分查找算法的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-05-05
Python 網(wǎng)頁(yè)解析HTMLParse的實(shí)例詳解
這篇文章主要介紹了Python 網(wǎng)頁(yè)解析HTMLParse的實(shí)例詳解的相關(guān)資料,python里提供了一個(gè)簡(jiǎn)單的解析模塊HTMLParser類,使用起來(lái)也是比較簡(jiǎn)單的,解析語(yǔ)法沒(méi)有用到XPath類似的簡(jiǎn)潔模式,需要的朋友可以參考下2017-08-08
使用Tensorflow-GPU禁用GPU設(shè)置(CPU與GPU速度對(duì)比)
這篇文章主要介紹了使用Tensorflow-GPU禁用GPU設(shè)置(CPU與GPU速度對(duì)比),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python裝飾器原理與簡(jiǎn)單用法實(shí)例分析
這篇文章主要介紹了Python裝飾器原理與簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了Python裝飾器的概念、原理、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-04-04

