Selenium Webdriver 实现原理详解-手工用Postman调用webdriver执行UI测试

news2024/12/24 11:33:33

目录

1. Selenium 概述

2. 术语解释:

3. Selenium WebDriver 实现原理

4. 安装selenium 客户端,浏览器,驱动 

4.1 安装selenium client lib

4.2 安装浏览器和浏览器驱动

4.3 例子代码

4.4 省略浏览器驱动的方法

4.5 测试代码与Webdriver的交互

5. Webdriver与浏览器的关系

6. 手工用Postman调用webdriver执行UI测试



1. Selenium 概述

​​​​​​​​​​​​​​​​​​​​​Selemium是一款跨浏览器web应用程序自动化测试工具,其发展经历了三个阶段:Selenium Core、Selenium RC 和 Selenium WebDriver,现在每个浏览器都实现了 w3c WebDriver 接口,都有自己的驱动程序。

WebDriver 的开发人员倾向于向用户隐藏其并不关心的很多细节,提供尽可能简单的 API,好让用户聚焦在用例设计和发现 Bug 上。

2. 术语解释:

  • W3C WebDriver 是由 chrome WebDriver 发展而来的浏览器自动化协议,又称 WebDriver 协议 / WebDriver 规范 / WebDriver API
  • Driver 是一个基于HTTP的协议,它提供了一系列的接口用于发现和控制 Web 文档中的 DOM 元素,几乎可以操作浏览器做任何事情。WebDriver协议的详细信息你可以在W3C WebDriver 规范中查看。比如 Chrome 浏览器的 ChromeDriver。
  • ChromeDriver 是一个可以独立运行的服务器程序,它实现了 WebDriver 协议。
  • Selenium WebDriver 是2009年8月由 Selenium 1.0 和 WebDriver 项目合并而成,遵循 w3c WebDriver 协议,早期又称作 Selenium 2.0 WebDriver。

3. Selenium WebDriver 实现原理

  • 对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动
  • 浏览器驱动中包含了一个HTTP Server,用来接收这些http请求
  • HTTP Server接收到请求后根据请求来具体操控对应的浏览器
  • 浏览器执行具体的测试步骤
  • 浏览器将步骤执行结果返回给HTTP Server
  • HTTP Server又将结果返回给Selenium的脚本

在Selenium3之前WebDriver基于的协议:JSON Wire protocol JSON Wire protocol是在http协议基础上,对http请求及响应的body部分的数据的进一步规范。body部分主要传送具体的数据,在WebDriver中这些数据都是以JSON的形式存在并进行传送的,这就是JSON Wire protocol。

Selenium3和Selenium4的最大不同,就是Selenium4放弃了JSON Wire Protocol,转而直接通过W3c web Protocol与各浏览器的Driver进行交互。在早期,浏览器的Driver都是由Selenium来提供的,浏览器的访问接口也并不统一,所以需要使用JSON Wire Protocol来负责在Selenium Client和各Browser Driver之间传递数据。而在Selenium4阶段,浏览器的访问接口都遵守W3c web Protocol,并且各浏览器自己维护各自的Driver。一句话,浏览器自己的驱动更加标准化了,从而提高了selenium代码的效率和稳定性。

以访问百度为例,代码实现为driver.get('https://www.baidu.com/'),查看源码,可以在webdriver.py中看到get方法实际上是调用了self.execute(Command.GET, {'url': url}),而WebDriver类是继承自Remoteexecute方法的核心逻辑是response = self.command_executor.execute(driver_command, params),其中Command.GET在remote_connection.py中的定义为Command.GET: ('POST', '/session/$sessionId/url')


也就是说,Selenium测试代码运行时,会向浏览器driver发送对应的HTTP请求,浏览器driver在收到请求后对浏览器进行操作,再将结果返回给Selenium测试代码。那么,如果我们先运行浏览器driver,再通过Postman向其发送HTTP请求,是不是也能控制浏览器呢?答案当然是肯定的。
 

4. 安装selenium 客户端,浏览器,驱动 

4.1 安装selenium client lib

不同的编程语言选择不同的Selenium客户端库。 对应我们Python语言来说,Selenium客户端库的安装非常简单,用 pip 命令即可。

打开 命令行程序,运行如下命令:

pip install selenium

