当前位置: 首页 > news >正文

day19——web自动化测试(1)

【没有所谓的运气🍬,只有绝对的努力✊】

目录

1、什么是自动化

1.1 概念:

1.2 优点:

2、什么是自动化测试

2.1 自动化测试能解决什么问题?

2.1.1 优点:

2.1.2 误区:

2.2 自动化测试分类

3、web自动化测试

3.1 什么web项目适合做自动化测试?

3.2 【面试题】web自动化测试在什么阶段开始?

3.3 web自动化测试所属分类?

3.4 主流的web自动化测试工具

4、Selenium

4.1 什么是Selenium呢?

4.2 Selenium 特点

4.3 Selenium发展史

4.4 Selenium 安装和卸载

4.4.1 环境搭建

4.4.2 安装Selenium包

4.4.3 浏览器安装驱动

【火狐浏览器】

【谷歌浏览器】

4.4.4  安装查看此文章

4.4.5 案例

5、Selenium4源码解析

6、元素定位方式(8种)

6.1 By.ID

6.2 By.CLASS_NAME

6.3 By.TAG_NAME

6.4 By.NAME

6.6 CSS_SELECTOR(推荐!!速度快,查找效率高)

6.6.2 黑马

6.7 XPATH

6.7.1 XPath定位策略(方式)

(1)路径——定位(2)利用元素属性——定位(3)属性与逻辑结合——定位(4)层级与属性结合——定位

7、不同元素定位实战

7.1 radio 单选框

7.2 chechbox


1、什么是自动化

1.1 概念:

        由机器设备代替人工自动完成指定目标的过程。

1.2 优点:

        (1)减少人工劳动力。

        (2)提高工作效率。

        (3)产品规格统一标准。

        (4)规模化(批量生产)

2、什么是自动化测试

软件测试:校验系统是否满足规定的需求、弄清预期结果与实际结果之间的差别。

概念:让程序代替人工去验证系统功能的过程

自动化测试包括很多:web自动化等。

2.1 自动化测试能解决什么问题?

  1. 解决——回归测试
  2. 解决——压力测试
  3. 解决——兼容性测试
  4. 提高测试效率,保证产品质量。

2.1.1 优点:

  1. 较少的时间内运行更多的测试用例。
  2. 自动化脚本可重复运行
  3. 减少人为的错误。
  4. 克服手工测试的局限性。

2.1.2 误区:

  1. 自动化测试可以完全替代手工测试。❌
  2. 自动化测试一定比手工测试厉害。❌
  3. 自动化测试可以发掘更多的bug。❌
  4. 自动化测试适用所有功能。❌

2.2 自动化测试分类

  1. web——自动化测试(selenium)
  2. 移动——自动化测试
  3. 接口——自动化测试(基于工具、基于代码)
  4. 单元测试——自动化测试。

3、web自动化测试

概念:让程序代替人工自动验证web项目功能的过程。

3.1 什么web项目适合做自动化测试?

  1. 需求变动频繁
  2. 项目周期长
  3. 项目需要回归测试

3.2 【面试题】web自动化测试在什么阶段开始?

答:功能测试完毕(手工测试)

3.3 web自动化测试所属分类?

  1. 黑盒测试(功能测试)
  2. 白盒测试(单元测试)
  3. 灰盒测试(接口测试)

web自动化测试属于 黑盒测试(功能测试)

3.4 主流的web自动化测试工具

(1)QTP:一个商业化的功能测试工具,收费、支持web,桌面自动化测试

(2)Selenium:开源的web自动化测试工具免费、主要做功能测试。

(3)Robot framework:是一个基于python可扩展地关键字驱动的测试自动化框架。【2014年官网停止更新】

4、Selenium

4.1 什么是Selenium呢?

Selenium是一个用于web应用程序的自动化测试工具。

4.2 Selenium 特点

  1. 开源软件:源代码开放、可以根据需要来增加工具的某些功能。。
  2. 跨平台:linux、windows、mac
  3. 支持多种浏览器:Firefox、Chrome、IE、Edge、Opera、Safari等。
  4. 支持多种语言:python、java、C#、javascript、Ruby、PHP等。
  5. 成熟稳定:目前已被google、百度、腾讯等公司广泛使用。
  6. 功能强大:能够实现类似商业工具的大部分功能,因为开源性,可实现定制功能。

4.3 Selenium发展史

4.4 Selenium 安装和卸载

4.4.1 环境搭建

(1)python开发环境

(2)安装selenium包

(3)安装浏览器

(4)安装浏览器驱动。

4.4.2 安装Selenium包

安装:pip install selenium

卸载:pip uninstall selenium

4.4.3 浏览器安装驱动

