news 2026/6/18 15:23:59

Web自动化测试实战:Python+Selenium+Pytest从入门到框架搭建

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Web自动化测试实战:Python+Selenium+Pytest从入门到框架搭建

1. 项目概述:为什么我们需要Web自动化测试?

干了十几年测试,从手工点点点到如今用脚本驱动浏览器,我最大的感受就是:自动化测试不是“可选项”,而是保证项目质量和开发效率的“必需品”。尤其对于Web应用,版本迭代快、浏览器兼容性要求高、回归测试工作量大,如果还靠人工一遍遍去点,不仅效率低下,而且极易出错,测试人员也成了重复劳动的“机器人”。

“自动化测试完全指南:从概念到实战的Web自动化入门”这个标题,听起来像是一本厚重的教科书,但我的目标是把这十几年的踩坑经验,浓缩成一篇你能直接上手、看完就能干活的实战手册。我不会跟你空谈理论,而是直接告诉你,一个合格的Web自动化测试框架应该怎么搭,脚本怎么写,坑怎么避。

简单来说,Web自动化测试就是通过编写脚本,模拟真实用户的操作(如点击、输入、滚动等),让程序自动在浏览器中执行测试用例,并验证结果是否符合预期。它能帮你解决几个核心痛点:解放人力去做更有价值的探索性测试、实现快速且无遗漏的回归测试、以及在非工作时间(如夜间)执行耗时较长的测试套件。无论你是刚入行的测试新人,还是想提升效率的开发工程师,掌握Web自动化都是一项极具性价比的投资。

2. 核心思路与工具选型:为什么是Selenium?