如果安装不了,可能是网络问题,可以指定使用国内的豆瓣源

pip install selenium -i https://pypi.douban.com/simple/

4.2 安装浏览器和浏览器驱动

浏览器驱动 是和 浏览器对应的。 不同的浏览器 需要选择不同的浏览器驱动。 https://www.google.cn/chrome/

https://chromedriver.storage.googleapis.com/index.html

4.3 例子代码

下面的代码, 可以自动化的 打开Chrome浏览器,并且自动化打开百度网站,可以大家可以运行一下看看。

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

# 创建 WebDriver 对象,指明使用chrome浏览器驱动

wd = webdriver.Chrome(service=Service(r'd:\tools\chromedriver.exe'))

# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址

wd.get('https://www.baidu.com') 

4.4 省略浏览器驱动的方法

我们可以把浏览器驱动 所在目录 加入环境变量 Path ,

写代码时,就可以无需指定浏览器驱动路径了,

像下面这样: wd = webdriver.Chrome()

一定要注意的是, 加入环境变量 Path 的, 不是浏览器驱动全路径,比如 d:\tools\chromedriver.exe 而是 浏览器驱动所在目录,比如 d:\tools 而且设置完环境变量后,别忘了重启IDE(比如 PyCharm) 新的环境变量才会生效。

4.5 测试代码与Webdriver的交互

接下来我会以获取界面元素这个基本的操作为例来分析两者之间的关系。
在测试代码中,我们第一步要做的是新建一个webdriver类的对象:

wd = webdriver.Chrome()

这里新建的driver对象是一个webdriver.Chrome()类的对象,而webdriver.Chrome()类的本质是

from chrome.webdriver import WebDriver as Chrome

5. Webdriver与浏览器的关系

这一部分属于各个浏览器开发者和Webdriver开发者的范畴,所以我们不需要太关注,我们所关心的主要还是测试代码和Webdriver的关系,就好像出租车驾驶员如何驾驶汽车我们不需要关心一样。

6. 手工用Postman调用webdriver执行UI测试

# -*- coding: utf-8 -*-

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from webdriver_manager.chrome import ChromeDriverManager

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.common.by import By

chrome_driver_path = ChromeDriverManager().install()

service = Service(executable_path=chrome_driver_path)

option = webdriver.ChromeOptions()

driver = webdriver.Chrome(service=service, options=option)

driver.get("https://www.baidu.com/")

input_box = driver.find_element(By.ID, "kw")

input_box.send_keys("Hello")

input_box.send_keys(Keys.ENTER)

driver.quit()

以前用过selenium的人,可能都知道需要下载与浏览器版本对应的driver,要不然你的selenium代码就会罢工。最要命的是,如果你不去特意设置,我们的浏览器都是会自动更新版本的,这就让driver不匹配的问题防不胜防。而到了selenium4时代,引入了ChromeDriverManager(pip install webdriver-manager),从而可以根据我们的浏览器当前版本,在代码运行时下载对应的Chrome Driver。其它浏览器也支持这样的功能。当然,ChromeDriverManager并不是我们今天要聊的重点。

我们今天的重点是,手动模拟Selenium Client和Chrome Driver之间的交互。

第一步: 启动Chrome Driver服务

命令行执行命令: chromedriver -port=57789

Chrome driver使用的端口其实是随机的。出于测试目的,此处使用57789。如此,HTTP API的host就是localhost:57789

第二步: 创建一个新session

打开Postman,发送http post request:

此处,API的协议为HTTP,Method是POST,HOST是"localhost:577789", 而Path是"/session"

ChromeDriver在收到这个request后,就会将指令发送给与Driver对应的浏览器,一个新的浏览器实例会被启动,并返回创建好的session信息,此处,sessionID至关重要,因为在后面对浏览器的操作中必须用到。

第三步: 导航到指定的网址 -> 对应代码driver.get("https://www.baidu.com/")

打开Postman,发送http post request:

此处,API的协议为HTTP,Method是POST,HOST是"localhost:577789", 而Path是"/session/{{sessionId}}/url"

ChromeDriver在收到这个request后,就会将指令传达给Chrome浏览器;浏览器收到指令后,在刚打开的浏览器实例上访问上传的URL,然后返回执行结果给Driver;最后Driver返回指令执行结果。为了确保指令传输给了正确的浏览器,API的endpoint中包含了第二步所创建的sessionID。

