CodeGym /Java 课程 /Python SELF ZH /测试和调试脚本以确保稳定性

测试和调试脚本以确保稳定性

Python SELF ZH
第 38 级 , 课程 4
可用

1. 测试脚本的方法

欢迎来到我们的课程,今天我们要讨论所有程序员最喜欢的部分——调试和测试! 如果你已经掌握了使用 Selenium 创建一个很棒的机器人,现在是时候学习如何让它从一个 疯狂的机器人变成一个听话的执行者,不仅能运行,还能稳定运行。 毕竟,你不希望你的机器人在最关键的时刻突然“休息”一下吧。

我们从讨论各种测试脚本的方法开始。测试就像是定期看医生:没人想去,但必须去。 即使是最出色的脚本也需要检查它是否稳固可靠。好消息是,在 Python 中有很多工具可以帮助完成这项任务。

单元测试

一切都从单元测试开始。它们就像是小瑞士表,每个齿轮都被逐一检查。 在 Python 中,unittest 库是编写单元测试的默认标准。主要思想是 独立测试代码的每个“单元”或部分。


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