news 2026/6/21 18:34:04

UI自动化测试核心操作实战:输入、点击、弹窗与下拉框全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UI自动化测试核心操作实战:输入、点击、弹窗与下拉框全解析

1. 项目概述:UI自动化核心操作实战

搞UI自动化测试,最基础也最核心的,就是和页面上的各种元素“打交道”。输入个账号密码、点个登录按钮、处理下突然冒出来的弹窗、选个下拉框里的选项……这些操作看似简单,但真要写出一套稳定、健壮的自动化脚本,里头的门道可不少。我见过太多新手写的脚本,在本地跑得飞起,一到正式环境或者数据稍一变就“趴窝”,问题往往就出在这些基础操作的细节处理上。

今天这篇,我们就抛开那些高大上的框架设计和模式理论,聚焦于UI自动化的“基本功”:输入、点击、弹窗、下拉框这四大核心操作的全场景实战。我会结合自己踩过的坑和积累的经验,把每个操作在不同场景下的处理方式、常见的“坑点”以及如何写出更鲁棒的代码,掰开揉碎了讲清楚。无论你是用Selenium、Playwright还是Appium,这些核心逻辑都是相通的。我们的目标很简单:让你写的每一个send_keys、每一个click都经得起考验。

2. 核心操作一:输入操作的艺术

输入操作,远不止是element.send_keys(“text”)这么简单。一个健壮的输入操作,需要考虑元素状态、内容清除、输入速度、特殊字符乃至输入法等一系列问题。

2.1 输入前的准备:确保元素可交互

在往一个输入框里塞内容之前,必须确认这个输入框已经“准备好了”。直接发送按键,很可能因为元素不可见、被禁用或者未加载完成而失败。

核心检查点:

  1. 可见性与可用性:元素必须在视窗内,且enabled属性为true。很多前端框架(如Vue、React)在数据绑定前,输入框可能是disabled状态。
  2. 等待策略:必须使用显式等待(Explicit Wait),而不是死板的sleep。等待条件应该是“元素可交互”(如Selenium的element_to_be_clickable或Playwright的wait_for_selector配合state: visible)。

实操代码示例(Python + Selenium WebDriver):

from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def safe_send_keys(driver, locator, text, timeout=10): """ 安全的输入函数 :param driver: WebDriver实例 :param locator: 元素定位器,如 (By.ID, “username”) :param text: 要输入的文本 :param timeout: 最大等待时间 """ try: # 1. 等待元素出现并可交互 element = WebDriverWait(driver, timeout).until( EC.element_to_be_clickable(locator) ) # 2. 先点击一下,确保焦点(某些自定义组件需要) element.click() # 3. 清空原有内容(注意:不是所有场景都需要) element.clear() # 一个小技巧:clear()有时对富文本编辑器无效,可以模拟Ctrl+A+Delete # element.send_keys(Keys.CONTROL, ‘a’) # element.send_keys(Keys.DELETE) # 4. 输入文本 element.send_keys(text) # 5. (可选)触发输入事件,对于某些依赖JS事件监听的框架很重要 driver.execute_script(“arguments[0].blur();”, element) print(f“成功在 {locator} 输入文本: {text}”) except Exception as e: print(f“输入操作失败,定位器: {locator}, 错误: {str(e)}”) raise

注意clear()方法并非万能。对于通过JavaScript动态设置值的输入框(例如一些Vue/React框架管理的输入框),clear()可能无法触发前端的数据绑定更新。此时,更可靠的方式是先全选再删除,或者直接通过JavaScript设置value属性。

2.2 高级输入场景处理

场景一:文件上传文件上传不是send_keys一个本地路径那么简单。首先要区分上传控件的类型:

  • <input type=“file”>:这是最简单的,直接对input元素使用send_keys(文件绝对路径)即可。
  • 自定义上传按钮:通常需要先点击按钮,触发系统文件选择窗口。此时无法直接通过WebDriver操作系统窗口。解决方案有两种:1)如果前端支持,直接将文件路径send_keys到隐藏的file input元素;2)使用第三方工具如pyautogui模拟键盘操作(不推荐,不稳定且依赖操作系统和屏幕分辨率)。更推荐第一种,需要让开发同学暴露那个隐藏的input元素供测试使用。