第四步:find element -> 对应代码driver.find_element(By.ID, "kw")

打开Postman,发送http post request:

此处,API的协议为HTTP,Method是POST,HOST是"localhost:577789", 而Path是"/session/{{sessionId}}/element"

ChromeDriver在收到这个request后,就会将指令传达给Chrome浏览器;浏览器收到指令后,在刚打开页面根据指令查找指定的元素,然后返回查找结果给Driver;最后Driver返回指令执行结果。这边我们会获取到element的ID。这将会在后面作为这个元素的唯一标示,直到session结束。

第五步:输入文字"Hello" -> 对应代码input_box.send_keys("Hello")

打开Postman,发送http post request:

此处,API的协议为HTTP,Method是POST,HOST是"localhost:577789", 而Path是"/session/{{sessionId}}/element/{{elementId}}/value"

ChromeDriver在收到这个request后,就会将指令传达给Chrome浏览器;浏览器收到指令后在刚打开页面根据elementID找到指定的元素,并输入指定的文字,然后返回执行结果给Driver;最后Driver返回指令执行结果。

第六步: 关闭session -> 对应代码driver.quit()

打开Postman,发送http delete request:

此处,API的协议为HTTP,Method是DELETE,HOST是"localhost:577789", 而Path是"/session/{{sessionId}}"

ChromeDriver在收到这个request后,就会将指令传达给Chrome浏览器;浏览器会关闭刚才打开的实例并返回结果给Driver;Driver会删除刚才创建的session,然后返回结果。

通过上面的步骤,相信你对Selenium Client,Browser driver和browser之间的交互会有一些更加直观的认识。或者拓展了思路也未可知。

最后,贴下Selenium命令和HTTP Rest API的对应关系:

