1. 程式人生 > 其它 >WEB自動化測試(五)

WEB自動化測試(五)

資料驅動

:在自動化測試中,把測試中使用到的資料分離出來。JSON,YAML。

 

JSON檔案

操作yaml檔案的庫:pip3 install pyyaml

 JSON庫主要應用於序列化以及反序列化中,特別是在API的自動化測試中,序列化以及反序列化是知識體

系裡面必須需要掌握的技術棧的體系。當然我們也是可以針對檔案進行序列話和反序列化的處理,針對檔案的序

列化可以簡單的理解為就是把第三方的資料寫到檔案裡面,使用JSON庫裡面的方法是dump(),那麼針對檔案的反

對序列化可以理解為是從檔案中讀取資料,那麼使用到的JSON庫裡面的load()的方法,下面主要是針對UI自動化測

試的資料進行分離,

 

建立一個模組把固定的資料分離出來以後直接呼叫

import unittest
from selenium import webdriver

class Init (unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('http://mail.sina.com.cn/')
self.driver.implicitly_wait(30)

def tearDown(self) -> None:

self.driver.quit()

 

 

建立json檔案



 

 

 

 

 

 

{
"null": "請輸入郵箱名",
"format": "您輸入的郵箱名格式不正確"
}




import yaml
from selenium import webdriver
import time as t
from 測試框架.init import Init
import unittest
import json


def readJson():
return json.load(open('sina.json',encoding='utf-8'))


print(readJson())



class BaiduTest(Init):
def test_login_null(self):
"""登入:驗證賬戶密碼為空的錯誤提示資訊"""
self.driver.find_element_by_id('freename').send_keys('')
self.driver.find_element_by_id('freepassword').send_keys('')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
#assertEqua比較兩個物件是否相等,
self.assertEqual(divText.text,readYaml()['login'][None])
def test_login_email_format(self):
"""登入:驗證賬戶格式不規範的錯誤提示資訊"""
self.driver.find_element_by_id('freename').send_keys('duanshuyuan')
self.driver.find_element_by_id('freepassword').send_keys('qwer')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')

self.assertEqual(divText.text,readYaml()['login']['format'])

self.assertIn(divText.text,readYaml()['login']['format'])

def test_login_isButton(self):
"""登入:驗證自動登入是否預設勾選"""
divText=self.driver.find_element_by_id('store1')
#針對bool的型別驗證assertTrue
self.assertTrue(divText.is_selected())


if __name__=='__main__':
Init.main()

 

 


{
"login":
[
{"username": "","password":"","result": "請輸入郵箱名"},
{"username": "duanshuyuan","password":"qwer","result": "您輸入的郵箱名格式不正確"},
{"username": "[email protected]","password":"qwer","result": "登入名或密碼錯誤"}
]
}


import unittest
from parameterized import parameterized,param
from selenium import webdriver
import time as t
import webbrowser
import json


def readJsonList():
return json.load(open('login_list.json',encoding='utf-8'))['login']
print(readJsonList())
for item in readJsonList():
print(item)

class SinaTest(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://mail.sina.com.cn/')
self.driver.implicitly_wait(30)

def tearDown(self) -> None:
self.driver.quit()
@parameterized.expand([
param(readJsonList()[0]['username'],readJsonList()[0]['password'],readJsonList()[0]['result']),
param(readJsonList()[1]['username'],readJsonList()[1]['password'],readJsonList()[1]['result']),
param(readJsonList()[2]['username'],readJsonList()[2]['password'],readJsonList()[2]['result'])
])
def test_login(self,username,password,result):
'''登入:測試登入不同場景'''
self.driver.find_element_by_id('freename').send_keys(username)
self.driver.find_element_by_id('freepassword').send_keys(password)
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')

if __name__ == '__main__':
unittest.main()

 

 



 


YAML檔案

 

 建立YAML檔案

 

 

 

 


login:
null: 請輸入郵箱名
format: 您輸入的郵箱名格式不正確

error:
user: admin
passwd: admin

 


import yaml
from selenium import webdriver
import time as t
from 測試框架.init import Init
import unittest
import yaml


def readYaml():
with open('sina.yaml',encoding='utf-8') as f:
return yaml.safe_load(f)

print(readYaml())

class BaiduTest(Init):
def test_login_null(self):
"""登入:驗證賬戶密碼為空的錯誤提示資訊"""
self.driver.find_element_by_id('freename').send_keys('')
self.driver.find_element_by_id('freepassword').send_keys('')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
#assertEqua比較兩個物件是否相等,
self.assertEqual(divText.text,readYaml()['login'][None])
def test_login_email_format(self):
"""登入:驗證賬戶格式不規範的錯誤提示資訊"""
self.driver.find_element_by_id('freename').send_keys('duanshuyuan')
self.driver.find_element_by_id('freepassword').send_keys('qwer')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')

self.assertEqual(divText.text,readYaml()['login']['format'])

self.assertIn(divText.text,readYaml()['login']['format'])

def test_login_isButton(self):
"""登入:驗證自動登入是否預設勾選"""
divText=self.driver.find_element_by_id('store1')
#針對bool的型別驗證assertTrue
self.assertTrue(divText.is_selected())


if __name__=='__main__':
Init.main()

 

 



在js ,java, go, 語言裡null true false跑到python裡要改為None True False

注意:
json裡面必須是雙引號
YAML裡面每個雜湊項冒號和值之間至少有一個空格!



頁面物件設計模式

頁面物件設計模式 po模式


page object


優勢:


1、建立可以跨多個測試用例共享的程式碼


2、減少重複程式碼的數量


3、如果使用者介面發生了維護,我們只需要維護一個地方,這樣修改以及維護的成本相對而言是比較低的





1、建立一個新的專案

 

2、在專案下建立資料夾與包具體目錄如下:

 

 

base:基礎層,主要編寫底層定位元素的類
page:物件層,編寫具體的業務理解,把頁面每一個操作行為單獨的寫一個方法或者函式
test:測試層,裡面主要是測試模組
utils:工具類
common:公共類 裡面編寫公共使用到的方法
data:儲存測試使用到測試資料
config:配置檔案儲存目錄
report:測試報告目錄
Readme.md:說明


在base(基礎層)裡面建立模組寫入基層程式碼
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import NoSuchElementException
import time as t

class WebUI(object):
def __init__(self,driver):
# webdriver例項化後的物件
self.driver=driver

def findElement(self,*args):
'''
單個元素定位的方式
:param args:
:return: 它是一個元組,需要帶上具體什麼方式定位元素屬性以及元素屬性的值
'''
try:
return self.driver.find_element(*args)
except NoSuchElementException as e:
return e.args[0]

def findsElement(self,*args,index):
'''
單個元素定位的方式
:param args:
:return: 它是一個元組,需要帶上具體什麼方式定位元素屬性以及元素屬性的值
'''
try:
return self.driver.find_element(*args)[index]
except NoSuchElementException as e:
return e.args[0]
在page(物件層)裡面建立模組寫入程式碼:

from selenium.webdriver.common.by import By
from base.base import WebUI
import time as t

class Login(WebUI):
uesrname=(By.ID,'freename')
password=(By.ID,'freepassword')
login=(By.CLASS_NAME,'loginBtn')
divText=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')

def inputUsername(self,username):
t.sleep(2)
self.findElement(*self.uesrname).send_keys(username)

def inputPasswd(self,password):
t.sleep(2)
self.findElement(*self.password).send_keys(password)

def clicklogin(self):
self.findElement(*self.login).click()
t.sleep(3)

def getDivText(self):
return self.findElement(*self.divText).text

def singLogin(self,username,password):
self.inputUsername(username=username)
self.inputPasswd(password=password)
self.clicklogin()



在test(測試層)建立模組寫入測試程式碼
  
from selenium import webdriver
import unittest
from page.login import Login
import time as t


class LoginTest(unittest.TestCase,Login):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('http://mail.sina.com.cn/')
self.driver.implicitly_wait(30)


def tearDown(self) -> None:
self.driver.quit()


def test_login_null(self):
'''登入驗證:賬戶密碼為空的錯誤提示資訊'''
self.singLogin(username='',password='')
self.assertEqual(self.getDivText(),'請輸入郵箱名')

def test_login_format(self):
'''登入驗證:郵箱名格式不正確'''
self.singLogin(username='duanshuyuan', password='qwer')
self.assertEqual(self.getDivText(),'您輸入的郵箱名格式不正確')

def test_login_error(self):
'''登入驗證:賬戶密碼不匹配'''
self.singLogin(username='[email protected]', password='qwer')
self.assertEqual(self.getDivText(),'請輸入正確的新浪郵箱帳號和密碼')