前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工厂设计模式在自动化中的引用(一)

工厂设计模式在自动化中的引用(一)

作者头像
无涯WuYa
发布2018-10-25 16:17:03
1.1K0
发布2018-10-25 16:17:03
举报

在自动化测试的范围中,目前依据webdriver的,web应用测试框架有selenium2,对于移动app自动化的测试,有appium,selenium2和appium有很多的共同使用的地方,如对属性对象的定位,都是有id,name等,所以,完全可以把selenium2和appium整合到一个完整的框架中,这样的目的就是一个框架可以实现对web应用程序自动化的测试,也是可以实现对移动产品UI自动化的测试,同时selenium2和appium都提供了不同的API,这些可以放在个字独立的类下面,而把selenium2和appium对属性元素的定位方法,以及共同使用的方法,放在另外的一个类中,这样,测试web程序,就继承web对应的类,测试移动的产品,就继承移动对应的类。工厂设计模式正好符号这样的需求,即在一个工厂中,可以生产很多的产品,依据消费者的需求要什么,可以构造一个产品然后提供给消费者。因此,利用这样的一个理念,可以编写一个工厂的类Factory,再编写AutomationPage类,编写web和移动共同使用到的方法编写在这个类中,WebPage类和AppPage类全部继承AutomationPage类,同时WebPage类编写web应用程序使用到的方法进行封装,AppPage封装移动使用到的方法,具体实现的代码在dashPage.py的模块中,见实现的代码:

#!/usr/bin/env python #coding:utf-8

from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support.expected_conditions import NoSuchElementException from selenium.webdriver.support.expected_conditions import NoSuchFrameException from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By from selenium import webdriver from appium import webdriver

class Factory: def createAutomation(self,page): if page=='web': return WebPage() elif page=='app': return AppPage()

class AutomationPage: def __str__(self): return 'page'

def findElement(self,*loc): try: return self.driver.find_element(*loc) except(NoSuchElementException,KeyError,ValueError),e: print 'Error details :%s'%(e.args[0])

class WebPage(AutomationPage): def __str__(self): return 'web'

def __init__(self,driver): self.driver=driver

def goTo(self,base_url): self.driver.get(base_url)

def getCurrentUrl(self): return self.driver.current_url

class AppPage(AutomationPage): def __str__(self): return 'app' 见代码的截图:

下面开始实现web应用程序的自动化测试,编写demoPage.py的模块,继承dashPage.WebPage类,在该类中,编写要测试的应用程序的page对象,本模块中编写的是一个简单的登录,见如下的代码:

#coding:utf-8

from selenium import webdriver from selenium.webdriver.common.by import By from Page import dashPage import time

class demoWebPage(dashPage.WebPage): username_loc=(By.ID,'l-1') password_loc=(By.ID,'l-2') loginButton_loc=(By.ID,'l-4')

def inputUserName(self,username): self.findElement(*self.username_loc).send_keys(username) time.sleep(2)

def inputPasswd(self,password): self.findElement(*self.password_loc).send_keys(password) time.sleep(2)

def clickLogin(self): self.findElement(*self.loginButton_loc).click() time.sleep(2)

def login(self,username='admin',password='admin'): self.goTo('http://my.weke.com/login.html') self.inputUserName(username) self.inputPasswd(password) self.clickLogin()

见代码截图:

测试代码就好很多了,编写测试的模块demoPageTest.py,该测试模块中的类继承TestCase,实例化demoPage类,就可以实现完整的自动化了,见如下的代码:

#coding:utf-8

from selenium import webdriver from selenium.common.exceptions import * from time import sleep,time,ctime import unittest from Page import dashPage,demoPage import time import logging from selenium.webdriver.common.desired_capabilities import DesiredCapabilities DesiredCapabilities.INTERNETEXPLORER['ignoreProtectedModeSettings'] = True

class singPage(unittest.TestCase): def setUp(self): self.driver=webdriver.Firefox() self.driver.maximize_window() self.driver.implicitly_wait(30)

def testTitle(self): page=demoPage.demoWebPage(self.driver) page.login()

def tearDown(self): self.driver.quit()

if __name__=='__main__': unittest.main(verbosity=2)

见代码截图:

这样实现的意义有什么好处,个人认为有如下的几点优势:

1、父类层只编写selenium2,appium共同可以使用到的方法;

2、在对象层中,selenium2和appium完全隔离开,selenium2写web的,appium写app的

3、在测试层中,也是完全分开的,web和app各自执行自己的case,完全不影响

selenium2和webdriver的整合在某些程度上是一个趋势,更多层次的原因是这二个框架都符合webdriver,另外在语言层次上,都是可以使用的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档