CodeGym /Java Adesua /Python SELF TW /測試和排錯腳本以確保穩定性

測試和排錯腳本以確保穩定性

Python SELF TW
等級 38 , 課堂 4
開放

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()

創建帶參數的測試集

創建測試集來測試不同元素和場景的組合。例如,可以檢查具有不同輸入數據形式的表單。

穩定性和性能測試

  • 檢查腳本在大數據量上的穩定性:確保腳本能夠處理大量數據並長時間運行。
  • 定期運行測試:定期運行測試以監控腳本的穩定性,尤其是在你工作的網站頻繁更新時。
  • 性能評估:避免過長的等待時間和緩慢的元素。使用計時器來評估每個步驟的執行時間,並根據需要進行優化。
1
Опрос
修正 Selenium 腳本中的錯誤,  38 уровень,  4 лекция
недоступен
修正 Selenium 腳本中的錯誤
修正 Selenium 腳本中的錯誤
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION