軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)
本文主要內(nèi)容包括以下幾個功能的實(shí)現(xiàn):
·文章發(fā)布
·刪除單條文章用例
·刪除所有文章用例
·添加ID標(biāo)簽實(shí)現(xiàn)元素定位
·登錄功能驗(yàn)證碼識別
添加文章
添加文章頁面:
實(shí)現(xiàn)思路:
用例設(shè)計:包括添加成功和添加失敗兩條case。
1.元素定位
2.寫標(biāo)題->內(nèi)容->點(diǎn)擊發(fā)布
3.驗(yàn)證:toast彈窗文本內(nèi)容正確
腳本實(shí)現(xiàn):
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
from basic.admin_login import Test_admin_login
class TestArticle(object):
def __init__(self, login):
self.login = login
# 測試添加文章
def test_add_ok(self):
title = '我的文章'
content = '我的文章內(nèi)容'
expected = '文章保存成功。'
#定位左側(cè)文章列表
#文章
self.login.driver.find_element_by_xpath('//*[@id="sidebar-menu"]/li[4]/a/span[1]').click()
sleep(1)
#文章管理
self.login.driver.find_element_by_xpath('//*[@id="sidebar-menu"]/li[4]/ul/li[1]/a').click()
sleep(1)
#新建
self.login.driver.find_element_by_xpath('/html/body/div/div/section[3]/div/div/div/div[1]/div/div/a').click()
sleep(1)
#定位文章區(qū)域
#標(biāo)題
self.login.driver.find_element_by_id('article-title').send_keys(title)
sleep(1)
#進(jìn)入iframe
frame1=self.login.driver.find_element_by_xpath('//*[@id="cke_1_contents"]/iframe')
self.login.driver.switch_to.frame(frame1)
sleep(1)
#文章內(nèi)容
self.login.driver.find_element_by_xpath('/html/body').send_keys(content)
#退出frame
self.login.driver.switch_to.default_content()
#發(fā)布按鈕
self.login.driver.find_element_by_class_name('btn-primary').click()
#toast定位
loc=(By.CLASS_NAME,"toast-message")
#等待toast出現(xiàn)
WebDriverWait(self.login.driver,5).until(EC.visibility_of_element_located(loc))
#toast文本
message=self.login.driver.find_element(*loc).text
#斷言判斷toast文本和期望值相等
assert message==expected
注意點(diǎn):
1.frame彈窗的切入切出
2.文章內(nèi)容定位頁面檢查時到/html,需要自己手動添加到body下'/html/body'
3.發(fā)送失敗toast彈窗消失很快,可以多次點(diǎn)擊幾下定位
刪除單條文章用例
刪除文章頁面:
實(shí)現(xiàn)思路:
用例設(shè)計:刪除成功。
1.鼠標(biāo)懸停在文章標(biāo)題
2.點(diǎn)擊垃圾箱
3.驗(yàn)證:驗(yàn)證刪除后文章數(shù)=刪除前文章數(shù)-1
腳本實(shí)現(xiàn):
article.py
# 測試刪除單篇文章
def test_delete_one_article_ok(self):
# 文章管理
self.login.driver.find_element_by_xpath('//*[@id="sidebar-menu"]/li[4]/ul/li[1]/a').click()
sleep(1)
#刪除前文章數(shù)
beforenumber=len(self.login.driver.find_elements_by_class_name('jp-actiontr'))
#鼠標(biāo)懸停文章內(nèi)容
a=self.login.driver.find_element_by_xpath('/html/body/div/div/section[3]/div/div/div/div[2]/table/tbody/tr[2]/td[2]/strong/a')
ActionChains(self.login.driver).move_to_element(a).perform()
#刪除
self.login.driver.find_element_by_xpath('/html/body/div/div/section[3]/div/div/div/div[2]/table/tbody/tr[2]/td[2]/div/div/a[3]').click()
sleep(1)
#刪除后文章數(shù)
afternumber=len(self.login.driver.find_elements_by_class_name('jp-actiontr'))
#驗(yàn)證刪除后文章數(shù)=刪除前文章數(shù)-1
assert beforenumber==afternumber 1
技術(shù)難點(diǎn):
1.鼠標(biāo)懸停操作:
ActionChains(self.login.driver).movetoelement(a).perform()
2.文章數(shù)目使用len()函數(shù)確認(rèn)
3.所有文章數(shù)目確認(rèn)通過self.login.driver.findelementsbyclassname定位一組elements確認(rèn)
刪除所有文章用例
刪除所有文章頁面:
實(shí)現(xiàn)思路:
用例設(shè)計:刪除成功。
1.點(diǎn)擊全選復(fù)選框
2.點(diǎn)擊批量刪除
3.驗(yàn)證:驗(yàn)證文章數(shù)目=0
實(shí)現(xiàn)腳本:
# 測試刪除所有文章
def test_delete_all_article_ok(self):
#文章管理
self.login.driver.find_element_by_xpath('//*[@id="sidebar-menu"]/li[4]/ul/li[1]/a').click()
#點(diǎn)擊全部復(fù)選框
self.login.driver.find_element_by_xpath('/html/body/div/div/section[3]/div/div/div/div[2]/table/tbody/tr[1]/th[1]/input').click()
sleep(1)
self.login.driver.find_element_by_id('batchDel').click()
sleep(1)
WebDriverWait(self.login.driver,5).until(EC.alert_is_present())
alert = self.login.driver.switch_to.alert
alert.accept()
sleep(1)
#文章數(shù)目=0
afternumber = len(self.login.driver.find_elements_by_class_name('jp-actiontr'))
sleep(1)
assert afternumber==0
if __name__ == '__main__':
login = Test_admin_login()
login.login_success()
testArticle = TestArticle(login)
testArticle.test_add_ok()
#testArticle.test_delete_one_article_ok()
testArticle.test_delete_all_article_ok()
總結(jié):
通過上面我們可以發(fā)現(xiàn),自動化用例的實(shí)現(xiàn)及用例和功能測試用例基本上是一樣的,相同的操作步驟,相同的驗(yàn)證方法。只不過是通過腳本的方式展現(xiàn)出來,通過下面的表格再次加深一下印象。
添加ID標(biāo)簽實(shí)現(xiàn)元素定位
問題情境:
在本地環(huán)境util工具類里有一個封裝好的圖片驗(yàn)證碼類,實(shí)現(xiàn)識別圖片中的驗(yàn)證碼,需要傳入?yún)?shù)id。
但前端頁面沒有id屬性,需要添加一個id屬性,如下圖:
那么,怎么樣才能向前端頁面添加屬性值呢?這里我們使用JS語法。
添加id的思路如下:
首先,通過上圖的img標(biāo)簽找到要處理的HTML元素;
然后,操作這個元素,通過setAttribute添加屬性及屬性值;
注意:js腳本需要放到一個變量中,然后通過self.driver.execute_script(js)執(zhí)行腳本。
實(shí)現(xiàn)腳本:
js="document.getElementsByTagName('img')[0].setAttribute('id','captchaimg')"
self.driver.execute_script(js)
驗(yàn)證是否添加成功:
1.Chrome瀏覽器F12,找到console,輸入腳本:
document.getElementsByTagName('img')[0].setAttribute('id','captchaimg')
2.返回element tab下,查看存在id屬性如下圖:
上面獲取元素的方法除了標(biāo)簽名稱還有其他方式如:
·getElementById()
·getElementByName()
·getElementByTagName()
·getElementByClassName()
至于何種方法可以根據(jù)源碼查看,源碼有什么用什么方法。
報錯信息
javascript error: Cannot read property 'setAttribute' of undefined
數(shù)組越界
源代碼:
js="document.getElementsByTagName('img')[1].setAttribute('id','captchaimg')"
文檔中一共有一個img標(biāo)簽,下標(biāo)從0開始,所以將1改為0。
修改后:
js="document.getElementsByTagName('img')[0].setAttribute('id','captchaimg')"
上面提供一種處理問題的思路,當(dāng)我們需要某種元素標(biāo)簽時,并且這種標(biāo)簽不存在的情況下我們可以自己利用js語法添加標(biāo)簽并實(shí)現(xiàn)調(diào)用。
同時,在遇到selenium本身語法無法解決的問題,可以借助js腳本完成,比如頁面上下滑動、處理時間空間等等。
登錄功能驗(yàn)證碼識別
一般web網(wǎng)站登錄頁面都會有驗(yàn)證碼識別功能 ,如果是公司內(nèi)部測試,可以讓開發(fā)人員通過屏蔽驗(yàn)證碼或者留后門方式輕松跳過,大可不必把時間浪費(fèi)在驗(yàn)證碼識別上。
但是,大部分小伙伴一般剛開始接觸自動化時都是自己找的項(xiàng)目,基本上述兩種方法不適用。
下面推薦兩種常用的驗(yàn)證碼識別方式:
第一種OCR自動識別方式,缺點(diǎn)較復(fù)雜的驗(yàn)證碼識別不出來。
第二種,第三方API使用,我這里使用的是打碼平臺的,除此之外百度識別或者萬維易源(缺點(diǎn):調(diào)用繁瑣、費(fèi)用較高)。
場景:識別下圖的驗(yàn)證碼。
OCR自動識別的原理
在這里我們需要使用pytesseract,它是一款用于光學(xué)字符識別(OCR)的python工具,即從圖片中識別出其中嵌入的文字。
整個過程分為截取登錄頁面->獲取驗(yàn)證碼的位置坐標(biāo)->打開截圖->從截圖中截取驗(yàn)證碼的區(qū)域->使用pytesseract工具識別驗(yàn)證碼,這里直接使用pytesseract轉(zhuǎn)換介紹。
1.安裝Pillow
pip install Pillow
2.安裝pytesseract
pip install pytesseract
3.實(shí)現(xiàn)代碼
from PIL import Image 導(dǎo)入Image函數(shù)
import pytesseract 導(dǎo)入pytesseract
def get_file_content(filePath):
# 3.驗(yàn)證碼處理-使用OCR自動識別
qq = Image.open("D://software//project//jpress//testcases//basic//test.png") # 打開jpg驗(yàn)證碼圖片
text = pytesseract.image_to_string(qq).strip()
運(yùn)行查看結(jié)果返回為空,所以說這種方法對于簡單的驗(yàn)證碼還可以,復(fù)雜一點(diǎn)的可以直接放棄。
第三方API接口
打碼平臺鏈接地址:
http://www.ttshitu.com/docs/index.html?spm=null
首先需要注冊一個賬號,其次充值,1塊錢夠用挺長時間,找到對應(yīng)的語言(如python),拷貝代碼:
……
※※因原作者要求,文章僅顯示其中一部分,完整文章下載閱讀,可以直接:關(guān)注 私信“文章”即可。
最后給軟件測試員的一封信
IT工作是辛苦的,軟件測試當(dāng)然也不例外。每天執(zhí)行用例、跟蹤Bug,還要與開發(fā)、產(chǎn)品同學(xué)爭吵PK,與人斗其樂無窮~
但正是因?yàn)檫@些默默的付出,你讓一場本該在用戶面前發(fā)生的災(zāi)難,提前在自己面前發(fā)生了,你是否有一種救世主的感覺?
你拯救了用戶,也拯救了這一軟件,避免了她被撇棄、卸載的命運(yùn)。既然選擇了測試這一行,何不一站到底~~
現(xiàn)在我邀請你進(jìn)入我們的軟件測試學(xué)習(xí)交流群,關(guān)注 私信我“測試”,即可拉你入群喲~~
大家可以一起探討交流軟件測試,共同學(xué)習(xí)軟件測試技術(shù)、面試等軟件測試方方面面,還會有免費(fèi)直播課,收獲更多測試技巧,我們一起進(jìn)階Python自動化測試/測試開發(fā),走向高薪之路。
那我邀你進(jìn)群吧!記得:關(guān)注 私信我“測試”,即可拉你入群喲~~