軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

本文主要內(nèi)容包括以下幾個功能的實(shí)現(xiàn):

·文章發(fā)布

·刪除單條文章用例

·刪除所有文章用例

·添加ID標(biāo)簽實(shí)現(xiàn)元素定位

·登錄功能驗(yàn)證碼識別

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

添加文章

添加文章頁面:

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

實(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)擊幾下定位

刪除單條文章用例

刪除文章頁面:

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

實(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)

刪除所有文章用例

刪除所有文章頁面:

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

實(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)出來,通過下面的表格再次加深一下印象。

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

添加ID標(biāo)簽實(shí)現(xiàn)元素定位

問題情境:

在本地環(huán)境util工具類里有一個封裝好的圖片驗(yàn)證碼類,實(shí)現(xiàn)識別圖片中的驗(yàn)證碼,需要傳入?yún)?shù)id。

但前端頁面沒有id屬性,需要添加一個id屬性,如下圖:

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

那么,怎么樣才能向前端頁面添加屬性值呢?這里我們使用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')

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

2.返回element tab下,查看存在id屬性如下圖:

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

上面獲取元素的方法除了標(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)證碼。

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

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)的可以直接放棄。

軟件測試工程師必備:Web自動化實(shí)踐全紀(jì)錄,10分鐘教你學(xué)自動化(自動化 軟件測試)

第三方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)注 私信我“測試”,即可拉你入群喲~~

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號
公眾號
在線咨詢
分享本頁
返回頂部