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

时间: 2024-10-12 07:40:30

python Selenium2Library element操作的健壮性封装、普通操作不受影响的相关文章

安装第三方Python模块,增加InfoPi的健壮性

这些第三方Python模块是可选的,不安装的话InfoPi也可以运行. 但是如果安装了,会增加InfoPi的健壮性. 1.chardet chardet可以自动检测文本的编码.如果安装了,可以用于自动检测网页.xml的编码. 安装命令: sudo pip3.4 install chardet 如果系统自带python 3.4或以上版本,可能提示没有pip3.4,换成pip-3.x(x为python的具体版本号)试试. chardet的项目页面: https://pypi.python.org/p

关于提高代码质量的思考之提高代码健壮性

接着上期的拓展性之后,今天谈谈代码的健壮性.代码的健壮性又称鲁棒性,是高质量代码的一个重要指标. 有人分析了印度软件行业比中国好的一个原因:印度的一个老程序员,月代码量在一千行左右,这一千行代码,算法平实,但都是经过仔细推敲,实战检验的代码,不会轻易崩溃的代码.我们的程序员,一天就可以写出一千行代码,写的代码简短精干,算法非常有技巧性,但往往是不安全的,不完善的.印度人的程序被称作:傻壮.但程序就得这样! 那么如何写出一个代码简短精干,算法非常有技巧性,而又非常安全的代码呢?我逛了很多论坛,发现

linux下,简单一行代码提高脚本的健壮性

前言 新来的美女同事,拿她写的脚本向我请教时,我证实了程序猿经常说的一句话:OMG,这么狗屎的代码居然是我写的!!! 问题描述: 在linux/unix写脚本时,我大多习惯在第一行加上(或许还有一大班跟我一样习惯的人): #!/usr/bin/bash 或者 #!/usr/bin/perl 或者 #!/usr/bin/python…………………… 用于操作系统执行这个脚本的时候,调用/usr/bin下的bash/perl/python解释器. 但是,这时存在两个小小问题: 1.本机的bash/p

【转】真实案例引起的对系统健壮性的思考(张逸,2012-02-07)

大年初四(2012年1月26日)上午,我在重庆移动某营业厅的自助客户端使用招商银行信用卡为我妻子充话费(我妻子的手机已经停机).在插入信用卡并输入密码后,系统提示正在交易.大约几秒后,我的手机收到招行的短信,提示消费100元,但自助客户端仍然显示正在交易.此时的我已经有了不详的预感.果然,在等待大约一分钟,系统提示操作失败,之后系统崩溃,弹出了一个Windows命令窗口.因为我妻子的手机停机了,所以立刻可以确认上一次充值确实是失败的.而我的手机能收到信用卡的消费信息,则可以确认银行确实已经支付了

selenium操作web自动化小小封装体验

元素判断封装 import lombok.extern.log4j.Log4j; import org.openqa.selenium.By; import java.io.File; import java.io.FileInputStream; import java.util.Properties; /** * @author liwen * 用来读取配置文件 */ @Log4j public class ObjectMap { private static Properties prop

跑健壮性Monkey,出现一次Crash全过程-日志分析-董浩-Dotest

最近带着学生做的某个项目,跑健壮性Monkey,出现一次Crash全过程-日志分析: 准备:搭建adb环境.安装实际测试包:开始: Monkey命令: 1 2 3 4 5 adb shell monkey -p com.**** -v-v-v --throttle 300 --pct-touch  30 --pct-motion 20 --pct-nav 20 --pct-majornav 15  --pct-appswitch 5 --pct-anyevent 5 --pct-trackbal

selenium之封装登陆操作

# selenium 封装登录操作举例 import os, time # from selenium import webdriver class LoginPage(): '''登录模块''' def __init__(self, path=''): '''初始化加载驱动''' if path: chrome_path = path else: chrome_path = "C:\\Users\\nriet\AppData\Local\Google\Chrome\Application\ch

健壮性与可靠性

健壮性(鲁棒性)和可靠性是有区别的,两者对应的英文单词分别是 robustness 和 reliability.健壮性主要描述一个系统对于参数变化的不敏感性,而可靠性主要描述一个系统的正确性,也就是在你固定提供一个参数时,它应该是产生稳定的,能预测的输出.例如一个程序,它的设计目标是获取一个参数并输出一个值.假如它能正确完成这个设计目标,就说它是可靠的.但在这个程序执行完毕后,假如没有正确释放内存,或者说系统没有自动帮它释放占用的资源,就认为这个程序及其"运行时"不具备健壮性或者鲁棒性

python之OS模块(对文件or目录操作)

OS模块 os,语义为操作系统,包含普遍的操作系统功能,与具体的平台无关.python编程时,处理文件和目录这些操作,就比如说:显示当前目录下所有文件/删除某个文件/获取文件大小-- os模块不受平台限制,也就是说:当我们要在linux中显示当前命令时就要用到pwd命令,而Windows中cmd命令行下就要用到这个,例如:这时候我们使用python中os模块的os.path.abspath(name)功能,甭管是linux或者Windows都可以获取当前的绝对路径. 常见函数列表 os.name