工廠設計模式在自動化中的引用(二)

生命不息,整合不息!

工廠設計模式在自動化中的引用(一)中介紹了利用工廠設計模式,整合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())

見代碼截圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章