场景二:富文本编辑器例如TinyMCE、CKEditor等。不能直接定位到iframe里的编辑框。步骤:

  1. 切换到对应的iframe
  2. 定位到编辑器的body(通常是一个可编辑的<div><p>标签)。
  3. 使用send_keys输入,或通过execute_script直接设置innerHTML
# 假设编辑器在一个iframe里 driver.switch_to.frame(“editor_iframe_id”) editor_body = driver.find_element(By.TAG_NAME, “body”) editor_body.send_keys(“这是富文本内容”) driver.switch_to.default_content() # 操作完后切回主文档

场景三:模拟真人输入速度对于有输入频率限制或需要触发特定键盘事件的场景,快速send_keys可能被识别为脚本。可以拆分成单个字符输入,并加入微小延迟。

import time def slow_type(element, text, delay=0.1): for character in text: element.send_keys(character) time.sleep(delay)

3. 核心操作二:点击操作的陷阱与征服

点击是交互的触发器,但“点不上”、“点错了”是自动化中最常见的问题之一。

3.1 为什么你的点击会失效?

  1. 元素被遮挡:这是头号杀手。可能是弹窗、悬浮提示(tooltip)、另一个元素(如<div>)覆盖在了目标按钮之上。WebDriver会严格遵守这个规则,点击被遮挡的元素会抛出ElementClickInterceptedException

    • 排查:使用浏览器的开发者工具,检查元素上方是否有其他半透明或不可见的层。
    • 解决:移除遮挡物(如关闭弹窗),或尝试点击该元素的其他可见部分(如下方边缘),或者使用JavaScript直接执行点击事件(driver.execute_script(“arguments[0].click();”, element))。但需注意,JS点击可能不会触发所有原生事件监听器。
  2. 元素状态未就绪:元素虽然可见,但可能CSS样式(如pointer-events: none)或属性(disabled)使其不可点击。必须等待element_to_be_clickable条件成立。

  3. 坐标偏移与动态元素:对于使用了复杂CSS变换(transform)或动画的元素,其视觉位置与DOM位置可能不同,导致点击偏差。对于动态加载列表中的元素,定位到时可能其位置已经发生变化(例如又加载了新项)。

3.2 稳健点击策略与实践

策略一:复合等待与重试不要只依赖一次查找和点击。实现一个带重试机制的点击函数。

from selenium.common.exceptions import ElementClickInterceptedException, StaleElementReferenceException def robust_click(driver, locator, retries=3): for attempt in range(retries): try: element = WebDriverWait(driver, 10).until( EC.element_to_be_clickable(locator) ) element.click() print(f“点击成功: {locator}”) return True except (ElementClickInterceptedException, StaleElementReferenceException) as e: print(f“点击尝试 {attempt + 1} 失败,原因: {e}”) if attempt == retries - 1: raise time.sleep(1) # 等待一秒后重试 return False

策略二:JavaScript点击作为备选当常规点击因遮挡等问题失败时,可以尝试使用JavaScript执行点击。但务必了解其局限性:它直接调用元素的click方法,可能绕过一些前端框架的事件处理层。

def js_click(driver, element): driver.execute_script(“arguments[0].click();”, element) print(“使用JS点击执行”)

策略三:应对动态内容与列表点击列表中的某项(如搜索结果的第一个条目)时,最好在等待元素可点击后,立即执行点击,减少因列表刷新导致元素失效(Stale Element)的风险。避免先获取一堆元素存入列表,再遍历点击。

场景实战:勾选框与单选框对于<input type=“checkbox”>radio,不要通过点击其旁边的label文本来实现(虽然用户常这么做)。最稳定的方式是定位到input元素本身,然后使用.click()或设置其checked属性。点击label可能因为labelfor属性绑定问题而失败。

checkbox = driver.find_element(By.ID, “agree-terms”) if not checkbox.is_selected(): # 先检查状态,避免不必要的操作 checkbox.click()

4. 核心操作三:弹窗处理的多面手

弹窗是UI自动化中的“中断器”,必须妥善处理,否则脚本会卡住或误操作。弹窗主要分三类:浏览器原生弹窗(Alert、Confirm、Prompt)、自定义模态框、非模态提示(Toast)。

4.1 浏览器原生弹窗

这类弹窗由window.alert(),confirm(),prompt()触发,WebDriver提供了专门的API。

  • Alert:只有提示信息和“确定”按钮。使用driver.switch_to.alert.accept()接受。
  • Confirm:有“确定”和“取消”。accept()为确定,dismiss()为取消。
  • Prompt:有输入框。在accept()dismiss()前,可用send_keys()输入文本。

关键点:操作弹窗前必须switch_to.alert,操作后弹窗会自动关闭。必须使用显式等待等待弹窗出现,因为弹窗是异步的。

from selenium.webdriver.common.alert import Alert from selenium.common.exceptions import NoAlertPresentException def handle_native_alert(driver, action=“accept”, text=None, wait_time=5): """ 处理原生弹窗 :param action: ‘accept’, ‘dismiss’ :param text: 仅对prompt有效,要输入的文本 """ try: WebDriverWait(driver, wait_time).until(EC.alert_is_present()) alert = Alert(driver) if text is not None: alert.send_keys(text) if action == “accept”: alert.accept() else: alert.dismiss() print(f“已处理原生弹窗,执行动作: {action}”) except NoAlertPresentException: print(“等待超时,未出现预期的原生弹窗”) # 这里可以记录日志或根据业务逻辑决定是否抛出异常

4.2 自定义模态框(Modal)

这是最常见的弹窗形式,实质是页面内的一个<div>层,通常有半透明遮罩。切勿尝试用处理原生弹窗的方式去处理它!

处理步骤:

  1. 定位弹窗本身:等待弹窗的根元素(通常有modaldialogel-dialog等类名)出现并可见。
  2. 在弹窗内部操作:所有后续的查找元素操作,其作用域都应限制在这个弹窗元素内。可以使用WebElementfind_element方法。
  3. 关闭弹窗:找到关闭按钮(“X”、 “确定”、 “取消”)并点击。关闭后,通常需要等待弹窗不可见。
def handle_custom_modal(driver, modal_locator, close_button_locator=None, action=“close”): """ 处理自定义模态框 :param modal_locator: 模态框本体的定位器 :param close_button_locator: 关闭按钮的定位器。如果为None,则尝试点击模态框外的遮罩或按ESC :param action: ‘close’ 或 ‘accept’ (对应确定按钮) """ try: # 等待模态框出现 modal = WebDriverWait(driver, 10).until( EC.visibility_of_element_located(modal_locator) ) print(“自定义模态框已出现”) # 示例:在模态框里输入一些内容(假设有个输入框) # input_in_modal = modal.find_element(By.CSS_SELECTOR, “input.form-control”) # input_in_modal.send_keys(“test data”) # 关闭模态框 if close_button_locator: # 在modal范围内查找关闭按钮更精确 close_btn = modal.find_element(*close_button_locator) if isinstance(close_button_locator, tuple) else driver.find_element(*close_button_locator) close_btn.click() else: # 备选方案:按ESC键(需要模态框支持) from selenium.webdriver.common.keys import Keys modal.send_keys(Keys.ESCAPE) # 等待模态框消失 WebDriverWait(driver, 5).until( EC.invisibility_of_element_located(modal_locator) ) print(“自定义模态框已关闭”) except TimeoutException: print(“处理自定义模态框超时”) raise

实操心得:很多前端框架(如Element UI, Ant Design)的模态框在关闭时有淡出动画。如果刚点击关闭按钮就立刻去操作后面的元素,可能会因为动画未结束而失败。因此,等待弹窗“不可见”(invisibility_of_element_located)是至关重要的一步。

4.3 非模态提示(Toast/Snackbar)

这类提示通常自动出现,几秒后消失。自动化脚本需要检测其出现,并验证提示信息内容,然后等待其消失,避免影响后续操作。

def verify_toast_message(driver, expected_text, toast_locator=(By.CLASS_NAME, “el-message”), timeout=5): """ 验证Toast提示信息 """ try: # 等待Toast出现 toast_element = WebDriverWait(driver, timeout).until( EC.visibility_of_element_located(toast_locator) ) actual_text = toast_element.text print(f“检测到Toast提示: {actual_text}”) assert expected_text in actual_text, f“Toast信息不符。期望包含‘{expected_text}’,实际为‘{actual_text}’” # 等待Toast消失 WebDriverWait(driver, timeout).until( EC.invisibility_of_element_located(toast_locator) ) print(“Toast提示已消失”) return True except TimeoutException: print(“未在指定时间内检测到或消失Toast提示”) return False

