Selenium探险家:驾驭Web自动化的秘籍与实战

Hi,我是阿佑,今天将带大伙们学会如何使用Selenium进行高效的网站测试,如何配置Selenium Grid实现分布式测试,以及如何预测和拥抱自动化测试的未来!

文章目录

  • 1. 引言
    • 2. 背景介绍
      • 2.1 Selenium概览
      • 2.2 Python与Selenium的结合
    • 3. Selenium基础操作
      • 3.1 WebDriver初探
      • 3.2 页面元素定位
      • 3.3 交互操作
    • 4. 高级功能与实践
      • 4.1 页面等待策略
      • 4.2 异常处理
      • 4.3 多窗口与标签页操作
      • 4.4 执行JavaScript
    • 5. Selenium WebDriver实战案例
      • 5.1 网站登录自动化
      • 5.2 网页表单自动化填写
      • 5.3 数据抓取与验证
    • 6. Selenium Grid与分布式测试
      • 6.1 Selenium Grid简介
      • 6.2 配置与使用Grid
    • 7. 结论
      • Selenium在自动化测试中的应用价值总结
      • 未来发展趋势预测
    • 参考文献
      • 官方文档
      • 推荐书籍
      • 在线课程
      • 社区与论坛支持
      • 开源项目与工具

1. 引言

在当今这个数字化飞速发展的时代,我们每个人都像是在互联网的海洋中航行的水手。而Web自动化测试,就是那艘能够带我们安全、高效地穿越波涛汹涌的海洋的船只。它不仅能够保证我们的网站和应用在各种环境下都能正常运行,还能让我们的测试工作从繁琐的重复劳动中解放出来,让我们有更多的时间去探索未知的领域。

好了,让我们来聊聊今天的主角——Selenium。Selenium,这个名字听起来就像是古希腊神话中的月神,它在自动化测试的世界里也扮演着守护者的角色。自从2004年诞生以来,Selenium就以其强大的功能和灵活性,成为了自动化测试领域的一颗璀璨明星。

Selenium不仅仅是一个工具,它更像是一位经验丰富的船长,带领着我们驶向成功的彼岸。它能够控制几乎所有的浏览器,无论是Chrome、Firefox还是Safari,都能在Selenium的指挥下,执行各种复杂的任务。

那么,Selenium和Python的结合,就像是船长找到了他最得力的助手。Python以其简洁的语法和强大的库支持,成为了Selenium的最佳拍档。使用Python来编写Selenium脚本,就像是用最优雅的语言来指挥一场精彩的交响乐。

接下来,我们将一起踏上这段旅程,从Selenium的基础知识开始,一步步探索它的高级功能,并通过实战案例来展示它的强大能力。在这段旅程中,你将学会如何使用Selenium来自动化测试你的网站,让它变得更加健壮和可靠。

但在这之前,让我们先来搭建起我们的船只——安装Selenium库并配置好环境。这就像是为即将起航的船只装上帆和舵,确保我们的旅程能够顺利进行。

准备好了吗?让我们扬帆起航,开始我们的Selenium之旅吧!
在这里插入图片描述

2. 背景介绍

2.1 Selenium概览

想象一下,你是一位探险家,站在历史的长河岸边,回望着那些勇敢的先驱们。Selenium,这位自动化测试的先驱,它的足迹可以追溯到2004年。那时候,它以一个简单的工具的身份诞生,目的是为了自动化浏览器测试。随着时间的流逝,Selenium不断进化,从一个简单的工具成长为一个强大的框架,它的故事就像是一部精彩的冒险小说。

Selenium的历史充满了变革和创新。它从最初的单一功能,发展到现在能够支持多种浏览器和平台,这一路上的演变,就像是探险家在未知领域中不断发现新大陆。而与其他自动化测试工具相比,Selenium就像是一把瑞士军刀,多功能且强大,无论是简单的页面测试还是复杂的多浏览器测试,它都能轻松应对。