【火狐浏览器】
https://github.com/mozilla/geckodriver/releases

【谷歌浏览器】
https://chromedriver.storage.googleapis.com/index.html

4.4.4  安装查看此文章

mac 上安装Selenium + 谷歌浏览器驱动 116.0.5845.x-CSDN博客

4.4.5 案例

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开b站,输入 软件测试点击搜索按钮
"""
driver.get('https://www.bilibili.com')
driver.find_element(By.CLASS_NAME, "nav-search-input").send_keys("软件测试")
driver.find_element(By.CLASS_NAME, "nav-search-btn").click()time.sleep(3)
driver.quit()

5、Selenium4源码解析

6、元素定位方式(8种)

6.1 By.ID

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开百度首页,输入 Selenium点击搜索按钮
"""
# 窗口最大化
driver.maximize_window()driver.get('https://www.baidu.com')
driver.find_element(By.ID, "kw").send_keys("Selenium")
driver.find_element(By.ID, "su").click()time.sleep(3)
driver.quit()

6.2 By.CLASS_NAME

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开百度首页,输入 Selenium点击搜索按钮
"""
# 窗口最大化
driver.maximize_window()driver.get('https://www.bilibili.com/')
driver.find_elements(By.CLASS_NAME, "channel-link")[1].click()for ele in driver.find_elements(By.CLASS_NAME, "channel-link"):print(ele.text)time.sleep(3)
driver.quit()

6.3 By.TAG_NAME

如果页面从存在多个tag_name ,只返回第一个元素。只适用于 <a>标签

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开百度首页,输入 Selenium"""
# 窗口最大化
driver.maximize_window()driver.get('https://www.bilibili.com/')
driver.find_element(By.TAG_NAME, "input").send_keys("学习Selenium")time.sleep(3)
driver.quit()

6.4 By.NAME

LINK_TEXT:只能定位a标签,定位元素内容必须为 全部匹配

PARTIAL_LINK_TEXT:默认返回符合条件的第一个。

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开百度首页,输入 Selenium点击搜索按钮
"""
# 窗口最大化
driver.maximize_window()driver.get('https://www.baidu.com/')
# driver.find_element(By.LINK_TEXT, '新闻').click()
driver.find_element(By.PARTIAL_LINK_TEXT,"新闻").click()time.sleep(3)
driver.quit()

6.6 CSS_SELECTOR(推荐!!速度快,查找效率高)

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""css selector
"""
# 窗口最大化
driver.maximize_window()# (1)根据id定位
# driver.get('https://www.baidu.com/')
# driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("你好")
# driver.find_element(By.CSS_SELECTOR, "#su").click()# (2)根据class属性值,定位
# driver.get("https://www.bilibili.com")
# driver.find_element(By.CSS_SELECTOR,".nav-search-input").send_keys("2025新年快乐")# (3)根据name属性值定位
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR,"[name='wd']").send_keys("软件测试111")# (4)根据标签属性定位
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "a[href='https://wenku.baidu.com/?fr=bdpcindex']").click()# 模糊匹配——包含
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "a[href*='wenku.baidu.com']").click()# 模糊匹配——匹配开头
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "a[href^='https://wenku.baidu.com']").click()# 模糊匹配——匹配结尾
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "a[href$='wenku.baidu.com/?fr=bdpcindex']").click()# (5)组合定位
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "input.s_ipt").send_keys("今日天气")time.sleep(3)
driver.quit()

6.6.2 黑马

(1)id选择器(2)class选择器(3)元素选择器(4)属性选择器(5)层级选择器


6.7 XPATH



6.7.1 XPath定位策略(方式)

(1)路径——定位(2)利用元素属性——定位(3)属性与逻辑结合——定位(4)层级与属性结合——定位

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""xpath
"""
# 窗口最大化
driver.maximize_window()driver.get("https://passport.jd.com/new/login.aspx?ReturnUrl=http%3A%2F%2Fcart.jd.com%2Fcart.action%3Fnull")# driver.find_element(By.XPATH, "//input[@id='loginname']").send_keys('12345')
# driver.find_element(By.XPATH, "//*[text()='手机扫码安全登录']")
# driver.find_element(By.XPATH, "//*[contains(@autocomplete,'off')]")
driver.find_element(By.XPATH, "//*[starts-with(@href,'//about')]")time.sleep(3)
driver.quit()

7、不同元素定位实战

7.1 radio 单选框

练习地址:https://www.iviewui.com/view-ui-plus/component/form/radio

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from time import sleep
from selenium.webdriver.common.by import By# 设置正确的驱动路径
service = ChromeService(executable_path="/usr/local/bin/chromedriver")
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)"""# 打开一个网站,点击radio """
driver.get("https://www.iviewui.com/view-ui-plus/component/form/radio")
# 方法1 :
# driver.find_element(By.XPATH, '//span[text()="Apple"]').click()
# sleep(1)
# driver.find_element(By.XPATH, '//span[text()="Android"]').click()
# sleep(1)
# driver.find_element(By.XPATH, '//span[text()="Windows"]').click()# 方法2:
# driver.find_elements(By.XPATH, '//input[@class="ivu-radio-input" and @type="radio"]')[1].click()
# sleep(1)
# driver.find_elements(By.XPATH, '//input[@class="ivu-radio-input" and @type="radio"]')[2].click()
# sleep(1)
# driver.find_elements(By.XPATH, '//input[@class="ivu-radio-input" and @type="radio"]')[3].click()# 方法3:
driver.find_element(By.XPATH, "//span[text()='Windows']/preceding-sibling::span/input").click()
sleep(1)sleep(3)   # 打开页面,3秒后再关闭
# 关闭浏览器
driver.quit()