5. 核心操作四:下拉框的精准操控

下拉框主要分两种:原生<select>元素和用<div>模拟的自定义下拉框。处理方式完全不同。

5.1 原生<select>元素

处理起来最简单,使用Selenium的Select类。

from selenium.webdriver.support.ui import Select select_element = driver.find_element(By.NAME, “country”) select = Select(select_element) # 1. 通过可见文本选择 select.select_by_visible_text(“中国”) # 2. 通过value属性选择(更稳定,不依赖UI文本变化) select.select_by_value(“CN”) # 3. 通过索引选择(最不推荐,顺序易变) # select.select_by_index(1) # 获取所有选项 all_options = select.options for option in all_options: print(option.text, option.get_attribute(“value”)) # 获取当前选中项 selected_option = select.first_selected_option print(f“当前选中: {selected_option.text}”)

注意事项Select类只适用于标准的<select>标签。如果遇到<select>但无法用Select类操作,可能是被JavaScript改造了,此时应按照自定义下拉框处理。

5.2 自定义下拉框

这是前端开发中最常见的形态,通常由<div><ul><li>等元素组合而成,通过JavaScript控制显示/隐藏。

通用处理流程:

  1. 点击触发器:点击下拉框的输入区域或小箭头,展开选项列表。
  2. 等待选项列表出现:等待代表下拉列表的容器元素(如.el-select-dropdown)变为可见。
  3. 定位并选择选项:在列表容器中,找到目标选项元素(如li)并点击。
  4. 等待列表消失:选择后,等待选项列表隐藏。
def select_custom_dropdown(driver, trigger_locator, option_text, list_container_locator): """ 选择自定义下拉框的选项 :param trigger_locator: 触发下拉的元素的定位器 :param option_text: 要选择的选项文本 :param list_container_locator: 下拉列表容器的定位器 """ # 1. 点击触发元素 trigger = WebDriverWait(driver, 10).until( EC.element_to_be_clickable(trigger_locator) ) trigger.click() print(“已点击下拉框触发器”) # 2. 等待下拉列表出现 list_container = WebDriverWait(driver, 5).until( EC.visibility_of_element_located(list_container_locator) ) # 3. 在下拉列表容器内查找目标选项 # 注意:这里使用list_container作为父元素进行查找,范围更精确 # 选项通常是一个列表项,如 li 或带特定class的div option_locator = (By.XPATH, f“.//*[contains(text(), ‘{option_text}’)]”) target_option = WebDriverWait(list_container, 5).until( EC.element_to_be_clickable(option_locator) ) target_option.click() print(f“已选择选项: {option_text}”) # 4. 等待下拉列表消失(可选,但建议) WebDriverWait(driver, 5).until( EC.invisibility_of_element_located(list_container_locator) )

复杂场景:可搜索的下拉框(Select with Search)这种下拉框在点击后,会出现一个输入框让你过滤选项。处理步骤:

  1. 点击触发器,展开下拉列表。
  2. 定位到下拉列表内的搜索输入框,输入关键词。
  3. 等待选项列表刷新(可能需要短暂等待或监听DOM变化)。
  4. 从过滤后的结果中选择目标选项。

更复杂的场景:级联选择器(Cascader)如省市区选择。处理思路是逐层点击展开。通常每一层点击后,下一级选项会动态加载。需要为每一级选项的展开和选择编写步骤,并加入适当的等待。

6. 全场景融合实战与异常处理

掌握了单个操作后,我们需要将它们串联起来,处理一个完整的、可能存在各种“意外”的流程。

6.1 实战案例:用户登录流程

假设一个登录页面,包含用户名输入框、密码输入框、登录按钮,登录成功后可能有欢迎Toast,失败则有错误提示弹窗。

