生命不息,整合不息!
工厂设计模式在自动化中的引用(一)中介绍了利用工厂设计模式,整合selenium2和appium,写在一个框架中,可以实现对web应用程序,移动应用程序的自动化测试,在之前介绍了对web的测试实例代码,本文章介绍对移动应用程序的测试,关于appium本文章先不介绍,待后期完整的介绍appium的知识体系。在一个测试工厂中,生产一个可以测试web,可以测试app的测试工具,测试web或app什么,给什么框架测试,相互独立而有相互有依据,互相不影响,见如下的流程图:
实现的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'
def __init__(self,driver): self.driver=driver
def getDesiredcaps(self,version,deviceName,package,activity): """ :param version: 设备版本 :param deviceName: 设备名称 :param package: apk包名称 :param activity: apk的activity :return:android初始化信息 """ PATH=lambda p: os.path.abspath( os.path.join(os.path.dirname(__file__),p) ) desired_caps={} desired_caps['platformName']='Android' desired_caps['platformVersion']=version # desired_caps['deviceName']='Android Emulator' desired_caps['deviceName']=deviceName desired_caps['appPackage']=package desired_caps['appActivity']=activity desired_caps['waitappActivity']='android.webkit.WebView' desired_caps['browserName']='' self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) self.driver.implicitly_wait(30) 代码截图为:
编写demoAppPage.py的模块,已测试微博在android手机的登录为实例,编写的代码见如下:
#coding:utf-8
from selenium import webdriver from selenium.webdriver.common.by import By from Page import dashPage from appium import webdriver import time
class demoAndroidPage(dashPage.AppPage): login_loc=(By.ID,'com.sina.weibo:id/titleSave') userName_loc=(By.ID,'com.sina.weibo:id/etLoginUsername') password_loc=(By.ID,'com.sina.weibo:id/etPwd') loginButton_loc=(By.ID,'com.sina.weibo:id/bnLogin')
def clickLogin(self): self.findElement(*self.login_loc).click() time.sleep(2)
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 clickLoginButton(self): self.findElement(*self.loginButton_loc).click() time.sleep(2)
def login(self,username='admin',password='admin'): self.clickLogin() self.inputUserName(username) self.inputPasswd(password) self.clickLoginButton()
代码截图:
下来就是测试层了,很简单了,直接继承对象层,实现代码见如下:
#coding:utf-8
import unittest,os,sys from appium import webdriver from appium.common.exceptions import NoSuchContextException from selenium.webdriver.common.touch_actions import TouchActions from time import sleep from Page import dashPage,demoAppPage
class AndroidSina(unittest.TestCase,demoAppPage.demoAndroidPage,dashPage.AppPage): def setUp(self): self.getDesiredcaps('4.4.4','Samsung Galaxy S4','com.sina.weibo','com.sina.weibo.MainTabActivity')
def testLogin(self): self.login()
def tearDown(self): self.driver.quit()
if __name__=='__main__': suite=unittest.TestSuite(unittest.makeSuite(AndroidSina)) result=unittest.TextTestRunner(verbosity=2).run(suite) sys.exit(not result.wasSuccessful())
见代码截图: