告别“手工点点点”!用 Selenium 框架,让你的 Web 测试效率飙升100倍![特殊字符]

嘿,各位热爱代码(以及点鼠标)的小伙伴们!👋

是不是还在每天辛勤地“点点点”,测试一个个网页功能? 😭 感觉自己的手指都要磨出茧子了?别担心!今天,我将带你进入一个神奇的领域——Web 自动化测试框架,特别是风靡全球的 Selenium

想象一下,你只需要写一小段代码,它就能替你完成成千上万次的点击、输入、验证…… 这听起来是不是像是在开挂? 😎

别再被“点点点”的枯燥束缚了,准备好你的键盘,一起解锁 Web 测试的“超能力”吧!

在正式启航之前,如果你觉得这篇教程“给力”,别忘了给我一个“素质三连”:点赞👍、关注➕、分享↗️!这对我来说就是最好的“营养液”! 💪


🚗 第一站:Selenium 是个啥?(它可不是那个卖汽车的!)

Selenium,听名字是不是以为是哪家汽车巨头? 🚗 哈哈,其实它是一位在 Web 自动化测试界“德高望重”的老司机!

简单来说,Selenium 就是一个强大的开源框架,它的主要工作是模拟人类在网页上的各种“神操作”——比如点击按钮、输入文字、提交表单,甚至还能抓取页面截图,帮你检查网站是不是“内外兼修”(功能和性能都棒棒的)。