def test_user_login(driver, username, password, expect_success=True): """ 测试用户登录 """ # 0. 访问登录页 driver.get(“https://your-app.com/login”) # 1. 输入用户名(使用我们封装的安全输入函数) safe_send_keys(driver, (By.ID, “username”), username) # 2. 输入密码 safe_send_keys(driver, (By.ID, “password”), password) # 3. 点击登录按钮(使用稳健点击) robust_click(driver, (By.XPATH, “//button[@type=‘submit’]”)) # 4. 结果断言与处理 if expect_success: # 期望成功:验证登录后跳转或出现欢迎信息 WebDriverWait(driver, 10).until( EC.url_contains(“/dashboard”) # 或等待某个dashboard特有元素 ) # 验证欢迎Toast verify_toast_message(driver, “登录成功”, (By.CLASS_NAME, “ant-message-success”)) print(“登录成功流程测试通过”) else: # 期望失败:验证错误弹窗 error_modal_locator = (By.CLASS_NAME, “el-message-box”) try: # 等待错误弹窗出现 error_modal = WebDriverWait(driver, 5).until( EC.visibility_of_element_located(error_modal_locator) ) error_text = error_modal.find_element(By.CLASS_NAME, “el-message-box__message”).text print(f“捕获到预期错误弹窗,信息: {error_text}”) # 点击弹窗的确定按钮关闭它 confirm_btn = error_modal.find_element(By.XPATH, “.//button/span[contains(text(),‘确定’)]”) confirm_btn.click() # 等待弹窗消失 WebDriverWait(driver, 3).until( EC.invisibility_of_element_located(error_modal_locator) ) print(“错误弹窗已处理,登录失败流程测试通过”) except TimeoutException: print(“预期内的错误弹窗未出现,测试失败!”) raise AssertionError(“登录失败时未显示错误提示”)

6.2 常见异常与全局处理策略

即使单个操作封装得很好,在复杂的业务流程中,异常仍可能发生。我们需要一个全局的异常处理与恢复策略。

策略一:页面状态重置当某个关键步骤失败导致流程无法继续时,最直接的方法是回到一个已知的稳定状态。对于Web应用,通常是回首页或刷新当前页。

def reset_to_known_state(driver, home_url): """重置到已知状态(如首页)""" current_url = driver.current_url if home_url not in current_url: driver.get(home_url) print(“已导航回首页进行状态重置”) else: driver.refresh() print(“已在首页,执行刷新重置状态”) # 等待页面关键元素加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, “main-container”)) )

策略二:弹窗拦截器在非预期弹窗(如广告、浏览器通知请求)突然出现时,脚本会中断。可以设置一个“弹窗监控”机制,在每次主要操作前尝试处理已知的干扰弹窗。

def dismiss_known_popups(driver): """尝试关闭已知的干扰弹窗或通知""" # 示例:关闭可能的浏览器通知请求 try: alert = driver.switch_to.alert alert.dismiss() print(“已关闭浏览器弹窗”) except: pass # 没有弹窗,继续 # 示例:关闭页面内可能的广告遮罩(根据实际UI调整选择器) popup_selectors = [ “div[class*=‘ad-close’]”, “button.close”, “.modal-close” ] for selector in popup_selectors: try: elements = driver.find_elements(By.CSS_SELECTOR, selector) for elem in elements: if elem.is_displayed(): elem.click() print(f“已关闭干扰元素: {selector}”) time.sleep(0.5) # 给关闭动画一点时间 except: continue

策略三:操作失败后的智能重试与截图将关键操作步骤包裹在重试逻辑中,并在最终失败时保存截图和页面源代码,便于事后分析。

def execute_with_retry_and_screenshot(driver, operation_func, *args, max_retries=2, **kwargs): """带重试和失败截图的操作执行器""" last_exception = None for i in range(max_retries + 1): # 尝试 max_retries + 1 次 try: return operation_func(*args, **kwargs) except Exception as e: last_exception = e print(f“操作第{i+1}次尝试失败: {str(e)}”) if i < max_retries: print(“等待2秒后重试...”) time.sleep(2) # 可选:先重置状态再重试 # reset_to_known_state(driver, kwargs.get(‘home_url’)) else: # 最终失败,保存现场 save_debug_info(driver, operation_func.__name__) raise last_exception def save_debug_info(driver, step_name): """保存调试信息(截图和页面源码)""" timestamp = datetime.now().strftime(“%Y%m%d_%H%M%S”) screenshot_path = f”./debug_screenshots/failure_{step_name}_{timestamp}.png” html_path = f”./debug_html/failure_{step_name}_{timestamp}.html” driver.save_screenshot(screenshot_path) with open(html_path, “w”, encoding=“utf-8”) as f: f.write(driver.page_source) print(f“调试信息已保存: {screenshot_path}, {html_path}”)

将这些策略融入到你的测试框架中(例如,作为BasePage类的方法),可以极大提升自动化脚本在复杂、不稳定环境下的生存能力。

