51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2766|回复: 1
打印 上一主题 下一主题

[转贴] CMap 一种 UI 自动化开发模式

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-27 16:40:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

CMap=CtrlMap控件地图

意图:①抽象控件:将UI自动化开发中的“控件逻辑”与“控件信息”进行隔离 ②自动回归:“控件信息”有变化时可快速的识别出来进行适配。
主要解决:①简化“控件逻辑” ②降低由“控件信息”变化时引起的适配成本。
如何解决:①控件抽象化:例如在WEB自动化中,将"text_field/radio/checkbox/select_list"这些抽象为一种控件,
那么假如有20个页面、平均每个页面10个控件,原本需要写20*10个控件逻辑的,用CMap模式后能简化为20*1个控件逻辑。

②地图化:例如有一个控件的对象名为"AccoCapac.Line_FastEdt_Name",可以知道它的跳转路径为"AccoCapac->AccoCapac.Line->AccoCapac.Line_FastEdt"

应用实例1-抽象控件(以TesterHome的登录页面为例,先贴出部分关键代码):

  1. from Selenium2Library import Selenium2Library

  2. class CMap(object):
  3.     """ Singleton_Pattern extend Selenium2Library """
  4.     ...
  5. # end class

  6. class Signin(object):
  7.     URL = CMap('https://testerhome.com/account/sign_in', CMap.NONE)
  8.     Commit = CMap('xpath=//input[@name="commit"]', CMap.BUTTON)
  9.     Remember = CMap('xpath=//input[@id="user_remember_me"]', CMap.CHECKBOX)
  10.     User = CMap('xpath=//input[@id="user_login"]', CMap.TEXT_FIELD)
  11.     Pwd = CMap('xpath=//input[@id="user_password"]', CMap.TEXT_FIELD)
  12.     FLAG = Commit  # a special Ctrl<wait_until_element_is_visible>
  13.     @staticmethod
  14.     def GOTO_():
  15.         Signin.URL.go_to()
  16. # end class

  17. Signin.URL.open_browser(browser='firefox')  # create browserObj<Singleton_Pattern>, and open
  18. #Signin.GOTO_()
  19. Signin.FLAG.wait_until_element_is_visible()

  20. mysets = {'User': '123', 'Pwd': '456', 'Remember': True}
  21. for ictrl, ivalue in mysets.items():
  22.     print(' ictrl=%r ivalue=%r' % (ictrl, ivalue))
  23.     getattr(Signin, ictrl).Set(ivalue)
  24.     ifact = getattr(Signin, ictrl).Get()
  25.     print('   ictrl.Get()=%r' % ifact)
  26.     assert ifact == ivalue, "ifact==%r, but=%r" % (ivalue, ifact)
复制代码

应用实例2-自动回归(下图是之前一个项目中,全自动生成的“控件信息”回归代码):

[color=rgb(0, 105, 214) !important]


#补充: 上面class CMap的完整代码:

  1. class CMap(object):
  2.     """ Singleton_Pattern extend Selenium2Library """
  3.     B = None  # browserObj<Singleton_Pattern>
  4.     def __init__(self, locator, ctrlCls, **kw):
  5.         if CMap.B is None:
  6.             CMap.B = Selenium2Library(**kw)
  7.         self._locator = locator
  8.         self._ctrlCls = ctrlCls

  9.     def __getattr__(self, attr):
  10.         return _CMapHelper_BrowserDo(method=attr, arg0=self._locator)

  11.     # Abstract_Methods
  12.     def Set(self, value=None):
  13.         self._ctrlCls(opt='Set', locator=self._locator, value=value)

  14.     def Get(self, value=None):
  15.         return self._ctrlCls(opt='Get', locator=self._locator)

  16.     # Abstract_Methods's real_method
  17.     @staticmethod
  18.     def __TEXT_FIELD__(opt, locator, value=None):
  19.         if opt == 'Set':
  20.             CMap.B.input_text(locator, value)
  21.         elif opt == 'Get':
  22.             return CMap.B.get_webelement(locator).get_attribute('value')

  23.     @staticmethod
  24.     def __BUTTON__(opt, locator, value=None):
  25.         if opt == 'Set':
  26.             CMap.B.click_element(locator)
  27.         elif opt == 'Get':
  28.             return CMap.B.get_text(locator)

  29.     @staticmethod
  30.     def __CHECKBOX__(opt, locator, value=None):
  31.         """ value==is_selected() # True/False """
  32.         elementGet = CMap.B.get_webelement(locator)
  33.         if opt == 'Set':
  34.             return elementGet.click() if elementGet.is_selected()!=value else None
  35.         elif opt == 'Get':
  36.             return elementGet.is_selected()

  37.     # ctrlCls
  38.     TEXT_FIELD = __TEXT_FIELD__
  39.     BUTTON = __BUTTON__
  40.     CHECKBOX = __CHECKBOX__
  41.     NONE = None
  42. # end class

  43. class _CMapHelper_BrowserDo(object):
  44.     def __init__(self, method, arg0):
  45.         self.method = method
  46.         self.arg0 = arg0
  47.     def __call__(self, *args, **kw):
  48.         return getattr(CMap.B, self.method)(self.arg0, *args, **kw)
  49. # end class
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-11 04:01 , Processed in 0.060989 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表