天天看點

軟體測試/測試開發丨學習筆記之Web自動化測試

作者:測試人666

本文為霍格沃茲測試開發學社學員學習筆記分享

原文連結:使用者端web自動化測試1 - 學習筆記 - 測試人社群

Web自動化的價值和體系

1、什麼時候可以做UI自動化測試

  • 業務流程不頻繁改動
  • UI 元素不頻繁改動
  • 需要頻繁回歸的場景
  • 核心場景等

2、 Web自動化測試相關技術

  • Selenium:支援多語言,行業内最火最主流
  • Pytest/JUnit5:最好用最全面的單元測試架構
  • Allure:測試報告

Selenium簡介

  • 用于web浏覽器測試的工具
  • 支援的浏覽器包括IE,Firefox,Safari,Chrome,Edge等
  • 使用簡單,可使用Java,Python等多種語言編寫用例腳本
  • 主要由三個工具構成:WebDriver、IDE、Grid

Selenium環境配置步驟

  1. 準備好Python/Java環境
  2. 準備好selenium依賴
  3. driver的下載下傳與配置(Mac與Windows不同)
  4. 在代碼中import對應的依賴

自動化測試用例結構分析

  • 用例标題
  • 前提條件
  • 用例步驟
  • 預期結果
  • 實際結果

web 浏覽器控制

  • get方法打開浏覽器*
from selenium import webdriver
import time

def window_start():
    # 執行個體化chromedriver
    driver = webdriver.Chrome()
    # 打開網站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    window_start()
           
  • refresh方法重新整理頁面
from selenium import webdriver
import time

def window_refresh():
    # 執行個體化chromedriver
    driver = webdriver.Chrome()
    # 打開網站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)
    # 重新整理網頁
    driver.refresh()
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    window_refresh()
           
  • 用back方法回退到上一個界面
from selenium import webdriver
import time
from selenium.webdriver.common.by import By

def window_back():
    # 執行個體化chromedriver
    driver = webdriver.Chrome()
    # 打開網站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)
    driver.find_element(By.XPATH,"//*[@id='ember35']").click()
    # 等待一秒
    time.sleep(1)
    # 傳回上一個界面
    driver.back()
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    window_back()
           
  • maximize_window方法使視窗最大化
def max_window():
    # 執行個體化chromedriver
    driver = webdriver.Chrome()
    # 打開網站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)
    # 螢幕最大化
    driver.maximize_window()
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    max_window()
           
  • minimize_window方法使視窗最小化
from selenium import webdriver
import time

def min_window():
    # 執行個體化chromedriver
    driver = webdriver.Chrome()
    # 打開網站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)
    # 螢幕最小化
    driver.minimize_window()
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    min_window()
           

常見控件定位方法

class name class 屬性對應的值 css selector(重點)css 表達式 id(重點) id 屬性對應的值 name(重點) name 屬性對應的值 link text 查找其可見文本與搜尋值比對的錨元素 partial link text 查找其可見文本包含搜尋值的錨元素。如果多個元素比對,則隻會選擇第一個元素。 tag name 标簽名稱 xpath(重點) xpath表達式

selenium 常用定位方式

#格式: 
driver.find_element_by_定位方式(定位元素)
driver.find_element(By.定位方式, 定位元素)
           

強制等待與隐式等待 1、強制等待

  • 強制等待,線程休眠一定時間
  • time.sleep(3)
from selenium import webdriver
from selenium.webdriver.common.by import By

def wait_sleep():
    """
    如果直接執行,不添加任何等待,可能會報錯
    """
    driver = webdriver.Chrome()
    driver.get("https://vip.ceshiren.com/")
    # 添加等待,讓頁面渲染完成
    time.sleep(3)
    driver.find_element(By.XPATH, "//*[text()='個人中心']")

if __name__ == '__main__':
    wait_sleep()
           

2、隐式等待

  • 原理:設定一個等待時間,輪詢查找(預設0.5秒)元素是否出現,如果沒出現就抛出異常
#設定一個等待時間,輪詢查找(預設0.5秒)元素是否出現,如果沒出現就抛出異常
driver.implicitly_wait(3)
           

隐式等待無法解決的問題

  • 元素可以找到,使用點選等操作,出現報錯
  • 原因: 頁面元素加載是異步加載過程,通常html會先加載完成,js、css其後 元素存在與否是由HTML決定,元素的互動是由css或者js決定 隐式等待隻關注元素能不能找到,不關注元素能否點選或者進行其他的互動
  • 解決方案:使用顯式等待

常見控件互動方法

點選,輸入,清空

  • 點選百度搜尋框
  • 輸入”霍格沃茲測試開發”
  • 清空搜尋框中資訊
# 點選百度搜尋框
driver.find_element(By.ID,"kw").click()
# 輸入"霍格沃茲測試開發"
driver.find_element(By.ID,"kw").send_keys("霍格沃茲測試開發")
# 清空搜尋框中資訊
driver.find_element(By.ID,"kw").clear()
           

自動化測試定位政策

選擇定位器通用原則

  1. 與研發約定的屬性優先(class屬性: [name='locate'])
  2. 身份屬性 id,name(web 定位)
  3. 複雜場景使用組合定位:
  • xpath,css
  • 屬性動态變化(id,text)
  • 重複元素屬性(id,text,class)
  • 父子定位(子定位父)
  1. js定位

Web 彈框定位

  • 場景 web 頁面 alert 彈框
  • 解決: web 需要使用 driver.switchTo().alert() 處理

下拉框/日期控件定位

  • 場景: <input>标簽組合的下拉框無法定位 <input>标簽組合的日期控件無法定位
  • 解決: 面對這些元素,我們可以引入 JS 注入技術來解決問題。

檔案上傳定位

  • 場景: input 标簽檔案上傳
  • 解決: input 标簽直接使用 send_keys()方法