7. 进阶技巧与最佳实践

当基础操作稳定后,我们可以追求更高效、更可维护的代码。

7.1 使用Page Object模式封装操作

这是UI自动化测试的黄金法则。将每个页面或组件封装成一个类,页面的元素定位器和操作作为类的方法。这样,测试脚本变得清晰,元素定位变更只需修改一处。

class LoginPage: def __init__(self, driver): self.driver = driver self.username_input = (By.ID, “username”) self.password_input = (By.ID, “password”) self.submit_button = (By.XPATH, “//button[@type=‘submit’]”) self.error_modal = (By.CLASS_NAME, “el-message-box”) def load(self): self.driver.get(“https://your-app.com/login”) WebDriverWait(self.driver, 10).until( EC.presence_of_element_located(self.username_input) ) return self def enter_credentials(self, username, password): safe_send_keys(self.driver, self.username_input, username) safe_send_keys(self.driver, self.password_input, password) return self def submit(self): robust_click(self.driver, self.submit_button) return self def get_error_message(self): try: element = WebDriverWait(self.driver, 5).until( EC.visibility_of_element_located(self.error_modal) ) return element.text except TimeoutException: return None # 在测试脚本中的使用变得极其简洁 def test_login(): driver = webdriver.Chrome() login_page = LoginPage(driver).load() login_page.enter_credentials(“wrong_user”, “wrong_pwd”).submit() assert “用户名或密码错误” in login_page.get_error_message() driver.quit()

7.2 利用更智能的等待条件

除了visibility_of_element_locatedelement_to_be_clickable,Selenium和Playwright提供了更多有用的等待条件,例如:

  • text_to_be_present_in_element:等待元素包含特定文本。非常适合验证操作结果。
  • staleness_of:等待一个元素从DOM中移除。常用于等待旧页面元素消失。
  • presence_of_all_elements_located:等待至少一个匹配的元素出现。
  • 自定义等待条件:当内置条件不满足时,可以自己写。
# 自定义:等待元素存在且其属性包含特定值 def wait_for_attribute(element_locator, attribute, value, timeout=10): def predicate(driver): element = driver.find_element(*element_locator) if element and value in element.get_attribute(attribute): return element else: return False return WebDriverWait(driver, timeout).until(predicate)

7.3 针对动态内容的稳定定位策略

现代前端应用大量使用动态ID、随机生成的类名。避免使用绝对路径和脆弱的定位器。

  • 优先级id>name>CSS Selector>XPath
  • 相对XPath:使用元素间的相对关系、文本内容、属性组合来定位。例如://button[contains(@class, ‘btn-primary’) and text()=‘登录’]
  • CSS Selector:通常比XPath性能更好,更易读。例如:input.form-control[name=‘email’]
  • 借助开发同学:为重要的可测试元素添加稳定的>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 18:33:37

MMA955xL智能传感器CodeWarrior服务包安装与配置全攻略

1. 项目概述与核心价值在嵌入式开发领域&#xff0c;尤其是涉及传感器融合与智能算法的应用&#xff0c;一个稳定且功能完备的开发环境是项目成功的基石。飞思卡尔&#xff08;现恩智浦&#xff09;的MMA955xL系列智能加速度计&#xff0c;凭借其内置的ColdFire v1微控制器内核…

作者头像 李华
网站建设 2026/6/21 18:28:51

League Akari终极指南:英雄联盟玩家的自动化工具箱

League Akari终极指南&#xff1a;英雄联盟玩家的自动化工具箱 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于英雄联盟…

作者头像 李华
网站建设 2026/6/21 18:16:40

张量网络在机器学习中的应用:模型压缩与量子计算前沿

1. 项目概述&#xff1a;当张量网络遇见机器学习如果你在机器学习领域摸爬滚打了一段时间&#xff0c;尤其是在模型优化或者前沿计算架构上花过心思&#xff0c;那么“张量网络”这个词大概率已经在你耳边晃悠过好几次了。它听起来有点高深&#xff0c;像是量子物理领域的专属名…

作者头像 李华
网站建设 2026/6/21 18:05:51

RPG Maker Decrypter终极教程:如何轻松解密和提取RPG游戏资源

RPG Maker Decrypter终极教程&#xff1a;如何轻松解密和提取RPG游戏资源 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_mirro…

作者头像 李华