2.2 Python与Selenium的结合

现在,让我们把镜头转向Python,这位Selenium的得力助手。Python以其简洁的语法和强大的库支持,成为了Selenium的最佳搭档。在自动化测试的世界里,Python就像是一把锋利的剑,而Selenium则是那把剑的剑鞘,两者结合,无坚不摧。

Python语言在自动化测试中的优势不言而喻。它简单易学,代码可读性强,这使得即使是编程新手也能快速上手。而对于那些经验丰富的开发者来说,Python的丰富库和框架,能够让他们更加高效地编写测试脚本。

安装Selenium库及环境配置的过程,就像是为即将起航的船只准备必要的物资。你只需要通过Python的包管理器pip,简单地输入一行命令pip install selenium,Selenium的宝藏就会呈现在你面前。接下来,根据你想要控制的浏览器,下载相应的WebDriver,你的Selenium之旅就可以正式起航了。

随着我们的船只逐渐准备就绪,我们即将驶向更广阔的海域。在下一章,我们将深入探索Selenium的基础操作,学习如何驾驭这艘船,让它在Web自动化测试的海洋中乘风破浪。准备好了吗?让我们继续我们的探险吧!

3. Selenium基础操作

3.1 WebDriver初探

想象一下,你手中有一把神奇的钥匙,可以打开任何浏览器的大门。这把钥匙就是WebDriver。它不仅仅是一个简单的驱动程序,更像是一个万能的遥控器,能够控制浏览器的一举一动。

启动浏览器实例的过程,就像是启动一辆赛车。你只需要一行简单的代码,比如:

from selenium import webdriver# 创建一个Chrome浏览器实例
driver = webdriver.Chrome()

这行代码就像是按下启动按钮,Chrome浏览器就会像一辆赛车一样,轰鸣着启动起来。接下来,你可以用它来访问任何网站,就像驾驶赛车在赛道上飞驰。

3.2 页面元素定位

在浏览器的海洋中,每个网页都是一个岛屿,而页面元素就是岛屿上的宝藏。要找到这些宝藏,你需要一张藏宝图,这张图就是元素定位的方法。

  • ID定位:就像是使用GPS定位,直接找到宝藏的精确位置。
  • Name定位:如果你知道宝藏的名字,那么找到它就简单多了。
  • XPath定位:这是一种更复杂的定位方法,就像是根据地图上的坐标来寻找宝藏。
  • CSS Selector定位:这就像是根据宝藏的外观特征来寻找它。

例如,如果你想在页面上找到一个按钮并点击它,你可以使用XPath定位:

button = driver.find_element_by_xpath("//button[@id='submit']")
button.click()

这就像是你对赛车说:“嘿,看到那个按钮了吗?给我冲过去,按下它!”

3.3 交互操作

现在,我们已经找到了宝藏,接下来就是与宝藏互动的时候了。在Selenium中,你可以模拟点击、输入文本、选择下拉菜单等各种操作。

  • 模拟点击:就像是你用手指轻轻触碰宝藏,看看它是否会打开一个秘密通道。
  • 输入文本:这就像是在宝藏上刻下你的名字,让它记住你来过这里。
  • 选择下拉菜单:这就像是在宝藏箱中挑选你最想要的宝贝。

举个例子,如果你想在一个搜索框中输入文字并搜索:

search_box = driver.find_element_by_name("q")
search_box.send_keys("Selenium WebDriver")
search_box.submit()

这就像是你对赛车说:“嘿,带我去搜索‘Selenium WebDriver’这个宝藏!”

随着我们的探险逐渐深入,我们已经学会了如何驾驭Selenium这艘船,让它在Web自动化测试的海洋中航行。在下一章,我们将探索Selenium的高级功能,让我们的探险之旅更加精彩。准备好了吗?让我们继续前进,探索更多未知的宝藏吧!

4. 高级功能与实践

4.1 页面等待策略

在自动化测试的世界里,时间就是金钱,效率就是生命。但是,有时候我们的页面就像是一位害羞的姑娘,需要一点时间来准备她的美丽。这就是为什么我们需要页面等待策略。

  • 显式等待:这就像是你告诉Selenium:“嘿,伙计,给我看着点,等到这位姑娘准备好了再告诉我。”你可以设置一个等待时间,比如:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10)  # 等待时间设置为10秒
element = wait.until(EC.visibility_of_element_located((By.ID, "myElement")))
  • 隐式等待:这更像是一种默契,你告诉Selenium:“在接下来的操作中,如果页面上的元素还没准备好,就耐心等等。”你可以设置一个全局的隐式等待时间:
driver.implicitly_wait(5)  # 设置隐式等待时间为5秒

4.2 异常处理

在自动化测试的旅途中,难免会遇到一些坑坑洼洼,这时候就需要我们有一套应对策略。

  • 常见异常类型:比如NoSuchElementException,当你试图找到一个不存在的元素时就会遇到它。
  • 自定义异常处理机制:这就像是你的背包里的工具,帮助你在遇到问题时快速解决。

处理异常的一个例子:

try:element = driver.find_element_by_id("nonexistent")
except NoSuchElementException:print("哎呀,这个元素不存在,我们换个地方找找吧!")

4.3 多窗口与标签页操作

在Web的世界里,多窗口和标签页就像是我们的分身术,让我们能够同时处理多个任务。

  • 切换窗口:当你打开一个新窗口时,Selenium会告诉你一个新的窗口句柄,你可以通过它来切换:
new_window = driver.execute_script("window.open('');")
driver.switch_to.window(new_window)
  • 切换标签页:当你打开一个新标签页时,Selenium同样会提供给你一个标签页的引用,你可以通过它来切换:
driver.execute_script("window.open('http://new-tab.com');")
driver.switch_to.window(driver.window_handles[1])  # 切换到新的标签页

4.4 执行JavaScript

在某些情况下,我们需要直接与页面的JavaScript进行对话,这时候就需要用到执行JavaScript的功能。

  • 调用JS代码:这就像是你直接对页面说:“嘿,页面,给我做这个。”
  • JS执行与页面交互:这可以让你更细致地控制页面的行为。

一个执行JavaScript的例子:

driver.execute_script("arguments[0].click();", element)

这就像是你对赛车说:“嘿,赛车,看到那个元素了吗?给我点一下它!”

随着我们一步步深入Selenium的高级功能,我们的探险之旅变得越来越有趣。在下一章,我们将通过实战案例来展示Selenium的强大能力,让我们的探险之旅更加精彩。准备好了吗?让我们继续前进,探索更多未知的宝藏吧!
在这里插入图片描述

5. Selenium WebDriver实战案例

5.1 网站登录自动化

想象一下,你是一位侦探,需要潜入一个网站来获取重要信息。但是,这个网站有一个警卫——登录表单。别担心,Selenium会帮你轻松搞定它。

首先,我们需要分析登录流程,就像侦探分析犯罪现场一样。登录通常包括输入用户名和密码,然后点击登录按钮。接下来,我们将编写登录脚本,就像侦探制定行动计划一样。

from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开登录页面
driver.get("http://example.com/login")# 输入用户名和密码
username = driver.find_element_by_name("username")
password = driver.find_element_by_name("password")
username.send_keys("你的用户名")
password.send_keys("你的密码")# 提交登录表单
login_button = driver.find_element_by_id("loginButton")
login_button.click()# 等待页面跳转
driver.implicitly_wait(10)

5.2 网页表单自动化填写

现在,让我们来到一个在线购物网站,你看到了一款心仪的商品,但是填写表单的过程繁琐又耗时。别担心,Selenium会帮你自动化这个过程。

首先,我们需要识别表单中的元素,比如商品名称、数量、颜色等。然后,我们将编写脚本来自动填写这些信息。

# 假设我们已经打开了商品页面# 选择商品
product = driver.find_element_by_css_selector("#productList .product")
product.click()# 填写数量
quantity = driver.find_element_by_id("quantity")
quantity.clear()
quantity.send_keys("2")# 选择颜色
color = driver.find_element_by_id("color")
color.send_keys("红色")# 提交表单
submit_button = driver.find_element_by_id("submit")
submit_button.click()

5.3 数据抓取与验证

最后,假设你是一位质量控制专家,需要验证网站上的数据是否准确。Selenium可以帮助你抓取数据并进行验证。

比如,你需要验证网站上的价格是否与数据库中的价格一致。你可以使用Selenium来抓取网页上的价格,并与数据库中的价格进行比较。

# 假设我们已经打开了商品详情页面# 抓取网页上的价格
price_on_page = driver.find_element_by_id("price").text# 假设我们从数据库中获取的价格存储在变量database_price中
if price_on_page == database_price:print("价格验证通过!")
else:print("价格不一致,需要调查!")

通过这些实战案例,我们可以看到Selenium的强大之处。它不仅可以帮助我们自动化日常的Web操作,还可以在数据抓取和验证方面发挥重要作用。

在下一章,我们将探索Selenium Grid和分布式测试,这将使我们的自动化测试能力更上一层楼。准备好了吗?让我们继续前进,探索更多Selenium的奥秘吧!

6. Selenium Grid与分布式测试

6.1 Selenium Grid简介

想象一下,你是一位指挥官,站在指挥台上,面前是一排排的电脑屏幕,每个屏幕都显示着不同的浏览器和操作系统。这不是科幻电影里的场景,这是Selenium Grid带给你的超能力。

Selenium Grid就像是一个强大的网络,连接着分布在世界各地的机器。这些机器就像你的士兵,听从你的命令,执行各种测试任务。通过Grid,你可以实现跨浏览器和跨平台的自动化测试,就像是拥有了一支多才多艺的军队,能够应对各种复杂的情况。

6.2 配置与使用Grid

配置Selenium Grid的过程就像是建立你的军队基地。首先,你需要一个Hub,这是你的指挥中心,所有的消息和指令都从这里发出。

from selenium import webdriver# 设置Hub的URL
hub_url = "http://your-hub-url:4444/wd/hub"# 创建一个使用Grid的WebDriver实例
driver = webdriver.Remote(command_executor=hub_url, desired_capabilities={'browserName': 'chrome'})

接下来,你需要配置Node,这是你的士兵,它们将执行实际的测试任务。每个Node都需要注册到Hub上,这样Hub才能知道它们的存在。

# 假设你的Node运行在另一台机器上,运行以下命令来注册Node
java -jar selenium-server-standalone-3.x.x.jar -role node -hub http://your-hub-url:4444/grid/register -browser "browserName=chrome,maxInstances=5"

现在,你的军队已经准备就绪,你可以开始执行分布式测试了。这就像是指挥你的士兵去执行任务。

# 执行测试任务
driver.get("http://example.com")# ... 进行各种测试操作 ...# 测试完成后,关闭WebDriver实例
driver.quit()

在这个过程中,你的测试任务会在不同的机器上并行执行,大大提高了测试的效率。

通过Selenium Grid和分布式测试,我们可以让自动化测试变得更加强大和灵活。这就像是拥有了一支无敌的军队,无论面对多么复杂的测试任务,都能够轻松应对。

在下一章,我们将总结Selenium在自动化测试中的应用价值,并预测未来的发展趋势。准备好了吗?让我们继续前进,探索Selenium的更多可能吧!

7. 结论

Selenium在自动化测试中的应用价值总结