7.2 chechbox

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from time import sleep
from selenium.webdriver.common.by import By# 设置正确的驱动路径
service = ChromeService(executable_path="/usr/local/bin/chromedriver")
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)"""# 打开一个网站,点击 checkbox """
driver.get("https://www.iviewui.com/view-ui-plus/component/form/checkbox")
# 方法1
# driver.find_element(By.XPATH, "//span[text()='香蕉']").click()
# sleep(1)
# driver.find_element(By.XPATH, "//span[text()='苹果']").click()
# sleep(1)
# driver.find_element(By.XPATH, "//span[text()='西瓜']").click()# 方法2:
driver.find_element(By.XPATH, "//span[text()='西瓜']/preceding-sibling::span/input").click()
sleep(1)sleep(3)   # 打开页面,3秒后再关闭
# 关闭浏览器
driver.quit()

相关文章:

day19——web自动化测试(1)

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、什么是自动化 1.1 概念&#xff1a; 1.2 优点&#xff1a; 2、什么是自动化测试 2.1 自动化测试能解决什么问题&#xff1f; 2.1.1 优点&#xff1a; 2.1.2 误区&#xff1a; 2.2 自动化测试分类…...

go window安装protoc protoc生成protobuf文件

1. 下载&#xff1a; Releases protocolbuffers/protobuf GitHub 2. 解压缩&#xff1a; 3. 配置环境变量&#xff1a; 选择系统变量->Path -> 新增 解压缩后的bin路径 4. 打印版本&#xff1a; protoc --version 5. 安装protoc-gen-go cmd 下输入安装命令&#xff0…...

微信小程序中momentjs无法切换中文问题处理

微信小程序中momentj.s无法切换中文问题处理. 表现为 使用 locale(“zh-cn”)无效。 处理方法 # 1、先删除 miniprogram_npm\moment\index.js # 2、将 node_modules\moment\min\moment-with-locales.min.js 复制到 miniprogram_npm\moment下 并重命名为index.js # 3、修改mi…...

数据结构:链表

链表是一种常见的数据结构&#xff0c;它由一系列节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两个部分&#xff1a;数据域和指针域。数据域用于存储数据元素的值&#xff0c;而指针域则用于指向链表中的下一个节点。这种结构使得链表能够动态地进行插入和删…...

领克Z20结合AI技术,革新自动驾驶辅助系统

眼瞅着&#xff0c;再有不到 5 个星期&#xff0c;春节就要热热闹闹地登场啦&#xff01;对于在外辛苦打拼了一整年的打工人而言&#xff0c;回家过年可不就是这一年里心心念念、最最期盼的高光时刻嘛。这不&#xff0c;这几天各地的高速公路愈发熙熙攘攘起来&#xff0c;川流不…...

vector快慢指针+例题详解

1.快慢指针 例题 给定一个链表&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从…...

重温设计模式--1、组合模式

文章目录 1 、组合模式&#xff08;Composite Pattern&#xff09;概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式&#xff08;Composite Pattern&#xff09;概述 定义&#xff1a;组合模式是一种结构型设计模式&#xff0c;它允许你将对象组合成…...

单片机:实现SYN6288语音播报(附带源码)

单片机实现SYN6288语音播报 SYN6288是一款广泛应用于语音合成的IC&#xff0c;可以通过串口与单片机&#xff08;如51系列、STM32等&#xff09;进行通信&#xff0c;实现场景化的语音播报。通过连接外部存储设备&#xff08;如SD卡&#xff09;存储语音文件或直接通过内部语音…...

cookie,session,token 的区别

