zoukankan      html  css  js  c++  java
  • python Selenium2Library element操作的健壮性封装、普通操作不受影响

        """
        对Selenium2Library element操作的健壮性封装、普通操作不受影响.
        每个element操作方法生成一个操作对象
        ''' 2类对象:
            father类型: fatherName=None eleMethodName=webObj.browserName,
                一般在webObj创建时配套创建, _eleMethod_objDc中记录,形如{fatherName:{}}
            非father型: fatherName!=None eleMethodName=webObj.b下的eleMethodName
                在webObj中以"self.w.eleMethodName()"形式使用、首次使用时创建
                _eleMethod_objDc中记录,形如{fatherName:{eleMethodName:eleMethodObj}}
        '''
        exam:
            class WebObj(class):
                def __init__(url, brType="ff", brName="1"):
                    self.b = Selenium2Library()
                    self.b.open_browser(url, browser=brType, alias=brName)
                    self.w = WebEleCall('__%s'%brName, webObj=self, fatherName=None)
            #end class
            web = WebObj("http://www.baidu.com")
            web.w.get_text(locator, _TryTimeout_=3)   #等效于如下代码:
            '''
            for i in range(0,3):
                try:
                    web.b.self.b.wait_until_element_is_visible(locator, _TryTimeout_/3)
                except,eObj:
                    print eObj
            web.b.get_text(locator)
        '''
        """

     1 # 在webObj创建时配套创建
     2 class WebEleCall(object): 
     3     """ 
     4     对Selenium2Library element操作的健壮性封装、普通操作不受影响. 
     5     每个element操作方法生成一个操作对象
     6     ''' 2类对象: 
     7         father类型: fatherName=None eleMethodName=webObj.browserName,
     8             一般在webObj创建时配套创建, _eleMethod_objDc中记录,形如{fatherName:{}}
     9         非father型: fatherName!=None eleMethodName=webObj.b下的eleMethodName
    10             在webObj中以"self.w.eleMethodName()"形式使用、首次使用时创建
    11             _eleMethod_objDc中记录,形如{fatherName:{eleMethodName:eleMethodObj}}
    12     '''
    13     exam:
    14         class WebObj(class):
    15             def __init__(url, brType="ff", brName="1"):
    16                 self.b = Selenium2Library()
    17                 self.b.open_browser(url, browser=brType, alias=brName)
    18                 self.w = WebEleCall('__%s'%brName, webObj=self, fatherName=None)
    19         #end class
    20         web = WebObj("http://www.baidu.com")
    21         web.w.get_text(locator, _TryTimeout_=3)   #等效于如下代码:
    22         '''
    23         for i in range(0,3):
    24             try:
    25                 web.b.self.b.wait_until_element_is_visible(locator, _TryTimeout_/3)
    26             except,eObj:
    27                 print eObj
    28         web.b.get_text(locator)
    29     '''
    30     """
    31     _eleMethod_objDc = {}   #每个fatherObj.eleMethod对应一个操作对象
    32     @classmethod
    33     def _get_eleMethods_(cls, browserObj):
    34         _eleMethods = []
    35         for i in dir(browserObj):
    36             iObj = getattr(browserObj, i)
    37             if not (i[0].islower() and hasattr(iObj, '__call__')):
    38                 continue
    39             try:
    40                 iargs = inspect.getargspec(iObj).args
    41             except BaseException,eObj:
    42                 print "i=%s , eObj={%s}"%(i,eObj)
    43                 continue
    44             if len(iargs)>1 and iargs[1]=='locator':
    45                 _eleMethods.append(i)
    46         return _eleMethods
    47     def __init__(self, eleMethodName, webObj, fatherName=None):
    48         self.eleMethodName = eleMethodName
    49         self.b = webObj.b
    50         self.web = webObj
    51         self.fatherName = fatherName    # 
    52         if fatherName==None:    # 父对象自己的fatherName=None
    53             self.__class__._eleMethod_objDc[eleMethodName] = {}
    54         self._TryTimeout_ = 3
    55         self._eleMethods = WebEleCall._get_eleMethods_(self.b)   #获取所有的eleMethods
    56     def __getattr__(self, unkonwnAttr):    #封装Selenium2Library的方法
    57         if unkonwnAttr in self._eleMethods:
    58             eleMethodName = unkonwnAttr
    59             fatherName = self.eleMethodName
    60             cls = self.__class__
    61             if unkonwnAttr in cls._eleMethod_objDc[fatherName].keys():
    62                 obj = cls._eleMethod_objDc[fatherName][eleMethodName]
    63             else:
    64                 obj = cls(eleMethodName, webObj=self.web, fatherName=fatherName)
    65                 cls._eleMethod_objDc[fatherName][eleMethodName] = obj
    66             return obj
    67         else:
    68             return getattr(self.b, unkonwnAttr)
    69     def __call__(self, locator, *args, **kw):
    70         print "    --> b.%s('%s', *%s, **%s)"%(self.eleMethodName,locator,args,kw)
    71         if locator==None:
    72             print "assert: locator==None"
    73         _TryTimeout_ = None
    74         if '_TryTimeout_' in kw.keys():
    75             _TryTimeout_ = kw['_TryTimeout_']
    76             kw.pop('_TryTimeout_')
    77         if self.eleMethodName=='wait_until_element_is_visible' and ('timeout' in kw.keys()):
    78             _TryTimeout_ = kw['timeout']
    79         if _TryTimeout_==None:   _TryTimeout_=self._TryTimeout_
    80         if self.eleMethodName!='':
    81             msgPre = "b.wait_until_element_is_visible(%s)"%locator
    82             if _TryTimeout_!=self._TryTimeout_:
    83                 print "    -->     b.wait_until_element_is_visible(%s, _TryTimeout_=%s)"%(locator,_TryTimeout_)
    84             pyx.Try_withTimes(_TryTimes=3, _TryGap=0, _msgPre=msgPre,
    85                     _reFunc=None, _reFKw=None,
    86                     _func=self.b.wait_until_element_is_visible, locator=locator, timeout=_TryTimeout_/3)
    87         eleMethod = getattr(self.b, self.eleMethodName)
    88         return eleMethod(locator, *args, **kw)
    class WebEleCall
     1 def Try_withTimes(_TryTimes,_TryGap,_msgPre,_reFunc,_reFKw,_func, *fargs, **fKw):
     2     """ 当reFunc想表示为空时,建议为time.sleep(0.01) """
     3     if _reFunc==None:
     4         _reFunc = str
     5         _reFKw = {}
     6     for i in range(_TryTimes): 
     7         try:
     8             iret = _func(*fargs, **fKw)
     9             break
    10         except BaseException,ierrObj:
    11             ierr = err_objToStr(ierrObj, ifDetail=False)
    12             logging.warning("    ----> %s() times=%s, ierr={%s}"%(_msgPre, (i+1), ierr))
    13             try:
    14                 _reFunc(**_reFKw)
    15             except BaseException,jerrObj:
    16                 jerr = err_objToStr(jerrObj)
    17                 logging.warning("    ----> %s().%s times=%s, jerr={%s}"
    18                                 %(_msgPre,_reFunc, (i+1), jerr))
    19             if (i+1<_TryTimes):
    20                 time.sleep(_TryGap)
    21     else:
    22         assert False, "----> %s() Fail. ierr={%s}"%(_msgPre,ierr)
    23     return iret
    pyx.Try_withTimes

    # 有兴趣的可以加我QQ406032224

    【@JayveeYao】
  • 相关阅读:
    文本框输入限制 [大全]
    JavaScript关于window.open()应用
    你还敢使用window.open弹广告吗?
    在HTML网页中插入ActiveX控件
    XMLDOC的常用方法和属性
    细说HTML元素的ID和Name属性的区别
    常用的40个网站制作技巧
    激活 ActiveX 控件
    laravel 配置 elasticsearch
    mac上运行ls 命名查看做面文件的出现“Operation not permitted”错误
  • 原文地址:https://www.cnblogs.com/JayveeYao/p/5526900.html
Copyright © 2011-2022 走看看