随着我们Selenium之旅的结束,我们站在了一个新的起点上,回望过去,我们不禁感慨万千。Selenium,这位自动化测试界的超级英雄,以其超凡的力量和智慧,帮助我们解决了一个又一个难题。

  • 效率提升:Selenium让我们的测试工作变得自动化,不再需要手动重复那些繁琐的操作,就像是拥有了一台永不停歇的机器,24小时不间断地为我们工作。
  • 跨浏览器兼容性:Selenium让我们能够轻松地在不同的浏览器和操作系统上进行测试,确保我们的网站和应用能够适应各种环境。
  • 节省成本:通过自动化测试,我们减少了人力成本和时间成本,将更多的资源投入到产品的创新和优化中。
  • 错误减少:自动化测试减少了人为错误的可能性,提高了测试的准确性和可靠性。

未来发展趋势预测

展望未来,Selenium这位超级英雄将会继续进化,变得更加强大和智能。

  • 云服务集成:随着云计算技术的不断发展,Selenium可能会更加紧密地与云服务集成,让我们能够更加方便地利用云资源进行测试。
  • 人工智能结合:Selenium可能会与人工智能技术结合,实现更加智能的测试策略和自动化流程。
  • 移动设备测试:随着移动设备的普及,Selenium在移动设备测试方面的应用将会得到进一步的扩展和优化。
  • 社区发展:Selenium的社区将会继续壮大,更多的开发者和用户将会参与到Selenium的开发和应用中,共同推动其发展。

随着Selenium的不断发展,我们有理由相信,它将会成为自动化测试领域的一面旗帜,引领我们走向更加高效、智能的未来。

在这段旅程中,我们不仅学会了如何使用Selenium,更重要的是,我们学会了如何思考和解决问题。这将是我们在自动化测试领域不断前进的宝贵财富。

最后,让我们以一颗感恩的心,感谢Selenium这位超级英雄,感谢它为我们的自动化测试工作带来的便利和价值。同时,也感谢每一位在这段旅程中陪伴我们的伙伴,是你们的陪伴让这段旅程变得更加精彩。

准备好了吗?让我们携手Selenium,继续在自动化测试的道路上,勇往直前,探索更多的可能!
在这里插入图片描述

我是阿佑,一个专注于把晦涩的技术讲有趣的中二青年~

参考文献

官方文档

  • Selenium官方文档:这是学习Selenium最直接的资源,详细地介绍了Selenium的各个方面。
    • 链接:Selenium Official Documentation

推荐书籍

  • 《Selenium WebDriver 3 实战宝典》:这本书深入浅出地介绍了Selenium WebDriver 3的使用方法,适合初学者和有经验的开发者。
    • 作者:Luke Leberfinger
    • 出版社:人民邮电出版社
  • 《自动化测试最佳实践:测试人员和敏捷团队的测试自动化指南》:这本书不仅介绍了Selenium,还涵盖了自动化测试的最佳实践。
    • 作者:Doe Rumbaugh
    • 出版社:清华大学出版社

在线课程

  • Udemy上的Selenium课程:Udemy提供了多个关于Selenium的课程,适合不同水平的学习者。
    • 链接:Selenium Courses on Udemy
  • Coursera上的Web自动化测试课程:Coursera上的课程通常由大学教授讲授,内容权威且系统。
    • 链接:Web Automation on Coursera

社区与论坛支持

  • Stack Overflow:一个非常活跃的技术问答社区,你可以在这里找到许多关于Selenium的问题和答案。
    • 链接:Stack Overflow
  • Selenium官方论坛:官方论坛是获取Selenium最新动态和与其他用户交流的好地方。
    • 链接:Selenium Official Forum

开源项目与工具

  • Selenium GitHub仓库:在这里,你可以找到Selenium的源代码,提交bug,或者贡献代码。
    • 链接:Selenium on GitHub
  • WebDriverManager:一个用于管理WebDriver的工具,可以简化WebDriver的下载和管理过程。
    • 链接:WebDriverManager

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python数据可视化:自定义闭合区域填充颜色matplotlib.pyplot.fill()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python数据可视化: 自定义闭合区域填充颜色 matplotlib.pyplot.fill() [太阳]选择题 以下关于matplotlib.pyplot.fill()函数说法正确的是? import matplotlib.pyplo…