解决什么问题?Cookie&#xff08;客户端存储&#xff09;问题来了 Session&#xff08;会话&#xff09;解决的问题问题来了 token(令牌)解决的问题问题:token是无状态的如何解决? 解决什么问题? 解决http无状态的问题,说简单点就是用户身份的验证 举个例子: 张三在银行里…...

基于OpenAI Whisper AI模型自动生成视频字幕:全面解析与实战指南

在数字化时代&#xff0c;视频内容已成为信息传播的重要载体。然而&#xff0c;为视频添加字幕却是一项繁琐且耗时的工作。幸运的是&#xff0c;随着人工智能技术的飞速发展&#xff0c;特别是OpenAI Whisper模型的推出&#xff0c;我们有了更加高效、智能的解决方案。 一、Op…...

物理学天空的两朵乌云——量子论与相对论

物理学天空的两朵乌云——量子论与相对论 爱因斯坦的青春与科学的辉煌起点 提到爱因斯坦&#xff0c;我们往往会联想到一个经典的形象——乱糟糟的头发&#xff0c;叼着烟斗&#xff0c;脸上满是岁月的皱纹。然而&#xff0c;这张深入人心的照片并不是他科学创造力的象征。实…...

聚类之轮廓系数

Silhouette Score&#xff08;轮廓系数&#xff09;是用于评估聚类质量的指标之一。它衡量了数据点与同簇内其他点的相似度以及与最近簇的相似度之间的对比。 公式 对于一个数据点 i&#xff1a; a(i): 数据点 i 到同簇内其他点的平均距离&#xff08;簇内不相似度&#xff…...

Jenkins 构建流水线

在 Linux 系统上安装 Jenkins 服务&#xff0c;以及配置自动化构建项目 前置准备环境&#xff1a;docker、docker-compose、jdk、maven 一、环境搭建 1. Jenkins 安装 &#xff08;1&#xff09;拉取镜像 # 安装镜像包&#xff0c;默认安装最新版本 docker pull jenkins/jen…...

RTK部分模糊度固定测量流程图

部分模糊度剔除常用测量&#xff1a; 周跳或失锁时间优先剔除&#xff1b;按俯仰角剔除&#xff1b;按浮点模糊度协方差大小剔除模糊度&#xff1b;按信号强度剔除卫星&#xff1b;...

力扣-数据结构-2【算法学习day.73】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…...

操作系统导论读书笔记

目录 虚拟化抽象&#xff1a;进程抽象&#xff1a;进程概念 虚拟化 抽象&#xff1a;进程 本章讨论操作系统提供的基本的抽象—— 进程。进程的非正式定义非常简单&#xff1a;进程就是运行中的程序。程序本身是没有生命周期的&#xff0c;它只是存在磁盘上面的一些指令&…...

基于3D-Speaker进行区分说话人项目搭建过程报错记录 | 通话录音说话人区分以及语音识别 | 声纹识别以及语音识别 | pyannote-audio

0. 研究背景 在外呼系统中&#xff0c;我们的后台管理系统通常要对电话录音的内容进行提取和分析。那么说到分析&#xff0c;我们就要对录音中的两个人的对话进行分离&#xff0c;然后分别分析&#xff0c;比如分析客户是否有合作的意愿&#xff0c;分析客服讲的话术是否合理&…...

如何使用流式渲染技术提升用户体验

提示:记录工作中遇到的需求及解决办法 文章目录 什么是流式渲染?Node.js 实现简单流式渲染声明式 Shadow DOM,不依赖 javascript 实现react 实现流式渲染总结提示:以下是本篇文章正文内容,下面案例可供参考 什么是流式渲染? 流式渲染主要思想是将HTML文档分块(chunk)…...

【接口自动化连载】使用yaml配置文件自动生成接口case

直接上干货撸代码&#xff0c;有一些是通用的工具类代码&#xff0c;一次性封装永久使用&#xff0c;期待大家的关注&#xff0c;一起加油&#xff01;&#xff01;&#xff01; 配置文件 根据不同的业务需求进行配置&#xff0c;例如Goods服务、Order服务分开配置&#xff0…...

前端安全 常见的攻击类型及防御措施

1. 跨站脚本攻击&#xff08;XSS&#xff09; 描述&#xff1a;跨站脚本&#xff08;XSS&#xff1a;Cross-Site Scripting&#xff09;是一种安全漏洞&#xff0c;允许攻击者向网站注入恶意客户端代码。该代码由受害者执行从而让攻击者绕过访问控制并冒充用户。XSS攻击可以分…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...

node.js的初步学习

那什么是node.js呢&#xff1f; 和JavaScript又是什么关系呢&#xff1f; node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说&#xff0c; 需要在node.js的环境上进行当JavaScript作为前端开发语言来说&#xff0c;需要在浏览器的环境上进行 Node.js 可…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...