它支持多种编程语言(Python、Java、C# 等),并且能在各种浏览器(Chrome、Firefox、Edge 等)上“驰骋”。

Selenium 主要能帮你做些啥?

  • 自动化测试: 将你手动测试的流程,转化为一行行代码,让电脑替你跑。
  • 性能测试: 测量网页加载需要多久,响应速度怎么样,帮你找出“短板”。
  • 页面截图: 自动截取网页不同状态的图片,帮你生成漂亮的测试报告,或者在出现问题时,留下“罪证”! 📸

总而言之,如果你想成为 Web 应用测试领域的“效率达人”,Selenium 绝对是你不可或缺的“武器库”。


✈️ 第二站:Selenium vs Appium,谁是你的菜?

很多人在学习自动化测试时,会遇到 Selenium 和 Appium 这对“难兄难弟”。它们名字听起来有点像,都能做自动化,但侧重点完全不同!

相同点:

  • “血缘关系”近: Appium 本质上是基于 Selenium 的思想进行二次开发的,所以它们在某些方面(比如定位元素的方式,clicksend_keys 等操作)是挺像的。

不同点(关键点来了!):

特性SeleniumAppium
应用领域Web 应用 (浏览器里的网页)移动 App (手机上的 APP )
底层技术浏览器驱动 (如 Chrome Driver)移动原生 API (iOS: XCUITest, Android: UiAutomator)
环境配置需要安装不同浏览器的 Driver需要模拟器/真机,配置 SDK 等
通信协议HTTP 协议WebDriver 协议

用大白话来说:

  • Selenium 就像一个“浏览器驾驶员”,专门负责驾驶浏览器,在网页上进行各种操作。
  • Appium 就像一个“手机应用司机”,专门驾驶手机 App,在屏幕上点点划划。

所以,看你的测试对象是网站还是 App,就能决定用谁啦!


🤖 第三站:Selenium 的“工作原理”——它到底怎么工作的?

你有没有好奇过,为什么你写的一行行代码,Selenium 就能让浏览器乖乖执行? 这背后有一套精密的“工作流程”!

  1. “发号施令”: 你的自动化测试脚本(Selenium Client)会“启动”一个 WebDriver 服务。
  2. “传达指令”: WebDriver 会启动对应的浏览器驱动程序(比如 Chrome Driver)。
  3. “建立连接”: 浏览器驱动程序会打开浏览器,并作为 WebDriver 的“远程服务器”,监听一个特定的端口。
  4. “沟通桥梁”: 所有的 Selenium 操作(访问网址、查找元素等),都会通过 WebDriver,以 HTTP 请求的方式发送到浏览器驱动程序。
  5. “执行动作”: 浏览器驱动程序接收到请求后,解析指令,并指挥浏览器去执行相应的动作(比如找到一个按钮并点击)。
  6. “反馈结果”: 浏览器执行完动作后,会将结果(成功、失败、元素信息等)通过驱动程序,反馈给你的测试脚本。

总结一下: 脚本 -> WebDriver -> 浏览器驱动 -> 浏览器 -> 执行 -> 浏览器驱动 -> WebDriver -> 脚本。 就像一个层层传递的“指挥链”!


📝 第四站:自动化测试的“实战剧本”

想想我们手动测试一个登录功能是怎么做的?

  1. 打开浏览器。
  2. 输入网址。
  3. 找到用户名输入框,输入用户名。
  4. 找到密码输入框,输入密码。
  5. 点击登录按钮。
  6. 看页面是不是跳转到登录后的页面(验证是否成功)。

而自动化测试,就是把这个过程“翻译”成代码:

  1. “请起!” 调用 WebDriver API 启动浏览器。
  2. “去哪儿?” 使用 get() 方法访问目标网址。
  3. “找人(元素)!” 使用各种“定位方式”找到用户名输入框。
  4. “喂点东西!” 使用 send_keys() 方法输入用户名。
  5. “重复以上步骤!” 找到密码框,输入密码。
  6. “该你了!” 找到登录按钮,执行 click() 操作。
  7. “检查一下!” 使用断言(比较函数),判断登录后的页面是否符合预期。

🛠️ 第五站:搭建你的“自动化练兵场”(环境搭建)

要玩转 Selenium,首先得把“装备”配齐!

  1. Python 3 环境: 这个基础就不用多说了吧?如果还没有,赶紧去 Python 官网乖乖安装!
  2. 浏览器驱动(WebDriver): 这是 Selenium 和浏览器“沟通”的桥梁。你需要下载和你 浏览器版本匹配 的驱动。
  3. 驱动放置在哪儿?
    • 最直接: 放在你浏览器的安装目录下(比如 Chrome.exe 所在的文件夹)。
    • Python 友好: 放在你的 Python 安装目录下。
    • 灵活: 放到任何一个你指定的地方,然后在代码里通过 executable_path 参数告诉 Selenium。

Selenium 库: 在你的 Python 环境里,打开命令行(终端),输入:bash复制代码 收起

pip install selenium

复制看见“Successfully installed selenium”就说明成功了! 🎉


🚀 第六站:Selenium 的“基础十八般武艺”

工欲善其事,必先利其器。下面这些基础操作,是你玩转 Selenium 的“入门十八般武艺”!

1. 浏览器操作函数:让浏览器“听你的话”!

python复制代码 收起

from selenium import webdriver from selenium.webdriver.common.by import By # 定位方式的“管理员” from selenium.webdriver.support.ui import WebDriverWait # 显示等待的“时间管理者” from selenium.webdriver.support import expected_conditions as EC # 等待的“条件控制器” import time # 强制等待的“老朋友” # 启动浏览器 (注意:Firefox 首字母要大写!) # driver = webdriver.Firefox() # 启动 Chrome driver = webdriver.Chrome() # 1. 最大化浏览器窗口 driver.maximize_window() # 2. 访问目标网址 (URL 必须以 http/https 开头) driver.get("https://www.example.com") # 替换成你想访问的网站 # 3. 后退/前进 driver.back() time.sleep(2) # 等待2秒,以免操作过快 driver.forward() time.sleep(2) # 4. 刷新浏览器 driver.refresh() time.sleep(2) # 5. 关闭当前窗口 driver.close() # driver.quit() # 退出所有窗口,结束 WebDriver 会话 (更常用!)

复制

2. 定位方式:找到页面上的“目标 NPC”!

页面上的每一个元素(按钮、输入框、链接等)都需要被精确找到,才能进行操作。Selenium 提供了多种定位方式,就像给每个 NPC 起了不同的“外号”:

定位方式描述示例写法(代码中)
By.ID根据元素的 id 属性定位driver.find_element(By.ID, "some_id")
By.CLASS_NAME根据元素的 class 属性定位driver.find_element(By.CLASS_NAME, "some_class")
By.NAME根据元素的 name 属性定位driver.find_element(By.NAME, "some_name")
By.LINK_TEXT根据链接的完整文本定位 (<a> 标签)driver.find_element(By.LINK_TEXT, "点击这里")
By.PARTIAL_LINK_TEXT根据链接的部分文本定位 (<a> 标签)driver.find_element(By.PARTIAL_LINK_TEXT, "这里")
By.TAG_NAME根据元素的标签名定位 (如 <div>, <p>)driver.find_element(By.TAG_NAME, "div")
By.XPATH强大的 XML 路径语言,万能定位!driver.find_element(By.XPATH, "//div[@class='hotwords']/a[1]")
By.CSS_SELECTORCSS 选择器,也是非常常用的定位方式driver.find_element(By.CSS_SELECTOR, "div.hotwords > a:first-child")

小贴士:

  • find_element() 找到第一个匹配的元素。
  • find_elements() 找到所有匹配的元素,返回一个列表。
3. 元素属性查看:“侦探”必备技能!

想知道元素的“身份证号”(id)、“绰号”(class)等信息? 没问题!
在浏览器中,右键点击你想查找的元素,选择“检查”(Inspect)或者按 F12 快捷键,就能打开开发者工具。在 HTML 代码里,高亮的那一块就是元素的“家谱”,你可以在那里找到它的各种属性。

4. 操作方法:让元素“动起来”!

找到了目标 NPC,接下来就是和他们互动了!

方法作用示例 (已找到元素 element)
click()点击element.click()
send_keys("文本")输入文本element.send_keys("你好,Selenium!")
clear()清空输入框内容element.clear()
.text获取元素的可见文本print(element.text)
get_attribute("属性名")获取元素的指定属性值print(element.get_attribute("href")) (获取链接的 URL)
get_screenshot_as_file("路径.png")截取页面截图并保存driver.get_screenshot_as_file("screenshot.png")
get_screenshot_as_png()截取页面截图,返回 bytespng_data = driver.get_screenshot_as_png()
5. 等待函数:给你的脚本“耐心”!

脚本执行速度太快,页面元素还没加载出来,你就想去操作? 这就像你刚进门,就大喊“我饿了!” 结果家里人还没做好饭! 😅 这样肯定会报错。

Selenium 提供了几种“耐心”的等待方式:

c) 显示等待 (WebDriverWait):
这是最推荐、最灵活的等待方式!你可以指定等待的条件(比如元素可见、元素可点击)和最长等待时间。python复制代码 收起

