在使用 pytest
和 Selenium
進行自動化測試時,通常我們會根據斷言的結果來決定測試流程的走向。如果斷言失敗,測試通常會停止執行后續的步驟,因為失敗意味著被測系統沒有按照預期工作。然而,有時候我們可能需要在斷言失敗后執行特定的操作,比如記錄錯誤信息或截圖以便調試。
下面是一個示例,展示了如何在斷言失敗后繼續執行下一步操作:
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import Byclass TestWebPage:def setup_method(self):self.driver = webdriver.Chrome()def teardown_method(self):self.driver.quit()def test_button_click(self):self.driver.get('http://example.com')try:# 嘗試查找并點擊按鈕button = self.driver.find_element(By.ID, 'myButton')button.click()# 檢查頁面上的某個元素是否出現success_message = self.driver.find_element(By.CLASS_NAME, 'success-message').textassert 'Success' in success_message, "Success message not found"except AssertionError as e:# 斷言失敗時的操作print("Assertion failed:", str(e))# 可以在這里添加更多操作,如截圖、記錄日志等self.driver.save_screenshot('failed_assertion.png')finally:# 無論斷言是否失敗都會執行的操作print("Test execution completed.")if __name__ == "__main__":pytest.main(['-v', 'test_example.py'])
在這個例子中,我們使用了 try-except-finally
結構來處理斷言失敗的情況。在 try
塊中,我們執行了點擊按鈕和斷言檢查的代碼。如果斷言失敗(即 assert
語句引發了一個 AssertionError
),except
塊會被執行,我們在這里打印了錯誤信息,并保存了一個截圖。finally
塊中的代碼無論斷言是否失敗都會被執行,這里我們簡單地打印了一條消息表明測試執行完成。
請注意,雖然在斷言失敗后繼續執行代碼是有用的,但在實際的測試腳本中,我們應該確保這種“失敗后的操作”不會影響測試的正確性和完整性。通常,這些操作應該是輔助性的,比如記錄信息,而不是改變應用程序的狀態或測試的結果。
…………………………
當然,讓我們來看一個更具體的例子,展示如何在斷言失敗后執行下一步操作。在這個例子中,我們將使用 pytest
和 Selenium
來編寫一個測試腳本,該腳本會測試一個表單提交功能。如果表單提交成功,我們期望看到一個確認消息。如果提交失敗,我們將在頁面上查找錯誤消息,并根據情況執行不同的操作。
首先,確保你已經安裝了必要的庫:
pip install pytest selenium
然后,創建一個名為 test_form_submission.py
的文件,內容如下:
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECclass TestFormSubmission:def setup_method(self):self.driver = webdriver.Chrome()def teardown_method(self):self.driver.quit()def test_submit_form(self):self.driver.get('http://example.com/form')# 填寫表單input_field = self.driver.find_element(By.NAME, 'inputField')input_field.send_keys('Test Input')# 提交表單submit_button = self.driver.find_element(By.NAME, 'submitButton')submit_button.click()# 等待確認或錯誤消息出現wait = WebDriverWait(self.driver, 10)try:confirmation_message = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.confirmation-message')))assert 'Success' in confirmation_message.text, "Form submission was not successful"print("Form submitted successfully.")except AssertionError:# 斷言失敗,查找錯誤消息error_message = self.driver.find_element(By.CSS_SELECTOR, '.error-message')print("Form submission failed with error:", error_message.text)# 執行下一步操作,例如截圖或記錄日志self.driver.save_screenshot('form_submission_error.png')# 發送郵件通知錯誤(偽代碼)self.send_email_notification(error_message.text)except Exception as e:print("An unexpected error occurred:", str(e))def send_email_notification(self, error_message):# 這里可以實現發送郵件的功能passif __name__ == "__main__":pytest.main(['-v', 'test_form_submission.py'])
在這個例子中,我們首先填寫了一個表單并提交。然后,我們使用 WebDriverWait
等待確認消息的出現。如果確認消息中包含預期的文本 'Success',我們就認為表單提交成功。如果斷言失敗,我們會查找錯誤消息,并執行一些后續操作,比如保存截圖和發送郵件通知。
請注意,這個例子中的 http://example.com/form
和表單字段的名稱都是假設的,你需要替換為你實際要測試的網頁和元素的屬性。此外,發送郵件的函數 send_email_notification
是一個占位符,你需要根據實際情況實現這個功能。
要運行這個測試,你可以直接運行 test_form_submission.py
文件,或者在命令行中輸入 pytest -v test_form_submission.py
。
……..........
?