進行實戰之前,我們先來了解一下自動化測試模型
一、線性測試
根據應用的操作步驟來編寫對應的測試腳本,每個測試腳本相對獨立且不產生其它的依賴於調用。
優點:每個測試腳本都是完整且獨立的,可單獨執行
缺點:開發和維護成本很高,存在很多重復的操作,且操作發生改變時需要修改多個地方
以登錄豆瓣為例,注意豆瓣登錄區域是一個iframe,需先切換到 iframe 再進行操作
示例代碼:
import time from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome() driver.maximize_window() # 1. 打開豆瓣首頁 driver.get("https://www.douban.com/") # 2. 登錄(先來一條簡單的,默認未登錄) # 切換到登錄的iframe login_frame = driver.find_element_by_css_selector("div.login iframe") WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(login_frame)) # 點擊密碼登錄 driver.find_element_by_css_selector("li.account-tab-account").click() # 輸入賬號密碼 driver.find_element_by_css_selector("#username").send_keys("****") driver.find_element_by_css_selector("#password").send_keys("****") # 點擊登錄 driver.find_element_by_css_selector(".account-form-field-submit").click() time.sleep(2) # 切換到默認頁面 driver.switch_to.default_content() # 3. 判斷是否登錄成功 eles = driver.find_elements_by_css_selector(".nav-user-account") if len(eles) > 0: print("登錄成功") driver.quit()
二、模塊化驅動測試
借鑒了編程語言中的模塊化思想,把重復的操作封裝成一個公共的模塊,當需要這一操作時直接調用公共模塊即可,大大提高了開發效率,簡化了維護的復雜性。
例如上面的測試腳本,可以把登錄功能封裝成一個方法,需要時直接調用
import time from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome() driver.maximize_window() def login(): # 切換到登錄的iframe login_frame = driver.find_element_by_css_selector("div.login iframe") WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(login_frame)) # 點擊密碼登錄 driver.find_element_by_css_selector("li.account-tab-account").click() # 輸入賬號密碼 driver.find_element_by_css_selector("#username").send_keys("****") driver.find_element_by_css_selector("#password").send_keys("****") # 點擊登錄 driver.find_element_by_css_selector(".account-form-field-submit").click() time.sleep(2) # 切換到默認頁面 driver.switch_to.default_content() driver.get("https://www.douban.com/") login() eles = driver.find_elements_by_css_selector(".nav-user-account") if len(eles) > 0: print("登錄成功") driver.quit()
三、數據驅動
模塊化驅動測試很好的解決了腳本重復的問題,但是如上面的登錄用例,當需要使用不同的賬號登錄時還是需要重新編寫用例,所以我們期望根據數據的改變來驅動測試,也就是數據的參數化,其中的數據可以是字典、數組或者是外部文件(csv、excel 等等),目的是實現數據與腳本的分離。
import time from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome() driver.maximize_window() douban_account = {"username":"****", "password":"****"} def login(account): # 切換到登錄的iframe login_frame = driver.find_element_by_css_selector("div.login iframe") WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(login_frame)) # 點擊密碼登錄 driver.find_element_by_css_selector("li.account-tab-account").click() # 輸入賬號密碼 driver.find_element_by_css_selector("#username").send_keys(account["username"]) driver.find_element_by_css_selector("#password").send_keys(account["password"]) # 點擊登錄 driver.find_element_by_css_selector(".account-form-field-submit").click() time.sleep(2) # 切換到默認頁面 driver.switch_to.default_content() driver.get("https://www.douban.com/") login(douban_account) eles = driver.find_elements_by_css_selector(".nav-user-account") if len(eles) > 0: print("登錄成功") driver.quit()
四、關鍵字驅動測試
關鍵字驅動就是通過改變關鍵字來驅動測試,如目前市面上的工具 QTP、Rotbot Framework 都是典型的關鍵字驅動的工具,封裝了底層代碼,提供給用戶獨立的圖形界面,降低了腳本編寫難度。Selenium IDE 也可以看做一種關鍵字驅動的自動化工具。
例如上面的腳本:打開百度 -> 在搜索輸入框輸入 selenium -> 點擊“百度一下”
注:在自動化實施過程中,可以根據項目需求選擇合適的模型來開展自動化測試。