【ARM+Codesys案例】T3/RK3568/树莓派+Codesys锂电叠片机方案:结合CODESYS实现高效生产

锂电叠片机解决方案 乘风破浪,促进新能源行业发展 锂电池是依靠锂离子在正极与负极之间移动来达到充放电目的的一种可充电电池,具有高能量密度、高电压、寿命长、无记忆效应等优点。锂电池属于国家政策扶持的高速发展行业,近年发展快速&…

【Beyond Compare】专业的文件对比工具

一、Beyond Compare官方下载 二、Beyond Compare简介 三、Beyond Compare 4激活 一、Beyond Compare官方下载 Beyond Compare官方下载 https://www.beyondcompare.cc/ Beyond Compare 4中文包 链接:https://pan.baidu.com/s/14igdUm0Xy7DFp4Jzb58AZg?pwdGLNG 提…

newinit.sh挖矿攻击处理与规避方案

目录 攻击分析 恢复措施: 问题排查 攻击入口分析 预防 临时处理方案: 攻击分析 攻击者:职业黑客(99%) 攻击方式:挖矿病毒newinit.sh和蠕虫病毒pnscan 中毒现象: 服务器负载异常,具体表…

CTFHUB技能树——SSRF(一)

目录 一、SSRF(服务器端请求伪造) 漏洞产生原理: 漏洞一般存在于 产生SSRF漏洞的函数(PHP): 发现SSRF漏洞时: SSRF危害: SSRF漏洞利用手段: SSRF绕过方法: 二、CTFHUB技能树 SSRF 1.Ht…

oracle 12c GI卸载流程