开始动手前,你得先想清楚用什么工具。Web自动化领域工具繁多,但经过多年沉淀,Selenium依然是无可争议的“行业标准”。为什么是它?首先,它开源、免费,社区生态极其庞大,遇到问题基本都能找到解决方案。其次,它支持几乎所有主流浏览器(Chrome, Firefox, Safari, Edge)和多种编程语言(Python, Java, C#, JavaScript等),给了你最大的技术选型自由。最后,它是W3C标准,这意味着它的生命力和兼容性有保障。

当然,光有Selenium还不够,它是一个浏览器驱动工具。要构建一个健壮、可维护的自动化测试项目,我们还需要一个测试框架来组织用例、管理断言和生成报告。这里我强烈推荐Pytest(如果你用Python)或JUnit/TestNG(如果你用Java)。Pytest以其简洁的语法、强大的Fixture机制和丰富的插件生态(如Allure报告)脱颖而出,成为Python自动化测试的事实标准。

所以,我们这套“完全指南”的技术栈非常明确:Python + Selenium + Pytest。这是经过无数项目验证的、最稳定、最易上手、也最强大的组合。别被那些眼花缭乱的新工具迷惑,对于入门和绝大多数企业级应用,这套组合拳足够用了。

2.1 环境搭建:一步都不能错

环境是万事开头难的那一步,配置错了后面全是坑。我们一步步来。

第一步:安装Python去Python官网下载最新稳定版(如3.8+)。安装时务必勾选“Add Python to PATH”,这样才能在命令行任何位置使用pythonpip命令。安装后,打开终端(Windows用CMD或PowerShell,Mac/Linux用Terminal),输入python --versionpip --version验证是否成功。

第二步:安装Selenium打开终端,一行命令搞定:

pip install selenium

这条命令会安装Selenium的核心库。

第三步:安装浏览器驱动这是新手最容易栽跟头的地方。Selenium需要通过一个叫“WebDriver”的组件来与真实浏览器通信。你需要下载与你电脑上浏览器版本严格匹配的驱动。

  • Chrome驱动(ChromeDriver):去 ChromeDriver官网 下载。查看你Chrome浏览器的版本(在浏览器地址栏输入chrome://version/),下载对应的ChromeDriver。
  • Firefox驱动(GeckoDriver):去 GeckoDriver的GitHub发布页 下载。

下载后,得到一个可执行文件(如chromedriver.exegeckodriver.exe)。你有两个选择:

  1. 放入系统PATH:把这个文件放到系统环境变量PATH包含的任意目录下(如/usr/local/binC:\Windows)。这是最推荐的方式,一劳永逸。
  2. 指定路径:在代码中初始化浏览器时,通过service参数指定驱动文件的绝对路径。

实操心得:我强烈建议使用第一种方式。很多教程让你把驱动放在项目目录下,这在团队协作和持续集成(CI)时会非常麻烦。统一放入PATH,是所有机器都能识别的“通用语言”。

第四步:安装Pytest

pip install pytest pytest-html allure-pytest

这里我们一口气安装了Pytest核心、用于生成HTML报告的pytest-html,以及生成更美观的Allure报告的allure-pytest。Allure报告非常专业,是向上级展示测试成果的利器。

至此,最核心的环境就准备好了。你可以创建一个测试目录,开始我们的实战之旅。

3. 第一个自动化脚本:从“Hello World”开始

理论说再多不如跑通一个例子。我们来写一个最简单的脚本:打开百度,搜索一个关键词,然后断言搜索结果页面标题包含这个关键词。

创建一个文件,命名为test_first_script.py

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time def test_baidu_search(): # 1. 启动浏览器 driver = webdriver.Chrome() # 如果驱动在PATH,直接这样写。否则需要指定路径:webdriver.Chrome(service=Service(‘你的驱动路径‘)) driver.maximize_window() # 最大化窗口,避免元素被遮挡 try: # 2. 打开百度 driver.get("https://www.baidu.com") time.sleep(2) # 等待页面加载,实际项目中应该用更智能的等待 # 3. 定位搜索框并输入关键词 search_box = driver.find_element(By.ID, "kw") # 百度搜索框的ID是‘kw‘ search_box.send_keys("Selenium自动化测试") search_box.send_keys(Keys.RETURN) # 模拟回车键 # 4. 等待结果加载 time.sleep(3) # 5. 断言:验证页面标题包含‘Selenium‘ assert "Selenium" in driver.title print("测试通过!页面标题为:", driver.title) except Exception as e: print("测试失败,错误信息:", e) # 这里可以加入截图逻辑,便于排查 driver.save_screenshot("error.png") finally: # 6. 关闭浏览器,释放资源 driver.quit() if __name__ == "__main__": test_baidu_search()

在终端运行这个脚本:

python test_first_script.py

如果一切顺利,你会看到Chrome浏览器自动打开,访问百度,输入文字,搜索,然后浏览器关闭,控制台打印出“测试通过!”。

核心细节解析

  • webdriver.Chrome():这行代码启动了Chrome浏览器的一个无界面实例(虽然你看到了界面)。它返回一个driver对象,后续所有操作都通过它进行。
  • By.ID:这是Selenium提供的“定位器”(Locator)。By.ID表示通过HTML元素的id属性来定位。这是最快、最优先使用的定位方式。其他常用定位方式还有By.NAME,By.CLASS_NAME,By.XPATH,By.CSS_SELECTOR
  • find_element:用于查找单个页面元素。如果找不到,会抛出NoSuchElementException。对应的find_elements(注意复数)会返回一个元素列表,即使找不到也是返回空列表,不会抛异常。
  • send_keys:向输入框模拟键盘输入。Keys.RETURN是回车键。
  • time.sleep:这是强制等待,会让脚本暂停指定秒数。在实际项目中,这是最不推荐的等待方式,因为它效率低下且不稳定(网络或机器慢时,3秒可能不够)。我们马上会讲更优的等待策略。
  • driver.quit():关闭浏览器并结束WebDriver会话。务必在finally块或使用with语句调用,确保即使测试失败,浏览器也能被正确关闭,避免残留进程。

4. 构建健壮的测试框架:Page Object Model (POM) 设计模式

如果所有操作和断言都像上面那样写在一个函数里,代码很快就会变成难以维护的“面条代码”。业内公认的最佳实践是Page Object Model (POM,页面对象模型)

POM的核心思想:将每个页面(或页面中的重要组件)封装成一个类。这个类包含:

  1. 元素定位器:这个页面上所有需要操作的元素(如输入框、按钮)的定位方式。
  2. 页面操作方法:封装对这个页面上元素的操作(如输入、点击)。
  3. 业务组合方法:将多个页面操作组合成一个完整的业务流(如登录、下单)。

这样做的好处巨大:

  • 高复用性:元素定位只写一次,多处使用。
  • 低维护成本:前端页面UI变动时,你只需要修改对应Page Class中的定位器,所有测试用例无需改动。
  • 高可读性:测试用例读起来就像自然语言,例如login_page.input_username(“admin”)

4.1 实战:用POM重构百度搜索

我们创建一个简单的POM结构:

project_root/ ├── pages/ # 存放页面类 │ └── baidu_page.py ├── tests/ # 存放测试用例 │ └── test_baidu_search.py ├── conftest.py # Pytest的共享配置和Fixture └── requirements.txt # 项目依赖

第一步:定义页面类 (pages/baidu_page.py)

from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class BaiduPage: # 1. 元素定位器 (Locators) SEARCH_INPUT = (By.ID, ‘kw‘) SEARCH_BUTTON = (By.ID, ‘su‘) FIRST_RESULT = (By.XPATH, ‘//div[@id="content_left"]//h3/a‘) # 第一个搜索结果链接 def __init__(self, driver): self.driver = driver self.wait = WebDriverWait(self.driver, 10) # 显式等待,最多等10秒 # 2. 页面操作方法 def open(self): """打开百度首页""" self.driver.get("https://www.baidu.com") return self def input_search_keyword(self, keyword): """在搜索框输入关键词""" search_box = self.wait.until(EC.presence_of_element_located(self.SEARCH_INPUT)) search_box.clear() search_box.send_keys(keyword) return self # 支持链式调用 def click_search_button(self): """点击百度一下按钮""" self.wait.until(EC.element_to_be_clickable(self.SEARCH_BUTTON)).click() return self def get_first_result_text(self): """获取第一个搜索结果的文本""" first_link = self.wait.until(EC.presence_of_element_located(self.FIRST_RESULT)) return first_link.text # 3. 业务组合方法(可选,但推荐) def search(self, keyword): """完整的搜索业务流:打开页面 -> 输入 -> 点击""" self.open().input_search_keyword(keyword).click_search_button() return self # 返回自身,方便链式调用后继续操作结果页

关键改进

  • 显式等待WebDriverWait:替代了丑陋的time.sleep。它会每隔一段时间(默认0.5秒)检查条件是否满足(如元素出现、可点击),满足则立即继续,最多等待指定时间(这里10秒)。这大大提高了测试的稳定性和执行速度。EC.presence_of_element_located表示“元素出现在DOM中”,EC.element_to_be_clickable表示“元素可点击”。
  • 链式调用:每个页面方法返回self,允许你像page.open().input(‘xxx‘).click()这样写,代码更流畅。

第二步:编写测试用例 (tests/test_baidu_search.py)

import pytest from pages.baidu_page import BaiduPage class TestBaiduSearch: """百度搜索测试类""" def test_search_and_verify_result(self, browser): # 使用Fixture ‘browser‘ """测试搜索功能,并验证结果""" baidu_page = BaiduPage(browser) # 执行搜索 baidu_page.search("Selenium官方网站") # 获取结果并断言 first_result = baidu_page.get_first_result_text() assert "selenium" in first_result.lower() # 不区分大小写包含 def test_empty_search(self, browser): """测试空搜索""" baidu_page = BaiduPage(browser) baidu_page.open().click_search_button() # 断言页面没有发生错误跳转,通常空搜索会留在原页面 assert “百度一下” in browser.title

测试用例变得非常清晰,只关注测试逻辑和断言,所有页面操作的细节都被隐藏在了BaiduPage类中。

第三步:创建共享Fixture (conftest.py)

Fixture是Pytest的精华,用于提供测试依赖(如浏览器实例),并管理其生命周期(如启动和关闭)。

import pytest from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service # 如果驱动不在PATH,需要导入Service并指定路径 # from selenium.webdriver.chrome.service import Service @pytest.fixture(scope="class") def browser(): """提供一个浏览器实例给测试类,该类所有测试方法共用同一个浏览器""" # 可选:配置浏览器选项 chrome_options = Options() chrome_options.add_argument(‘--headless‘) # 无头模式,不显示浏览器界面,适合CI环境 chrome_options.add_argument(‘--no-sandbox‘) chrome_options.add_argument(‘--disable-dev-shm-usage‘) chrome_options.add_argument(‘--disable-gpu‘) # 初始化浏览器驱动 # 方式1:驱动在PATH driver = webdriver.Chrome(options=chrome_options) # 方式2:驱动不在PATH,需指定路径(示例) # service = Service(‘/path/to/your/chromedriver‘) # driver = webdriver.Chrome(service=service, options=chrome_options) driver.implicitly_wait(10) # 隐式等待,全局生效。查找元素时,如果立即没找到,会等待最多10秒。 driver.maximize_window() yield driver # 将driver对象提供给测试用例 # 测试类结束后,执行清理工作 driver.quit()

Fixture详解

  • @pytest.fixture:声明这是一个Fixture。
  • scope=”class”:这个Fixture的作用域是“类级别”。这意味着TestBaiduSearch这个类里的所有测试方法,都会共用同一个browser实例,只在类开始时打开一次浏览器,类结束时关闭。这比“函数级别”(每个测试方法都开闭一次浏览器)快得多。你可以根据测试的独立性需求调整作用域。
  • yield:这是Fixture提供资源的关键。yield之前的代码是“设置”(setup),yield返回资源(driver)给测试用例使用,yield之后的代码是“清理”(teardown),无论测试成功还是失败都会执行。
  • 无头模式 (--headless):在服务器或CI/CD流水线中运行测试时,没有图形界面,必须开启此模式。
  • 隐式等待implicitly_wait:这是对find_element等查找操作的全局等待。它和显式等待WebDriverWait的区别在于,隐式等待是“被动”的,只在查找元素时生效;显式等待是“主动”的,可以等待更复杂的条件(如元素可点击、包含特定文本)。最佳实践是两者结合使用,隐式等待设一个较短时间(如5秒)作为兜底,复杂条件用显式等待。

现在,在项目根目录下运行测试:

pytest tests/ -v --html=report.html

-v输出详细信息,--html=report.html会生成一个HTML格式的测试报告。

5. 高级技巧与最佳实践

框架搭好了,能跑起来了,但要写出真正稳定、高效、易维护的自动化脚本,还需要掌握下面这些“内功心法”。

5.1 元素定位:稳如泰山的基石

元素定位是自动化测试的“任督二脉”,定位不稳,一切白搭。优先级如下:

  1. ID:唯一且最快,首选。
  2. Name:通常也唯一,次选。
  3. CSS Selector:功能强大,语法简洁,性能好。例如#kw(ID为kw),.s_ipt(class包含s_ipt)。
  4. XPath:最强大但最慢,在CSS无法定位复杂关系时使用。尽量避免使用绝对路径(以/开头),因为它极度脆弱。使用相对路径和属性组合,如//input[@name=‘wd‘]
  5. Link Text / Partial Link Text:仅用于链接。

实操心得:很多现代前端框架(如React, Vue)生成的元素ID是动态的,每次刷新都变。这时不要用ID,转而使用其他稳定的属性,或者让开发同学为关键测试元素添加固定的>from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) # 等待元素可见并可点击 element = wait.until(EC.element_to_be_clickable((By.ID, “myButton”))) element.click() # 等待元素包含特定文本 wait.until(EC.text_to_be_present_in_element((By.ID, “status”), “完成”)) # 等待新窗口出现 wait.until(EC.number_of_windows_to_be(2))

常用的EC条件还有:presence_of_element_located(元素存在),visibility_of_element_located(元素可见),alert_is_present(出现弹窗)等。

5.3 测试数据管理

不要把测试数据(如用户名、密码、搜索词)硬编码在脚本里。推荐使用外部文件管理,如JSON、YAML或Excel。

# config.json { “base_url”: “https://www.baidu.com“, “search_keyword”: “自动化测试”, “valid_user”: {“username”: “testuser”, “password”: “123456”} } # 在conftest.py或工具类中读取 import json with open(‘config.json‘, ‘r‘, encoding=‘utf-8‘) as f: CONFIG = json.load(f) # 在测试用例中使用 def test_login(valid_user): username = CONFIG[“valid_user”][“username”]

对于大量、复杂的测试数据,可以考虑使用pytest@pytest.mark.parametrize装饰器进行参数化测试。

5.4 失败截图与日志

测试失败时,一张截图抵得上千言万语。我们可以在Fixture或Pytest的钩子函数中自动截图。

# 在conftest.py中修改browser fixture @pytest.fixture(scope=“class”) def browser(request): # 传入request对象 driver = webdriver.Chrome() yield driver # 如果测试失败,截图 if request.node.rep_call.failed: screenshot_dir = “./screenshots” os.makedirs(screenshot_dir, exist_ok=True) timestamp = time.strftime(“%Y%m%d_%H%M%S”) test_name = request.node.name screenshot_path = os.path.join(screenshot_dir, f”{test_name}_{timestamp}.png“) driver.save_screenshot(screenshot_path) print(f”测试失败,截图已保存至:{screenshot_path}“) driver.quit() # 需要配合pytest的钩子函数来获取测试结果 @pytest.hookimpl(tryfirst=True, hookwrapper=True) def pytest_runtest_makereport(item, call): outcome = yield rep = outcome.get_result() setattr(item, “rep_” + rep.when, rep) # 将报告对象存储到item中

同时,使用Python内置的logging模块或pytest自带的s对象来打印详细的运行日志,方便回溯。

5.5 集成Allure生成精美报告

HTML报告太简陋?Allure报告能提供时间线、用例分类、步骤详情、附件(截图、日志)等,是汇报工作的神器。

  1. 确保已安装allure-pytest
  2. 运行测试时添加参数:
    pytest tests/ -v --alluredir=./allure-results
  3. 生成并查看报告:
    allure serve ./allure-results # 本地生成并打开网页 # 或 allure generate ./allure-results -o ./allure-report --clean # 生成静态报告文件夹

在测试用例中,你可以用装饰器添加更详细的描述:

import allure @allure.feature(“搜索功能”) @allure.story(“用户能通过关键词搜索到相关内容”) def test_search_and_verify_result(browser): with allure.step(“打开百度首页”): baidu_page = BaiduPage(browser) baidu_page.open() with allure.step(“输入关键词并搜索”): baidu_page.search(“Selenium”) with allure.step(“验证搜索结果”): assert “selenium” in baidu_page.get_first_result_text().lower()

6. 常见问题与排查技巧实录

即使框架再完善,自动化测试在运行时也会遇到各种“妖魔鬼怪”。下面是我总结的常见问题清单和“药方”。

6.1 元素定位不到 (NoSuchElementException)

  • 可能原因1:页面未加载完/元素是动态生成的
    • 排查:添加显式等待,等待元素出现或可见。检查是否用了presence_of_element_located(元素在DOM中)但元素不可见,应改用visibility_of_element_located
  • 可能原因2:元素在iframe或shadow DOM内
    • 排查:先用driver.find_elements(By.TAG_NAME, “iframe”)查看页面是否有iframe。如果有,必须先用driver.switch_to.frame(frame_element)切换到iframe内部,才能定位其中的元素。操作完后用driver.switch_to.default_content()切回主文档。
  • 可能原因3:元素属性是动态的(如ID变化)
    • 排查:使用更稳定的定位策略,如CSS Selector通过其他属性组合定位,或使用XPath的文本内容、相对位置定位。推动开发添加>pip install webdriver-manager
      from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service)
  • 可能原因2:CI服务器没有图形界面,而脚本未配置无头模式
    • 排查:确保在CI环境中启动浏览器时添加了--headless参数。
  • 可能原因3:CI服务器资源不足,页面加载超时
    • 排查:适当增加隐式等待和显式等待的超时时间。优化脚本,减少不必要的等待。

6.3 执行速度慢

  • 优化1:减少不必要的等待。用显式等待替代固定的sleep
  • 优化2:复用浏览器会话。使用scope=”class”scope=”session”的Fixture,避免每个用例都重启浏览器。
  • 优化3:并行执行。Pytest支持通过pytest-xdist插件并行运行测试。
    pip install pytest-xdist pytest tests/ -n 4 # 使用4个worker并行执行
  • 优化4:关闭不需要的浏览器特性。如--disable-images,--disable-javascript(谨慎使用)可以加速页面加载,但可能影响测试真实性。

6.4 如何处理弹窗、新窗口、Alert?

  • Alert/Confirm/Prompt
    from selenium.webdriver.common.alert import Alert alert = Alert(driver) print(alert.text) # 获取文本 alert.accept() # 点击“确定” # alert.dismiss() # 点击“取消” # alert.send_keys(“输入文本”) # 用于Prompt
  • 新窗口/标签页
    original_window = driver.current_window_handle # 点击某个打开新窗口的链接... WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2)) for window_handle in driver.window_handles: if window_handle != original_window: driver.switch_to.window(window_handle) break # 在新窗口操作... driver.close() # 关闭新窗口 driver.switch_to.window(original_window) # 切回原窗口

6.5 测试用例的独立性与稳定性

每条测试用例应该是独立的,不依赖其他用例的执行状态。这意味着:

  • 每个用例开始前,要确保处于已知的初始状态。例如,在登录测试的setup中先登出(如果有登录态)。
  • 使用Fixture的autouse=True@pytest.fixture(scope=”function”)来为每个用例做清理和准备。
  • 小心处理测试数据。如果用例会创建数据(如新建订单),最好在用例结束时也清理掉(teardown),或者使用专门为测试准备的、可重复使用的测试账号和数据。

Web自动化测试是一个需要不断实践和总结的领域。从搭建环境、编写第一个脚本,到设计POM框架、处理各种异常场景,每一步都充满了挑战,但每解决一个问题,你对软件质量和开发流程的理解就会更深一层。记住,自动化的目的不是取代手工测试,而是将人从重复劳动中解放出来,去做更有价值的探索、设计和沟通工作。这套指南为你铺好了从概念到实战的路,剩下的就是动手去写,去踩坑,然后爬出来。当你第一次看到一整套用例在深夜自动运行完毕,并生成一份漂亮的测试报告时,那种成就感就是最好的回报。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 15:22:10

如何分辨一个 Fiori 应用是 SAP UI5 原生开发的,还是运行在浏览器里的套壳 SAPGUI 事务码应用?

这次上传的 DevTools 截图把判断补上了最关键的一块证据。前一张图只靠视觉特征判断时,我会说它极大概率是嵌入在 Fiori Launchpad 里的 SAP GUI for HTML 页面。现在看到这个 input field 对应的原生 HTML 之后,结论可以收紧为,业务区域不是 SAPUI5 原生开发的 Fiori 应用,…

作者头像 李华
网站建设 2026/6/18 15:20:30

Gemini 3.1 Pro升级实战:多模态理解与长上下文优化指南

1. 项目概述:这不是一次普通升级,而是一次能力边界的重新丈量2026年实测Gemini 3.1 Pro高阶版——这个标题里藏着三个关键信号:时间锚点“2026”,对象明确“Gemini 3.1 Pro”,动作精准“高阶版升级”。它不是泛泛而谈的…

作者头像 李华
网站建设 2026/6/18 15:19:48

免费终极指南:3步让Windows变身专业AirPlay接收器

免费终极指南:3步让Windows变身专业AirPlay接收器 【免费下载链接】airplay2-win Airplay2 for windows 项目地址: https://gitcode.com/gh_mirrors/ai/airplay2-win 你是否曾经羡慕Mac用户能够轻松将iPhone或iPad屏幕镜像到电脑上?作为Windows用…

作者头像 李华
网站建设 2026/6/18 15:18:13

自动驾驶多传感器标定终极指南:OpenCalib如何实现厘米级精度

自动驾驶多传感器标定终极指南:OpenCalib如何实现厘米级精度 【免费下载链接】SensorsCalibration OpenCalib: A Multi-sensor Calibration Toolbox for Autonomous Driving 项目地址: https://gitcode.com/gh_mirrors/se/SensorsCalibration 在自动驾驶系统…

作者头像 李华
网站建设 2026/6/18 15:07:57

英雄联盟Akari助手:从新手到高手的3个实战进阶指南

英雄联盟Akari助手:从新手到高手的3个实战进阶指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为每次游戏前繁琐的符文配置…

作者头像 李华
网站建设 2026/6/18 15:06:52

UART硬件流控制、循环模式与多机通信配置详解

1. UART通信基础与流控制机制详解在嵌入式开发和工业控制领域,UART(通用异步收发传输器)几乎是工程师最常打交道的通信接口之一。它结构简单,无需时钟线,仅凭两根数据线(TxD和RxD)就能实现全双工…

作者头像 李华