{

    Command.NEW_SESSION: ('POST', '/session'),

    Command.QUIT: ('DELETE', '/session/$sessionId'),

    Command.W3C_GET_CURRENT_WINDOW_HANDLE:

        ('GET', '/session/$sessionId/window'),

    Command.W3C_GET_WINDOW_HANDLES:

        ('GET', '/session/$sessionId/window/handles'),

    Command.GET: ('POST', '/session/$sessionId/url'),

    Command.GO_FORWARD: ('POST', '/session/$sessionId/forward'),

    Command.GO_BACK: ('POST', '/session/$sessionId/back'),

    Command.REFRESH: ('POST', '/session/$sessionId/refresh'),

    Command.W3C_EXECUTE_SCRIPT:

        ('POST', '/session/$sessionId/execute/sync'),

    Command.W3C_EXECUTE_SCRIPT_ASYNC:

        ('POST', '/session/$sessionId/execute/async'),

    Command.GET_CURRENT_URL: ('GET', '/session/$sessionId/url'),

    Command.GET_TITLE: ('GET', '/session/$sessionId/title'),

    Command.GET_PAGE_SOURCE: ('GET', '/session/$sessionId/source'),

    Command.SCREENSHOT: ('GET', '/session/$sessionId/screenshot'),

    Command.ELEMENT_SCREENSHOT: ('GET', '/session/$sessionId/element/$id/screenshot'),

    Command.FIND_ELEMENT: ('POST', '/session/$sessionId/element'),

    Command.FIND_ELEMENTS: ('POST', '/session/$sessionId/elements'),

    Command.W3C_GET_ACTIVE_ELEMENT: ('GET', '/session/$sessionId/element/active'),

    Command.FIND_CHILD_ELEMENT:

        ('POST', '/session/$sessionId/element/$id/element'),

    Command.FIND_CHILD_ELEMENTS:

        ('POST', '/session/$sessionId/element/$id/elements'),

    Command.CLICK_ELEMENT: ('POST', '/session/$sessionId/element/$id/click'),

    Command.CLEAR_ELEMENT: ('POST', '/session/$sessionId/element/$id/clear'),

    Command.GET_ELEMENT_TEXT: ('GET', '/session/$sessionId/element/$id/text'),

    Command.SEND_KEYS_TO_ELEMENT:

        ('POST', '/session/$sessionId/element/$id/value'),

    Command.UPLOAD_FILE: ('POST', "/session/$sessionId/se/file"),

    Command.GET_ELEMENT_TAG_NAME:

        ('GET', '/session/$sessionId/element/$id/name'),

    Command.IS_ELEMENT_SELECTED:

        ('GET', '/session/$sessionId/element/$id/selected'),

    Command.IS_ELEMENT_ENABLED:

        ('GET', '/session/$sessionId/element/$id/enabled'),

    Command.GET_ELEMENT_RECT:

        ('GET', '/session/$sessionId/element/$id/rect'),

    Command.GET_ELEMENT_ATTRIBUTE:

        ('GET', '/session/$sessionId/element/$id/attribute/$name'),

    Command.GET_ELEMENT_PROPERTY:

        ('GET', '/session/$sessionId/element/$id/property/$name'),

    Command.GET_ELEMENT_ARIA_ROLE:

        ('GET', '/session/$sessionId/element/$id/computedrole'),

    Command.GET_ELEMENT_ARIA_LABEL:

        ('GET', '/session/$sessionId/element/$id/computedlabel'),

    Command.GET_SHADOW_ROOT:

        ('GET', '/session/$sessionId/element/$id/shadow'),

    Command.FIND_ELEMENT_FROM_SHADOW_ROOT:

        ('POST', '/session/$sessionId/shadow/$shadowId/element'),

    Command.FIND_ELEMENTS_FROM_SHADOW_ROOT:

        ('POST', '/session/$sessionId/shadow/$shadowId/elements'),

    Command.GET_ALL_COOKIES: ('GET', '/session/$sessionId/cookie'),

    Command.ADD_COOKIE: ('POST', '/session/$sessionId/cookie'),

    Command.GET_COOKIE: ('GET', '/session/$sessionId/cookie/$name'),

    Command.DELETE_ALL_COOKIES:

        ('DELETE', '/session/$sessionId/cookie'),

    Command.DELETE_COOKIE:

        ('DELETE', '/session/$sessionId/cookie/$name'),

    Command.SWITCH_TO_FRAME: ('POST', '/session/$sessionId/frame'),

    Command.SWITCH_TO_PARENT_FRAME: ('POST', '/session/$sessionId/frame/parent'),

    Command.SWITCH_TO_WINDOW: ('POST', '/session/$sessionId/window'),

    Command.NEW_WINDOW: ('POST', '/session/$sessionId/window/new'),

    Command.CLOSE: ('DELETE', '/session/$sessionId/window'),

    Command.GET_ELEMENT_VALUE_OF_CSS_PROPERTY:

        ('GET', '/session/$sessionId/element/$id/css/$propertyName'),

    Command.EXECUTE_ASYNC_SCRIPT: ('POST', '/session/$sessionId/execute_async'),

    Command.SET_TIMEOUTS:

        ('POST', '/session/$sessionId/timeouts'),

    Command.GET_TIMEOUTS:

        ('GET', '/session/$sessionId/timeouts'),

    Command.W3C_DISMISS_ALERT:

        ('POST', '/session/$sessionId/alert/dismiss'),

    Command.W3C_ACCEPT_ALERT:

        ('POST', '/session/$sessionId/alert/accept'),

    Command.W3C_SET_ALERT_VALUE:

        ('POST', '/session/$sessionId/alert/text'),

    Command.W3C_GET_ALERT_TEXT:

        ('GET', '/session/$sessionId/alert/text'),

    Command.W3C_ACTIONS:

        ('POST', '/session/$sessionId/actions'),

    Command.W3C_CLEAR_ACTIONS:

        ('DELETE', '/session/$sessionId/actions'),

    Command.SET_WINDOW_RECT:

        ('POST', '/session/$sessionId/window/rect'),

    Command.GET_WINDOW_RECT:

        ('GET', '/session/$sessionId/window/rect'),

    Command.W3C_MAXIMIZE_WINDOW:

        ('POST', '/session/$sessionId/window/maximize'),

    Command.SET_SCREEN_ORIENTATION:

        ('POST', '/session/$sessionId/orientation'),

    Command.GET_SCREEN_ORIENTATION:

        ('GET', '/session/$sessionId/orientation'),

    Command.GET_NETWORK_CONNECTION:

        ('GET', '/session/$sessionId/network_connection'),

    Command.SET_NETWORK_CONNECTION:

        ('POST', '/session/$sessionId/network_connection'),

    Command.GET_LOG:

        ('POST', '/session/$sessionId/se/log'),

    Command.GET_AVAILABLE_LOG_TYPES:

        ('GET', '/session/$sessionId/se/log/types'),

    Command.CURRENT_CONTEXT_HANDLE:

        ('GET', '/session/$sessionId/context'),

    Command.CONTEXT_HANDLES:

        ('GET', '/session/$sessionId/contexts'),

    Command.SWITCH_TO_CONTEXT:

        ('POST', '/session/$sessionId/context'),

    Command.FULLSCREEN_WINDOW:

        ('POST', '/session/$sessionId/window/fullscreen'),

    Command.MINIMIZE_WINDOW:

        ('POST', '/session/$sessionId/window/minimize'),

    Command.PRINT_PAGE:

        ('POST', '/session/$sessionId/print'),

    Command.ADD_VIRTUAL_AUTHENTICATOR:

        ('POST', '/session/$sessionId/webauthn/authenticator'),

    Command.REMOVE_VIRTUAL_AUTHENTICATOR:

        ('DELETE', '/session/$sessionId/webauthn/authenticator/$authenticatorId'),

    Command.ADD_CREDENTIAL:

        ('POST', '/session/$sessionId/webauthn/authenticator/$authenticatorId/credential'),

    Command.GET_CREDENTIALS:

        ('GET', '/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials'),

    Command.REMOVE_CREDENTIAL:

        ('DELETE', '/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials/$credentialId'),

    Command.REMOVE_ALL_CREDENTIALS:

        ('DELETE', '/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials'),

    Command.SET_USER_VERIFIED:

        ('POST', '/session/$sessionId/webauthn/authenticator/$authenticatorId/uv'),

}
 