集群节点停止服务 [crsctl stop crs -f grid运行deinstall [rootprimary1 bin]# su - grid [gridprimary1 ~]$ cd $ORACLE_HOME/deinstall [gridprimary1 deinstall]$ ls bootstrap_files.lst bootstrap.pl deinstall deinstall.pl deinstall.xml jlib readme.txt …

多张图片上传、图片回显、url路径转成File文件

1. 实现 背景&#xff1a;在表单中使用element-plus实现多张图片上传(限制最多10张)&#xff0c;因为还要与其他参数一起上传&#xff0c;所以使用formData格式。 编辑表单回显时得到的是图片路径数组&#xff0c;上传的格式是File&#xff0c;所以要进行一次转换。 <tem…

超频是什么意思?超频的好处和坏处

你是否曾经听说过超频&#xff1f;在电脑爱好者的圈子里&#xff0c;这个词似乎非常熟悉&#xff0c;但对很多普通用户来说&#xff0c;它可能还是一个神秘而陌生的存在。 电脑超频是什么意思 电脑超频&#xff08;Overclocking&#xff09;&#xff0c;顾名思义&#xff0c;是…

堆排序和Topk问题

堆排序 堆排序即利用堆的思想来进行排序&#xff0c; 总共分为两个步骤&#xff1a; 1. 建堆 升序&#xff1a;建大堆&#xff1b; 降序&#xff1a;建小堆 2 .利用堆删除思想来进行排序 利用堆删除思想来进行排序 建堆和堆删除中都用到了向下调整&#xff0c;因此掌握了…

外卖系统关于redis使用解决高并发情况

1、如何配置redis 在java中操作redis 操作步骤&#xff1a; 1、导入Spring Data Redis的maven坐标 2、配置Redis数据源 3、编写配置类&#xff0c;创建RedisTemplate对象 4、通过RedisTemplate对象操作Redis 2、Redis结合Lua脚本 减少网络开销&#xff1a;使用Lua脚本&#xf…

中医理疗元宇宙 科技赋能中医药产业走向国际市场

基于380亿参数量&#xff0c;对中医药海量文本进行数据训练&#xff0c;实现方剂优化、机制阐释和新适应症的精准发现……日前在天津召开的数智赋能大健康产业新质生产力暨第四届中医药国际发展大会上&#xff0c;由天士力医药集团与华为云共同开发的“数智本草”中医药大模型正…

37. 解数独 - 力扣(LeetCode)

基础知识要求&#xff1a; Java&#xff1a; 方法、for循环、if else语句、数组 Python&#xff1a; 方法、for循环、if else语句、列表 题目&#xff1a; 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行…

Windows搭建Nginx代理本地盘的文件(共享路径或本地路径)

文章目录 Windows搭建Nginx代理本地盘的文件 - 前言需求背景挂载网络共享路径检查连接状态下载Nginx编辑 Nginx 配置文件启动 Nginx检测Nginx是否成功启动使用方法远程共享路径示例本地文件示例 测试 Windows搭建Nginx代理本地盘的文件 - 前言 在开发过程中&#xff0c;确保文…

ChatGPT Mac客户端 下载安装教程(免费 不限次数使用 还支持语音聊天)

ChatGPT Mac客户端 下载安装教程&#xff08;免费 不限次数使用 还支持语音聊天&#xff09; 原文链接&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139248625 免费 不限次数使用 还支持语音聊天

曼城四连冠,剑南春与万千球迷共同见证“荣耀时刻”

执笔 | 洪大大 编辑 | 扬 灵 5月19日&#xff0c;英超2023-2024赛季第38轮比赛全面开打&#xff0c;凭借队员的出色发挥&#xff0c;曼城最终以3-1战胜西汉姆联&#xff0c;成功捧起了英超联赛的奖杯&#xff0c;成为英格兰足球顶级联赛100多年历史上第一支成就四连冠的豪门…

事务报错没有显示回滚导致DDL阻塞引发的问题

在业务开发过程中&#xff0c;显示的开启事务并且在事务处理过程中对不同的情况进行显示的COMMIT或ROLLBACK&#xff0c;这是一个完整数据库事务处理的闭环过程。 这种在应用开发逻辑层面去handle的事务执行的结果&#xff0c;既确保了事务操作的数据完整性&#xff0c;又遵循了…

探索未来设计新境界,PSAI插件 艺术创作神器来袭!

想象一下&#xff0c;如果有一个工具&#xff0c;能够让你的设计工作变得既简单又高效&#xff0c;那会是怎样的体验&#xff1f;现在&#xff0c;梦想成真了&#xff01; 这是一款革命性的PSAI设计插件&#xff0c;专为创意人士打造。它将彻底改变你的设计流程&#xff0c;让你…

【OpenCV】像素信息统计

介绍了计算像素均值、方差的API&#xff0c;以及统计像素信息的方法。相关API&#xff1a; minMaxLoc()mean()meanStdDev() 代码&#xff1a; #include "iostream" #include "opencv2/opencv.hpp"using namespace std; using namespace cv;int main(int…

【全开源】JAVA同城搬家系统源码小程序APP源码

JAVA同城搬家系统源码 特色功能&#xff1a; 强大的数据处理能力&#xff1a;JAVA提供了丰富的数据结构和算法&#xff0c;以及强大的并发处理能力&#xff0c;使得系统能够快速地处理大量的货物信息、司机信息、订单信息等&#xff0c;满足大规模物流的需求。智能路径规划&a…

香橙派 AIPro开发板上手测评

前言 最近拿到了一个新玩具&#xff1a;香橙派 AIPro。一个只比银行卡大一点点的开发板能带给我们多少惊喜呢&#xff1f;接下来就跟我一起来体验下这块开发板的魅力。 一、硬件配置 CPU&#xff1a;配备了4核64位ARM处理器&#xff0c;其中默认预留1个给AI处理器使用 NPU&am…