1. 測試腳本的方法
歡迎來到我們的講座,今天我們會談談所有程式設計師最喜歡的流程——排錯和測試! 如果你已經掌握了使用 Selenium 創建出一個很棒的機器人,那麼是時候學習如何將它從狂野的機器人變成聽話的執行者,讓它不僅能工作,還能穩定地運行。 畢竟,你肯定不希望你的機器人在最關鍵的時候突然想要「放假」吧。
我們從討論各種測試腳本的方法開始。測試就像是必須去看醫生:誰都不想去,但又少不了。 即使是最棒的腳本,也需要檢查它的堅固性和可靠性。好消息是,Python 提供了很多工具來幫助你完成這項任務。
Unit 測試
一切都從 Unit 測試開始。它們就像小瑞士手錶一樣,檢查你機械中的每一個齒輪。
在 Python 中,unittest
是撰寫 Unit 測試的事實標準。
它的主要想法是獨立測試你的程式碼的每一個「單元」或組件。
import unittest
from my_selenium_script import my_function
class TestMyFunction(unittest.TestCase):
def test_success_case(self):
result = my_function("預期輸入")
self.assertEqual(result, "預期輸出")
unittest.main()
這個簡單的例子展示了如何檢查程式碼的單個功能。當然,在實際實踐中,你會檢查的不僅僅是成功案例,還有各種邊界情況和不正確的輸入數據。
整合測試
如果你已經能夠信任每一個「單元」,那麼該是時候測試它們彼此之間的互動了。 整合測試就像是一次完美的約會,展示出各個組件是如何協同工作的。 在這裡,你還是可以使用相同的工具,但測試的角度會有所不同。
class TestIntegration(unittest.TestCase):
def test_full_workflow(self):
# 想像每個步驟都在執行你的演算法函數
open_page()
fill_form()
submit_form()
self.assertTrue(check_results())
整合測試可能會更複雜,需要更長的時間,但它們能讓你確認整個系統能作為一個整體正常工作。
2. 排錯和修正錯誤
現在我們談過測試了,接下來讓我們深入更有趣的部分——排錯。 排錯就是當你的機器人開始「自作主張」時,你試圖將它拉回正常軌道的過程。
排錯工具
Python 中一個很棒的排錯工具就是 pdb
。
它能讓你暫停腳本運行,一步步地檢查其狀態。來看看這個例子吧:
import pdb
def some_function(value):
pdb.set_trace() # 在這裡暫停執行
result = value + 1
return result
some_function(3)
運行這段代碼後,你會進入一個互動環境,能逐步檢查代碼、查看變量值、修改它們,甚至逐步執行程式。 當你的腳本似乎做出奇怪的事情時,這大大減輕了你的負擔。
頁面狀態的可視化
對於視覺排錯來說,保存每個執行步驟的頁面截圖非常有幫助。 這可以幫助你查看屏幕上的元素顯示情況,以及出現錯誤時頁面的樣子。
driver.save_screenshot("page_state.png")
查找和修復錯誤的策略
可惜的是,沒有任何排錯工具可以直接告訴你邏輯上的根本錯誤出在哪裡。 在這種情況下,可以採用以下策略:
- 日誌記錄:增加更多的日誌記錄。如某位高人所言,「如果你不知道程式在做什麼,那就意味著你的日誌不夠多」。
使用
logging
庫來避免用print()
函數混亂你的代碼,同時提供更好的控制。 - 大聲讀代碼:有時候,把代碼的功能大聲讀出來,大腦更容易解決問題。 雖然聽起來很搞笑,但確實有用!
- 模組化:將代碼清晰地劃分為模組或函數。這樣能更容易定位錯誤的發生點。
3. 分析你的 Selenium 腳本
要創建可靠的腳本,必須在各種情況下測試它的運行。以下是一些測試範例:
頁面中缺少元素
在排錯過程中,確保所有需要的元素都存在於頁面上,且可供交互使用。
使用 find_elements()
方法並檢查返回列表的長度,可以避免發生 NoSuchElementException
錯誤。
elements = driver.find_elements_by_class_name("class_name")
if len(elements) == 0:
logging.warning("元素未找到")
else:
logging.info("元素成功找到")
頁面的意外狀態
例如,頁面可能存在不同的加載方式,或者根據條件顯示不同的元素。 腳本應該準備好應對這些情況。
try:
special_offer = driver.find_element(By.ID, "special_offer")
logging.info("找到特別優惠,執行操作")
except NoSuchElementException:
logging.info("未找到特別優惠,繼續運行")
頁面上的可變元素
測試時需要考慮,頁面上的元素可能會變化(例如,不同的橫幅、廣告塊等)。根據不同的頁面狀態來測試你的腳本。
在不同瀏覽器上的測試
不同瀏覽器對頁面的處理方式可能不同,因此為了穩定運行,最好在多個瀏覽器上測試腳本(例如 Chrome、Firefox、Edge)。 Selenium 允許通過不同的 WebDriver 在多個瀏覽器上運行測試。
from selenium import webdriver
# 在 Chrome 上運行
driver = webdriver.Chrome()
# 在 Firefox 上運行
driver = webdriver.Firefox()
# 在 Edge 上運行
driver = webdriver.Edge()
4. 自動化腳本測試
使用 unittest
編寫測試
使用 unittest
庫來自動運行腳本的各個部分測試。
這可以幫助你定期檢查每個元素的正常運行。
import unittest
from selenium import webdriver
class SeleniumTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get("https://example.com")
def test_element_presence(self):
driver = self.driver
element = driver.find_element_by_id("submit_button")
self.assertIsNotNone(element, "頁面上未找到元素")
def tearDown(self):
self.driver.quit()
unittest.main()
創建帶參數的測試集
創建測試集來測試不同元素和場景的組合。例如,可以檢查具有不同輸入數據形式的表單。
穩定性和性能測試
- 檢查腳本在大數據量上的穩定性:確保腳本能夠處理大量數據並長時間運行。
- 定期運行測試:定期運行測試以監控腳本的穩定性,尤其是在你工作的網站頻繁更新時。
- 性能評估:避免過長的等待時間和緩慢的元素。使用計時器來評估每個步驟的執行時間,並根據需要進行優化。
GO TO FULL VERSION