参考:Postman模拟Selenium Client和Web driver的交互_Lemon2050的博客-CSDN博客_seleniumide结合 postman

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

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

相关文章

Linux近期补充

Linux近期补充Linux命令的近期补充Linux命令的近期补充 1.本地服务器链接远端服务器 命令 ssh 远端服务器ip 如 ssh 121.5.151.236 会弹出 登录框 自己输入密码即可2.当前位置 pwd3.查看网络设备 ifconfig4.查看服务器内存 free -h可以看到还有2.3G内存可以用 5.查看磁盘…

ES学习1~23(ECMAcript相关介绍+ECMASript 6新特性)

1 ECMAcript相关介绍 1.1 什么是ECMA ECMA(European Computer Manufacturers Association)中文名称为欧洲计算机制造商协会,这个组织的目标是评估、开发和认可电信和计算机标准。1994年后该组织改名为Ecma国际。 1.2 什么是ECMScript ECMAScript是由Ecma国际通过…

外网远程访问本地MySQL数据库【cpolar内网穿透】

作为网站运行必备组件之一的数据库,免不了随时对其进行管理维护。若我们没有在安装数据库的电脑旁,但又需要立即对数据库进行管理时,应该如何处理?这时我们可以使用cpolar对内网进行穿透,远程管理和操作MySQL数据库。现…

三叠云甘特图新亮点,可翻页查看数据啦

表单管理 路径 表单 >> 表单设计 功能简介 1.「甘特视图」新增“翻页”功能,用户可以通过翻页查阅更多的数据。 2. 滑动超过显示区域时显示“标记点”,用户可以通过点击标记点快速定位到相应的数据。 3.「列表视图」条件着色功能,修复“系统字…

Linux进程管理

1.什么是程序?具有执行代码和执行权限的文本文件 2.什么是进程?是已启动的可执行程序的运行实例 3.进程的生命周期:由系统程序fork出来的子程序,具备一定的父资源,直到运行完毕 4.进程有哪些组成部分? …

操作系统真相还原_第3章:实模式下跳转指令补充

文章目录数据类型伪指令ret指令call指令jmp指令标志寄存器flags与条件转移数据类型伪指令 byte:字节 word:字 dword:双字 qword:四字 跳转指令指定目标操作数大小 short:字节 near:字 far:双字…

Linux环境下内存泄露检测

linux下内存泄漏检测工具valgrind 该工具可以检测下列与内存相关的问题 : 未释放内存的使用对释放后内存的读/写对已分配内存块尾部的读/写内存泄露不匹配的使用malloc/new/new[] 和 free/delete/delete[]重复释放内存Memcheck。这是valgrind应用最广泛的工具,一个…

vscode插件(个人正在用的)

插件目录any-ruleAuto Close TagAuto Rename Tagbackground-coverChinese (Simplified) (简体中文) Language Pack for Visual Studio CodeDebugger for JavaError LensESLintExtension Pack for JavaImage previewIntelliCodeIntelliCode API Usage ExamplesLanguage Support …

对耳朵伤害最小的耳机类型有哪些,对耳朵伤害小的骨传导耳机

现在耳机的佩戴方式越来越多样化,完美最常见的入耳式耳机,长时间佩戴会导致耳朵肿胀、不适,如果换成骨传导耳机就不会有这个困扰了,骨传导耳机利用开放式听声音的方式,可以在极大程度上减少对听力的损害,从…

Docsify保姆级教程

官网 Docsify官网地址 docsify.js.org/ 前言 动态生成文档网站的一款热门工具!网上很多关于动态生成文档的工具!今天我们的主角是Docsify! Docsify的优点 无需构建,写完文档直接发布容易使用并且轻量智能的全文搜索丰富的 AP…

很好用的Unity编辑器扩展工具 Odin Inspector教程

Odin Inspector是什么? Odin Inspector是Unity的一个插件,让您可以享受拥有强大,自定义和用户友好编辑器的所有工作流程优势,而无需编写任何自定义编辑器代码。 Odin包含许多功能,例如Static Inspector,Pr…

Mybatis框架(一)初识Mybatis之Mybatis简单使用

本文是本人专栏【Java开发后端系列框架】里的文章,文章根据各框架官网与网上资料加上本人工作经验,进行修改总结发布在这个专栏,主要目的是用于自我提升,不用于获取利益。如果系列文章能到帮到您本人将感到荣幸,如果有…

修改配置文件解决matplotlib中文与正负号乱码问题

步骤如下: 1、 找到配置文件matplotlibrc 不管是啥系统,都可以通过以下方式查找matplotlibrc所在的文件夹(可以在终端或者编译器中运行以下代码) import matplotlib# 查找字体路径 print(matplotlib.matplotlib_fname())结果&am…

策略模式Strategy

1.意图:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。 2.结构 Strategy(策略)定义所有支持的算法的公共接口。Context使用这个接口来调用某Concre…

小梅哥FPGA时序分析和约束实例演练课程

P1 FPGA基本原理 基本结构 三要素可类比电路板的器件、连线、对外端子 可编程逻辑功能块 触发器用于实现时序逻辑,进位链用于可编程逻辑块间通讯,使用较少。 具体器件的可编程逻辑功能块结构。第5代将四输入查找表升级到六输入查找表 由上面两个图抽象…

Flink系列-3、Flink入门案例

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址:https://flink.apache.org/ 学习资料:https://flink-learning.org.cn/ 目录Flink程序模型…

Linux内核中sk_buff结构详解

目录 1.sk_buff结构体 1.1 sk_buff在内核中的结构 1.2 重要的长度len的解析 2. sk_buff数据区 2.1 线性数据区 2.2 非线性数据区 ---------------------------------------------------------------------------------------------------------------------------- 1.s…

内置常量--R

1. R中内置的常量 R中内置的常量有:1. LETTERS: 26个大写英文字母2. letters: 26个小写英文字母3. month.abb: 月份英文前三个字母组成的缩写4. month.name: 月份的英文名字5. pi : 圆周率π

TensorRT介绍及使用

1、简介 TensorRT是一个针对已训练好模型的SDK,通过该SDK能够在NVIDIA的设备上进行高性能的推理。优点如下: 总结下来主要有以下6点: Reduced Precision:将模型量化成INT8或者FP16的数据类型(在保证精度不变或略微降…

Linux学习笔记——Linux实用操作(三)

4.10、环境变量 学习目标: 理解环境变量的作用掌握符号$的作用掌握在Linux中配置环境变量 4.10.1、环境变量 1、在讲解which命令的时候,我们知道使用的一系列命令其实本质上就是一个个的可执行程序。 比如,cd命令的本体就是:…