from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待最多 10 秒,每 0.5 秒检查一次条件 wait = WebDriverWait(driver, 10, 0.5) # 等待直到某个元素 presence_of_element_located (出现) element = wait.until(EC.presence_of_element_located((By.ID, "my_element_id"))) # 等待直到某个元素 visibility_of_element_located (可见) element_visible = wait.until(EC.visibility_of_element_located((By.XPATH, "//button[text()='提交']"))) # 等待直到某个元素 element_to_be_clickable (可点击) button_clickable = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[type='submit']")))

复制

b) 强制等待 (time.sleep):
不管三七二十一,直接“暂停”脚本执行指定的时间。适用于一些特殊情况,但不推荐滥用,因为会降低效率。python复制代码 收起

import time time.sleep(3) # 强制等待 3 秒

复制

a) 隐式等待 (implicitly_wait):
设置一个全局的“等待上限”。如果在指定时间内(比如 10 秒)元素加载好了,就立即继续执行;如果没有,就一直等到 10 秒耗尽。python复制代码 收起

driver.implicitly_wait(10) # 全局设置,最多等 10 秒

复制


💡 第七站:浏览器启动参数——让浏览器“听你的”!

启动浏览器时,你可以给它一些“指示”,让它以你想要的方式运行。

参数作用
--user-agent=""设置请求头的 User-Agent (模拟不同浏览器身份)
--window-size=1366,768设置浏览器窗口大小 (分辨率)
--headless无界面运行 (跑脚本时看不见浏览器窗口)
--start-maximized最大化运行 (直接全屏,方便查看)
--incognito隐身模式 (不保存历史记录和 cookies)
--disable-javascript禁用 JavaScript (某些情况下需要)

