python写appium_案例分享,Python +appium做登录功能
原標(biāo)題:案例分享,Python +appium做登錄功能
Appium 是一個(gè)自動(dòng)化測(cè)試開(kāi)源工具,支持 iOS 平臺(tái)和 Android 平臺(tái)上的原生應(yīng)用,同時(shí)又是一個(gè)跨平臺(tái)的工具:它允許測(cè)試人員在不同的平臺(tái)(iOS,Android)使用同一套API來(lái)寫(xiě)自動(dòng)化測(cè)試腳本,這樣大大增加了iOS和Android測(cè)試套件間代碼的復(fù)用性。
而python語(yǔ)言,作為當(dāng)下流行的編程語(yǔ)言來(lái)說(shuō),成為軟件測(cè)試人員及公司的首選,很多公司都以此為參考數(shù)據(jù)。
既然如此,這個(gè)給大家演示簡(jiǎn)單的一個(gè)登錄功能:
第一層是自己的定義一個(gè)工具層,封裝了幾種定位和四種滑動(dòng):
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
'''工具類(lèi)'''
class baseTools:
'''初始化方法'''
def __init__(self,appPackage,appActivity):
'''方法一'''
# dictionary = {}#定義空字典
# dictionary['platformName'] = 'Android'
# dictionary['platformVersion'] = '6.0.1'
# dictionary['noReset'] = True
# dictionary['deviceName'] = 'b973aad5'
# dictionary['appPackage'] = appPackage
# dictionary['appActivity'] = appActivity
'''方法二'''
desired_caps = {
'platformName':'Android', # 平臺(tái)名
'platformVersion':'6.0.1',# 平臺(tái)版本號(hào)
'noReset':True, # 不重置
'deviceName':'b973aad5', # 設(shè)備名字
'appPackage':appPackage, # app包名
'appActivity':appActivity # app 主Activity
}
# 驅(qū)動(dòng)連接
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
'''id定位'''
def MyfindID(self,id):
ID = (By.ID,id)
WebDriverWait(self.driver,30,0.1).until(EC.presence_of_all_elements_located(ID))
return self.driver.find_element_by_id(id)
'''xpath定位'''
def MyfindXPATH(self, xpath):
XPATH = (By.XPATH, xpath)
WebDriverWait(self.driver, 30, 0.1).until(EC.presence_of_all_elements_located(XPATH))
return self.driver.find_element_by_xpath(xpath)
'''name定位'''
def MyfindNAME(self, name):
NAME = (By.NAME, name)
WebDriverWait(self.driver, 30, 0.1).until(EC.presence_of_all_elements_located(NAME))
return self.driver.find_element_by_name(name)
'''class_name定位元素'''
def MyfindCLASS_NAME(self, class_name):
CLASS_NAME = (By.CLASS_NAME, class_name)
WebDriverWait(self.driver, 30, 0.1).until(EC.presence_of_all_elements_located(CLASS_NAME))
return self.driver.find_element_by_class_name(class_name)
'''link_name定位'''
def MyfindLINK_TEXT(self, link_text):
LINK_TEXT = (By.LINK_TEXT, link_text)
WebDriverWait(self.driver, 30, 0.1).until(EC.presence_of_all_elements_located(LINK_TEXT))
return self.driver.find_element_by_name(link_text)
'''
全屏滑動(dòng)
上下滑動(dòng) X軸(寬)不變,Y軸(高)交換位置
左右滑動(dòng) Y軸(高)不變,X軸(寬)交換位置
'''
def MySwipe(self, direction, n, duration = 1000): # direction為滑動(dòng)方向(t,d,l,r 四個(gè)參數(shù)), # n為滑動(dòng)次數(shù)(n應(yīng)為整數(shù)) duration 為間隔時(shí)間
if direction == 't': # top 上滑動(dòng)
d = self.driver
width = d.get_window_size()['width'] #獲取寬度
height = d.get_window_size()['height'] #獲取高度
for i in range(n):
d.swipe(width * 0.5, height * 0.75, width * 0.5, height * 0.25,duration)
elif direction == 'd': # down 下滑動(dòng)
d = self.driver
width = d.get_window_size()['width']
height = d.get_window_size()['height']
for i in range(n):
d.swipe(width * 0.5, height * 0.25, width * 0.5, height * 0.75, duration)
elif direction == 'l': # left 左滑動(dòng)
d = self.driver
width = d.get_window_size()['width']
height = d.get_window_size()['height']
for i in range(n):
d.swipe(width * 0.75, height * 0.5, width * 0.25, height * 0.5, duration)
elif direction == 'r': # right 右滑動(dòng)
d = self.driver
width = d.get_window_size()['width']
height = d.get_window_size()['height']
for i in range(n):
d.swipe(width * 0.25, height * 0.5, width * 0.75, height * 0.5, duration)
'''返回driver'''
def Mydriver(self):
return self.driver
第二層是UI層,封裝所有能看的見(jiàn)操作主要有點(diǎn)擊輸入獲取文本:
'''導(dǎo)入工具類(lèi)'''
from Tool_Package.tools.TOOL import baseTools
import unittest
from HTMLTestRunner import HTMLTestRunner
'''UI層'''
class uiAction():
'''初始化'''
def __init__(self,appPackage,appActivity):
'''創(chuàng)建對(duì)象,引入baseTools'''
self.d = baseTools(appPackage,appActivity)
'''點(diǎn)擊'''
def about_click(self, locate, type): # 參數(shù)type 判斷傳入定位參數(shù)的類(lèi)型,調(diào)用不同的定位方式
if type == 'id':
self.d.MyfindID(locate).click()
elif type == 'xpath':
self.d.MyfindXPATH(locate).click()
elif type == 'name':
self.d.MyfindNAME(locate).click()
elif type == 'className':
self.d.MyfindCLASS_NAME(locate).click()
elif type == 'linkText':
self.d.MyfindLINK_TEXT(locate).click()
'''輸入'''
def about_input(self,locate,value,type): # 參數(shù)type 判斷傳入定位參數(shù)的類(lèi)型,調(diào)用不同的定位方式
if type == 'id':
self.d.MyfindID(locate).send_keys(value)
elif type == 'xpath':
self.d.MyfindXPATH(locate).send_keys(value)
elif type == 'name':
self.d.MyfindNAME(locate).send_keys(value)
elif type == 'className':
self.d.MyfindCLASS_NAME(locate).send_keys(value)
elif type == 'linkText':
self.d.MyfindLINK_TEXT(locate).send_keys(value)
'''滑動(dòng)'''
def about_swipe(self,direction,n):
self.d.MySwipe(direction,n)
'''切換到H5'''
def Switch_webview(self):
self.d.driver._switch_to.context('WEBVIEW_cn.com.gsh.guoshihui')
'''切換為原生'''
def Switch_native(self):
self.d.driver._switch_to.context('NATIVE_APP')
'''獲取文本內(nèi)容并返回?cái)?shù)據(jù)'''
def get_text(self,locate,type): # type判斷傳入定位參數(shù)的類(lèi)型
if type == 'id':
str_Content = self.d.MyfindID(locate).text
return str_Content
elif type == 'xpath':
str_Content = self.d.MyfindXPATH(locate).text
return str_Content
'''退出'''
def tearDown(self):
self.d.driver.quit()
第三層是服務(wù)層,幾乎所有的實(shí)參都在此層傳輸:
from Tool_Package.tools.TOOL import baseTools
import unittest
from HTMLTestRunner import HTMLTestRunner
# QQ 登錄
class business():
def __init__(self,appPackage,appActivity):
self.qq = uiAction(appPackage,appActivity)
'''登錄'''
def Login(self):
self.qq.about_input('android.widget.EditText','1796065407','className') # 輸入用戶(hù)名
self.qq.about_input('com.tencent.mobileqq:id/password','***********','id') #輸入密碼
self.qq.about_click('com.tencent.mobileqq:id/login','id') #點(diǎn)擊登錄按鈕
'''清理'''
def tui(self):
self.qq.tearDown()
最后一層采用unittest框架,根據(jù)用例調(diào)用方法,并打印測(cè)試報(bào)告。
from Tool_Package.tools.TOOL import baseTools
import unittest
from HTMLTestRunner import HTMLTestRunner
'''
此層調(diào)用方法,執(zhí)行用例
使用unittest框架
'''
class Case(unittest.TestCase):
'''
初始化方法此處傳入的兩個(gè)參數(shù)為QQ的 Package(包名)和主Activity
'''
def setUp(self):
self.cs = business('com.tencent.mobileqq','.activity.SplashActivity')
'''調(diào)用登錄方法'''
def test_login(self):
u'''QQ登錄'''
self.cs.Login()
'''退出'''
def t(self):
self.cs.tui()
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(Case('test_login'))
# 創(chuàng)建文件并設(shè)置編碼
file = open('result.html', 'w+', encoding='utf-8')
# 標(biāo)題
t = 'QQ登錄自動(dòng)化測(cè)試'
# 描述
desc = 'This is MaZhengguang TEST REPORT'
# 測(cè)試報(bào)告
runner = HTMLTestRunner(stream=file, title=t, deion=desc)
# 運(yùn)行
runner.run(suite)返回搜狐,查看更多
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的python写appium_案例分享,Python +appium做登录功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python generator输出_p
- 下一篇: 迷你世界怎么得霰弹枪(24期迷你世界一)