示例:

python复制代码 收起

from selenium.webdriver.chrome.options import Options chrome_options = Options() # chrome_options.add_argument('--headless') # 无界面运行 chrome_options.add_argument('--start-maximized') # 最大化启动 # chrome_options.add_argument('--window-size=1366,768') # 设置窗口大小 driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.baidu.com")

复制

提示: 启动 Chrome 时,可能会出现“Chrome 正受到自动化测试软件的控制”的提示。想去掉它? 用 add_experimental_option

python复制代码 收起

chrome_options = Options() chrome_options.add_experimental_option('useAutomationExtension', False) chrome_options.add_experimental_option("excludeSwitches", ['enable-automation']) driver = webdriver.Chrome(options=chrome_options)

复制


🗺️ 第八站:XPath 定位——“地图导航”大师!

XPath 就像是给网页 HTML 文档制作了一份“地图”,你可以通过它精确地找到任何一个元素。

XPath 的基本“地址格式”:

  • 绝对路径(/ 开头): 从根节点(<html>)一级一级往下找,非常精确,但一旦页面结构改动,就很容易失效。
    /html/body/div/div[3]/div[2]/form/input
  • 相对路径(// 开头): 从当前节点开始,不受页面结构改变的影响,更灵活。
    //input[@id='word'] (找到 idwordinput 标签)

XPath 的“高级技巧”:

  • 标签 + 属性://div[@class='hotwords']
  • 模糊匹配:
    • starts-with(@id, 'xxxx'): ID 以 'xxxx' 开头。
    • ends-with(@id, 'xxxx'): ID 以 'xxxx' 结尾 (支持较新版本)。
    • contains(@id, 'xxxx'): ID 包含 'xxxx'。
    • contains(text(), 'xxxx'): 元素文本包含 'xxxx'。
  • 定位同级元素:
    • preceding-sibling:::当前元素的前一个兄弟元素。
    • following-sibling:::当前元素的后一个兄弟元素。
    • //input[@name="password"]/preceding-sibling::input (找到 password 输入框前面的 input 标签)
  • 利用父级属性定位:
    //div[@class='parent-class']/span[@id='child-id']

示例:

python复制代码 收起

# 找到 id 为 'word' 的 input 元素并输入 driver.find_element(By.XPATH, "//input[@id='word']").send_keys("你好,XPath!") # 找到 class 为 'hotwords' 的 div 下的第一个 a 标签 driver.find_element(By.XPATH, "//div[@class='hotwords']/a[1]").click()

复制


🎨 第九站:CSS 定位——“颜值担当”的导航!

CSS 定位和 XPath 类似,也是用来定位元素的,但它的语法更简洁,执行速度通常更快!

CSS 定位的“地址格式”:

  • 标签 + 属性:img[alt="img1"] (找到 alt 属性为 img1img 标签)
  • 标签 + ID:div#my_div_id (等同于 By.ID)
  • 标签 + Class:div.my_class_name (等同于 By.CLASS_NAME)
  • 组合:div#main.container (ID 为 main 且 class 为 containerdiv)
  • 层级关系:
    • >:直接子元素 (div > span)
    • 空格:后代元素 (div span)
  • 开头/结尾/包含:
    • a[href^="http://"] (href 以 http:// 开头)
    • a[href$=".com"] (href 以 .com 结尾)
    • a[href*="sogou"] (href 包含 sogou)

示例:

python复制代码 收起

# 找到 class 为 'hotwords' 的 div 下的第一个 a 标签 driver.find_element(By.CSS_SELECTOR, "div.hotwords > a:first-child").click() # 找到 id 为 'username' 的 input 标签 driver.find_element(By.CSS_SELECTOR, "input#username").send_keys("我的用户名")

复制

XPath vs CSS: XPath 功能更强大,能做的更多;CSS 定位速度更快。一般情况下,XPath 更为常用,因为它更通用。


🎭 第十站:页面操作——“百变大咖”的各种骚操作!

除了基本的点击和输入,页面上还有很多“花活儿”,Selenium 也能帮你搞定!

1. 切换框架(Frame)

网页中嵌套的“小网页”(<iframe>)是个麻烦。直接定位里面的元素会失败,你需要先“钻进去”。

python复制代码 收起

# 进入框架 (根据 id, name, index, 或 XPath 定位) driver.switch_to.frame("iframe_id") # 通过 id driver.switch_to.frame(0) # 通过索引 (第一个 iframe) iframe_element = driver.find_element(By.XPATH, "//iframe[@name='my_frame']") driver.switch_to.frame(iframe_element) # 在框架内操作元素 driver.find_element(By.ID, "username_in_frame").send_keys("框架里的用户名") # 跳出框架 (回到主页面) driver.switch_to.default_content() # 跳到最外层 # driver.switch_to.parent_frame() # 跳到上一级框架 (如果有多层嵌套)

复制

2. 切换窗口

当点击一个链接,打开了新的浏览器窗口时,你需要切换过去才能操作。

python复制代码 收起

# 获取当前窗口的句柄 (唯一标识) original_window = driver.current_window_handle # 打开新窗口 (比如点击一个链接) driver.find_element(By.LINK_TEXT, "打开新窗口").click() time.sleep(2) # 等待新窗口出现 # 获取所有窗口的句柄 (是个列表) all_handles = driver.window_handles # 切换到新打开的窗口 (通常是列表的最后一个) for handle in all_handles: if handle != original_window: driver.switch_to.window(handle) break # 找到新窗口就跳出循环 # 在新窗口进行操作 driver.find_element(By.ID, "element_in_new_window").click() # 切回原窗口 driver.switch_to.window(original_window)

复制

3. 鼠标悬停 (Hover)

有时候,鼠标悬停在某个元素上,才会弹出菜单或显示更多信息。

python复制代码 收起

from selenium.webdriver.common.action_chains import ActionChains # 找到需要悬停的元素 element_to_hover_over = driver.find_element(By.LINK_TEXT, "设置") # 创建 ActionChains 对象 actions = ActionChains(driver) # 执行鼠标悬停操作,并提交 actions.move_to_element(element_to_hover_over).perform() time.sleep(2) # 等待菜单出现

复制

4. 弹框处理 (Alert, Confirm, Prompt)

网页中经常会出现各种弹窗,需要处理。

python复制代码 收起

# 切换到弹窗 alert = driver.switch_to.alert # 获取弹窗的文本 alert_text = alert.text print(f"弹窗内容: {alert_text}") # 点击确认按钮 alert.accept() # alert.dismiss() # 点击取消按钮 (如果存在) # alert.send_keys("输入内容") # 在 prompt 弹窗中输入

复制

5. 下拉菜单

处理 <select> 标签的下拉菜单,有两种常见方式:

方式二:使用 Select 类 (更推荐)python复制代码 收起

from selenium.webdriver.support.ui import Select dropdown_element = driver.find_element(By.ID, "province_select") select = Select(dropdown_element) # 三种选择方式: select.select_by_index(0) # 按选项的索引选择 select.select_by_value("beijing") # 按选项的 value 属性值选择 select.select_by_visible_text("上海") # 按选项的可见文本选择

复制

方式一:直接定位选项并点击python复制代码 收起

# 定位下拉框本身 dropdown = driver.find_element(By.ID, "province_select") # 在下拉框内部,根据 value 或文本定位选项并点击 dropdown.find_element(By.XPATH, "//option[@value='10']").click()

复制

6. 执行 JS

有些操作,比如滚动页面、修改页面元素属性,仅靠 Selenium API 难以完成,这时就可以借助 JavaScript!

python复制代码 收起

# 1. 滚动到页面底部 js_scroll_bottom = "window.scrollTo(0, document.body.scrollHeight);" driver.execute_script(js_scroll_bottom) time.sleep(2) # 2. 滚动到指定元素的位置 # 先找到元素 target_element = driver.find_element(By.ID, "footer") js_scroll_to_element = f"arguments[0].scrollIntoView();" # arguments[0] 就是传进来的元素 driver.execute_script(js_scroll_to_element, target_element) time.sleep(2) # 3. 修改/删除元素属性 (例如,移除 input 的 readonly 属性) js_remove_readonly = 'var element = document.getElementById("my_input"); element.removeAttribute("readonly");' driver.execute_script(js_remove_readonly) driver.find_element(By.ID, "my_input").send_keys("我可以输入了!") # 4. 通过 JS 设置元素的值 js_set_value = 'var element = document.getElementById("my_input"); element.value = "2023-10-26";' driver.execute_script(js_set_value)

复制


📁 第十一站:上传文件——“文件君”的穿越之旅

文件上传是 Web 测试中的一个常见难题。Selenium 提供了两种方案:

方案一:使用 send_keys() (最简单,但有局限)

如果上传按钮是 <input type="file"> 这样的原生 HTML 元素,直接使用 send_keys() 传递文件的绝对路径即可。

python复制代码 收起

# 启动浏览器并打开有文件上传功能的页面 driver = webdriver.Chrome() driver.get("http://example.com/upload_page") # 替换成实际的上传页面 # 定位到文件上传按钮 upload_button = driver.find_element(By.ID, "file-upload-button") # 替换成实际 ID # 文件的绝对路径 (确保路径正确!) file_path = "/Users/your_username/Documents/test_file.txt" # 替换成你的文件路径 # 将文件路径发送给上传按钮 upload_button.send_keys(file_path) # 可能还需要点击上传确认按钮 driver.find_element(By.ID, "upload-confirm-button").click()

复制

局限: 这种方法不适用于由操作系统弹出文件选择对话框的情况。

方案二:使用 AutoIt 工具 (万能解决方案,但稍复杂)

send_keys() 无效时,就需要借助 AutoIt 这样的第三方工具来模拟用户与操作系统弹窗的交互。

步骤概览:

  1. 安装 AutoIt: 从 AutoIt 官网下载安装。安装包里包含了 AutoIt Window Info 工具。
  2. 编写 AutoIt 脚本 (.au3 文件):
    • 用 AutoIt 编写脚本,模拟按下 Ctrl+V 粘贴文件路径,然后模拟按下 Enter 键(或使用 ControlClick 精确点击“打开”按钮)。
    • 使用 AutoIt 的编译器将脚本编译成 .exe 文件。
  3. 在 Selenium 脚本中调用 AutoIt:
    • 先在 Selenium 中点击上传按钮,触发文件选择对话框。
    • 等待对话框出现后,使用 os.system()subprocess 调用你编译好的 AutoIt .exe 文件。

AutoIt Window Info 工具的妙用:

当你写 AutoIt 脚本时,需要知道目标窗口的标题、类名、控件 ID。AutoIt Window Info 工具就能帮你“侦测”到这些信息!

  • 运行 AutoIt Window Info
  • 点击工具栏上的“十字准星”,然后将鼠标移到你想要识别的对话框(如文件选择框)上,点击它。
  • 工具会显示窗口的标题 (Title)类名 (Class)
  • 切换到“Control”标签页,将鼠标移到对话框里的按钮(如“打开”)上,就能看到该按钮的类名 (ClassNN)控件 ID (Control ID)

AutoIt 脚本示例 (uploadFile.au3):

autoit复制代码 收起

; 定义文件路径变量 Local $sFilePath = "C:\path\to\your\file.txt" ; 替换成你的文件绝对路径 ; 模拟按下 Ctrl+V 粘贴文件路径 Send("^v") Sleep(1000) ; 等待一下 ; 模拟点击“打开”按钮 (通常是 Enter 键) Send("{ENTER}") ; 如果 Enter 键不行,需要用 ControlClick 精确点击 ; ControlClick("窗口标题", "", "控件的 ClassNN") ; 例如: ControlClick("打开", "", "[CLASSNN:Button1]")

复制

Selenium 调用 AutoIt 脚本示例:

python复制代码 收起

import os import time from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("http://example.com/upload_page") upload_button = driver.find_element(By.ID, "file-upload-button") upload_button.click() # 触发文件选择对话框 time.sleep(2) # 等待对话框出现 # 调用 AutoIt 编译好的 .exe 文件 (替换成你的路径) os.system(r"C:\path\to\your\uploadFile.exe") # ... 继续其他操作 ... driver.quit()

复制

注意事项:

  • AutoIt 脚本的精确性很重要,窗口标题、控件 ID 都要准确。
  • ControlClick 是更精确的选择,但需要先用 AutoIt Window Info 获取信息。
  • AutoIt 主要是 Windows 平台解决方案,跨平台性不如 send_keys

🎉 结语:成为 Web 测试的“超人”!

恭喜你! 🎉 读完这篇“修炼秘籍”,你已经掌握了 Selenium 的核心技能,从基础操作到复杂的页面交互,再到文件上传,你已经可以自信地告别“手工点点点”的时代了!

记住,学习自动化测试的关键在于:

  • 勤动手: 理论再好,不如实操!多写代码,多尝试。
  • 勤查阅: 遇到问题,别怕查文档!
  • 善利用: 利用开发者工具、在线正则测试网站(如 Regex101.com)来辅助你。

掌握了 Selenium,你将拥有无限的可能,无论是提高工作效率,还是深入理解 Web 应用的底层逻辑,都会让你在技术道路上更进一步!

还有什么关于 Selenium 的疑问?或者你有什么独门秘籍?欢迎在评论区留言分享!让我们一起在自动化测试的道路上越走越远! 👇


希望这篇博客文章能让你觉得有趣并且易于理解! 😊

Read more

一、FPGA到底是什么???(一篇文章让你明明白白)

一句话概括 FPGA(现场可编程门阵列) 是一块可以通过编程来“变成”特定功能数字电路的芯片。它不像CPU或GPU那样有固定的硬件结构,而是可以根据你的需求,被配置成处理器、通信接口、控制器,甚至是整个片上系统。 一个生动的比喻:乐高积木 vs. 成品玩具 * CPU(中央处理器):就像一个工厂里生产好的玩具机器人。它的功能是固定的,你只能通过软件(比如按不同的按钮)来指挥它做预设好的动作(走路、跳舞),但你无法改变它的机械结构。 * ASIC(专用集成电路):就像一个为某个特定任务(比如只会翻跟头)而专门设计和铸造的金属模型。性能极好,成本低(量产时),但一旦制造出来,功能就永远无法改变。 * FPGA:就像一盒万能乐高积木。它提供了大量基本的逻辑单元(逻辑门、触发器)、连线和接口模块。你可以通过“编程”(相当于按照图纸搭建乐高)将这些基本模块连接起来,构建出你想要的任何数字系统——可以今天搭成一个CPU,明天拆了重新搭成一个音乐播放器。 “现场可编程”

基于深度学习的无人机航拍小目标检测算法研究

基于深度学习的无人机航拍小目标检测算法研究

本项目针对无人机航拍场景下的小目标检测问题,基于 YOLO11 系列模型,在 VisDrone 2019 数据集上进行训练与优化,并提供了完整的检测系统桌面应用,支持图片、视频、摄像头的实时检测与训练指标可视化。 一、项目概述 无人机航拍图像具有目标尺度小、密集分布、多尺度混合等特点,传统检测算法难以取得理想效果。本项目采用 Ultralytics YOLO11 框架,结合 VisDrone 数据集进行训练,实现了对行人、车辆等 10 类交通相关目标的高效检测,并配套开发了基于 PyQt6 的桌面应用,便于模型验证与日常使用。 二、数据集 2.1 数据集简介 本项目使用 VisDrone 2019-DET 数据集,由天津大学机器学习与数据挖掘实验室 AISKYEYE 团队发布,对应 ICCV 2019 "Vision

区块链|WEB3:时间长河共识算法(Time River Consensus Algorithm)

区块链|WEB3:时间长河共识算法(Time River Consensus Algorithm)

区块链|WEB3:时间长河共识算法(Time River Consensus Algorithm)(原命名为时间证明公式算法(TCC)) 本共识算法以「时间长河」为核心设计理念,通过时间节点服务器按固定最小时间间隔打包区块,构建不可篡改的历史数据链,兼顾区块链的金融属性与信用属性,所有优化机制形成完整闭环,无核心逻辑漏洞,具体总结如下: 一、核心机制(闭环无漏洞) 1. 节点准入与初始化:候选时间节点需先完成全链质押,首个时间节点由所有质押节点投票选举产生,彻底杜绝系统指定带来的初始中心化问题,实现去中心化初始化。 2. 时间节点推导与防作弊:下一任时间节点通过共同随机数算法从上一区块推导(输入参数:上一区块哈希、时间戳、固定数据顺序),推导规则公开可验证;时间节点需对数据顺序签名,任一节点发现作弊(篡改签名、操控随机数等),该节点立即失去时间节点资格并扣除全部质押。质押的核心目的是防止节点为持续获取区块打包奖励作弊,作弊损失远大于收益,确保共同随机数推导百分百不可作弊。 3. 节点容错机制:每个时间节点均配置一组合规质押节点构成的左侧顺邻节点队列(队列长度可随全网节点规

探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程

探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程

一、摘要 在当今的数字化时代,软件开发就像是一场探险,每个开发者都是探险家,探索着代码的奥秘。React作为前端开发的领军框架,其组件化和高效的渲染机制为开发者提供了强大的工具。而Microi吾码低代码平台的出现,则为这一探险之旅提供了捷径,让开发者能够以更低的成本、更快的速度构建出复杂的应用。本文将带领大家深入了解如何在React项目中使用Microi吾码,实现低代码开发的便捷与高效。 二、Microi吾码介绍 2.1 功能介绍 * 低代码开发:通过拖拽式界面设计,减少代码编写,提升开发效率。 * 组件丰富:提供大量预设组件,满足各种业务需求。 * 跨平台支持:适用于Web、移动端、小程序等多种平台。 * 灵活扩展:支持自定义组件和API,满足个性化需求。 2.2 团队介绍 * 研发团队:由经验丰富的开发者组成,专注于低代码平台的研发与优化。 * 客户支持:提供专业的技术支持和培训服务,确保用户顺利上手。 2.3 上线项目案例 * 电商平台:快速搭建了功能完整的电商系统,支持商品管理、订单处理等。 * 企业管理系统: