自动化测试-selenium基础操作

news2024/11/25 5:18:16

元素操作

方法:
1.send_keys()  # 输入方法
2.click()  # 点击方法
3.clear()  # 清空方法
# 导包
from time import sleep
from selenium import webdriver

# 实例化浏览器
driver = webdriver.Chrome()

# 打开网址
driver.get('https://www.baidu.com/')

# 需求
ele = driver.find_element_by_css_selector('#kw')
ele.send_keys('苹果15')
sleep(2)

# 清空
ele.clear()
ele.send_keys('苹果16')

# 时间轴看效果
sleep(3)

# 关闭页面
driver.quit()

浏览器常用操作函数

# 方法
"""
1、driver.maximize_window()  # 最大化浏览器
2、driver.set_window_size(w,h)  # 设置浏览器大小 单位像素 【了解】
3、driver.set_window_position(x,y)  # 设置浏览器位置  【了解】
4、driver.back() # 后退操作
5、driver.forward() # 前进操作
6、driver.refrensh() # 刷新操作
7、driver.close() # 关闭当前主窗口(主窗口:默认启动那个界面,就是主窗口)
8、driver.quit() # 关闭driver对象启动的全部页面
9、driver.title # 获取当前页面title信息
10、driver.current_url # 获取当前页面url信息
应用:driver.maximize_windows()  # 窗口最大化
	 driver.set_window_size(w,h) # 设置浏览器大小 【了解】
	 driver.set_window_position(x,y) # 设置浏览器窗口位置 【了解】
"""


1、driver.title 和 drivet.current_url是属性没有括号。应用场景:一般判断上不操作是否执行成功。

2、driver.maximize_window() 一般为前置代码放到获取driver地址后,进行浏览器窗口的最大化

3、driver.refresh() 向浏览器重新发出请求,刷新页面,在cookie 会用到

4、driver.close() 和 driver.quit() 的区别:

close():关闭当前主窗口
quit():关闭由driver对象启动的所有页面
如果只有一个窗口那么quit()和 close()没有区别。

获取元素信息操作

"""
方法:
1、text 获取元素的文本; 如:driver.text
2、size 获取元素的大小: 如:driver.size
3、get_attribute 获取元素属性值;如:driver.get_attribute("id") ,传递的参数是元素的属性名
4、is_displayed 判断元素是否可见 如:element.is_displayed()
5、is_enabled 判断元素是否可用 如:element.is_enabled()
6、is_selected 判断元素是否被选中 如:element.is_selected()

"""

鼠标操作

利用selenium操作鼠标

其对应的类为
ActionChains类,实例化 鼠标对象

导包

from selenium.webdriver.common.action_chains import ActionChains

鼠标常用方法

"""
1、context_click(element) # 右击
2、double_click(element)  #双击
3、double_and_drop(source, target)  # 拖拽
4、move_to_element(element)  # 悬停 【重点】
5、perform()  # 执行上述的事件的方法 【重点】最后一步必须执行这个
"""

注意: selenium 框架虽然提供了 鼠标右键方法,但是没有提供选择右键菜单方法,可以通过键盘快捷键操作实现

键盘操作(不需要实例化对象)☆

1、键盘对应的方法在Keys类中

# 导包
from selenium.webdriver.common.keys import Keys

2、快捷键(这里只讲windows操作系统的快捷键):
CONTROL: Ctrl键

​ BACK_SPACE : 等价于 BACKSPACE (删除)
其他:可以查看其详细方法函数

"""
键盘简单操作
"""
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')

ele = driver.find_element(By.ID, 'kw')
ele.send_keys('苹果15')
sleep(1)
ele.send_keys(Keys.BACK_SPACE)
sleep(1)
# 组合键 Ctrl + a 全选 ,注意这里的组合键都是小写
ele.send_keys(Keys.CONTROL, 'a')
sleep(1)
# 剪切
ele.send_keys(Keys.CONTROL, 'x')
sleep(1)
# 剪切之后的粘贴
ele.send_keys(Keys.CONTROL, 'v')

sleep(3)

driver.quit()

键盘类中的操作

# Licensed to the Software Freedom Conservancy (SFC) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The SFC licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

"""The Keys implementation."""


class Keys:
    """Set of special keys codes."""

    NULL = "\ue000"
    CANCEL = "\ue001"  # ^break
    HELP = "\ue002"
    BACKSPACE = "\ue003"
    BACK_SPACE = BACKSPACE
    TAB = "\ue004"
    CLEAR = "\ue005"
    RETURN = "\ue006"
    ENTER = "\ue007"
    SHIFT = "\ue008"
    LEFT_SHIFT = SHIFT
    CONTROL = "\ue009"
    LEFT_CONTROL = CONTROL
    ALT = "\ue00a"
    LEFT_ALT = ALT
    PAUSE = "\ue00b"
    ESCAPE = "\ue00c"
    SPACE = "\ue00d"
    PAGE_UP = "\ue00e"
    PAGE_DOWN = "\ue00f"
    END = "\ue010"
    HOME = "\ue011"
    LEFT = "\ue012"
    ARROW_LEFT = LEFT
    UP = "\ue013"
    ARROW_UP = UP
    RIGHT = "\ue014"
    ARROW_RIGHT = RIGHT
    DOWN = "\ue015"
    ARROW_DOWN = DOWN
    INSERT = "\ue016"
    DELETE = "\ue017"
    SEMICOLON = "\ue018"
    EQUALS = "\ue019"

    NUMPAD0 = "\ue01a"  # number pad keys
    NUMPAD1 = "\ue01b"
    NUMPAD2 = "\ue01c"
    NUMPAD3 = "\ue01d"
    NUMPAD4 = "\ue01e"
    NUMPAD5 = "\ue01f"
    NUMPAD6 = "\ue020"
    NUMPAD7 = "\ue021"
    NUMPAD8 = "\ue022"
    NUMPAD9 = "\ue023"
    MULTIPLY = "\ue024"
    ADD = "\ue025"
    SEPARATOR = "\ue026"
    SUBTRACT = "\ue027"
    DECIMAL = "\ue028"
    DIVIDE = "\ue029"

    F1 = "\ue031"  # function  keys
    F2 = "\ue032"
    F3 = "\ue033"
    F4 = "\ue034"
    F5 = "\ue035"
    F6 = "\ue036"
    F7 = "\ue037"
    F8 = "\ue038"
    F9 = "\ue039"
    F10 = "\ue03a"
    F11 = "\ue03b"
    F12 = "\ue03c"

    META = "\ue03d"
    COMMAND = "\ue03d"
    ZENKAKU_HANKAKU = "\ue040"

元素等待

1、为什么需要元素等待?
由于电脑配置或者网络原因,在查找元素时,元素代码没有在第一时间被加载出来,而抛出异常
2、什么是元素等待

​ 元素在第一次未找到时,元素等待设置的时长被激活,如果在设置的有效时长内找到元素,继续执行代码,如果超出设置的时长未找打元素,抛出未找到元素异常。

3、元素等待分类

​ 隐式等待:针对全局元素生效;(讲这个)

​ 显示等待:稍微麻烦,有兴趣的可以下去了解,他是针对单个元素生效。

隐式等待
driver.implicitly_wait(30) # 一般情况下设置30秒

除了这种方式也可以通过sleep方法

下拉框(需要实例化下拉框)

1、为什么单独使用下拉框
1)、如果option选项没有value值的化,css定位或其他定位就不太方便。
2、使用Select类

​ 1)、导包:from selenium.webdriver.support.select improt Select

​ 2)、实例化下拉框:s = Select(element)

​ 3)、调用方法:s.select_by_index()索引从0开始

3、Select类提供的方法

​ 1)、select_by_index() # 通过索引定位

​ 2)、select _by_value() # 通过value值

​ 3)、select_by_visible_text() # 显示文本

"""
Select类方法:
需要实例化下拉框元素定位
"""
from time import sleep

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('file:///E://code//SeleniumTest//aa.html')
ele = driver.find_element(By.ID, 'selectA')

# 实例化下拉框
s = Select(ele)

# index 索引方法
# 选择了索引为1的,索引从0开始
s.select_by_index(1)
sleep(2)

# value 属性值选择目标元素
s.select_by_value('sz')
sleep(2)

# text 采用文本的方式选择目标信息
s.select_by_visible_text('研究生')

sleep(3)

driver.quit()

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	受教育程度:
		<select id="selectA">
    			<option>小学</option>
    			<option >初中</option>
    			<option>高中</option>
    			<option value="sz">大专</option>
    			<option>本科</option>
    			<option>研究生</option>
    			<option>博士生及博士生以上</option>
</select>
</body>
</html>

弹出框

1、为什么要处理弹出框?

​ 一旦出现弹出框,如果不进行处理,则后续操作不可实现

2、前端实现弹窗分类

​ 系统弹窗:JS实现

​ 自定义弹窗:前端代码封装(使用各种成熟组件实现)

3、对话框的分类:

​ alert:警告框

​ confirm:确认框

​ prompt:提示框

4、如何处理

​ 系统弹窗:上面的对话框处理方式都一样;

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript">
function disp_prompt()
  {
<!--  prompt是JavaScript中一个重要的方法,它可以让我们在页面上弹出一个输入框,可以用来获取用户输入的数据-->
  var name=prompt("请输入您的名字","Bill Gates")
  if (name!=null && name!="")
    {
    document.write("你好!" + name + " 今天过得怎么样?")
    }
  }
</script>
</head>
<body>

<input id="but" type="button"  onclick="disp_prompt()" value="显示提示框" />

</body>
</html>
"""
系统弹窗:
切换对话框:driver.switch_to.alert
同意:alert.accept()
拒绝:alert.dismiss()
"""
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get('file:///E://code//SeleniumTest//tankuang.html')
driver.implicitly_wait(30)

ele = driver.find_element(By.ID, 'but')
ele.click()
# 定位到到弹窗
a = driver.switch_to.alert

print(driver)
# 获取弹窗的内容
print(a.text)

# 触发取消按钮
a.dismiss()
sleep(2)

# 同意
# a.accept()


driver.quit()

自定义弹窗,由于可以鼠标右击检查选项获取元素信息,所以出现自行已弹窗的时候,直接定义目标元素,并进行移除操作即可。

滚动条

1、为什么要是用滚动条?

​ 在一些特殊场景中,一些按钮是在页面最下角,需要使用滚动条拉到最底层。

2、操作步骤
selenium操作滚动条的方法
Selenium框架中没有专门处理滚动条的方法,需要通过调用 Js 代码实现操作;

1)、第一步:设置操作滚动条操作语句:js_down=“window.scollTo(0,1000)”

​ > 0:为左边距-----》水平滚动条

​ > 1000: 为垂直滚动条

​ 2)、第二步:调用执行js方法,将设置js语句传入方法中

​ > 方法:driver.execute_script(js_down)


"""
滚动条:selenium中没有滚动条方法,需要js代码实现
1、准备js代码:"window.scrollTo(0, 1000)"
2、执行js代码:driver.execute_script(js的变量)
"""
from time import sleep
from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://blog.csdn.net/feiyu68/article/details/120928895')
sleep(2)
# 1、准备js代码
js_down = "window.scrollTo(0, 1000)"
# 2、执行js代码
driver.execute_script(js_down)

sleep(3)

driver.quit()


切换frame表单 (重点)

selenium操作frame
1、应用场景:

处于frame 中的元素,虽然可以获取元素信息,但是代码执行时无法定位元素,因此需要先切换到frame,再进行元素定位操作。

2、如何切换frame

方法:driver.switch_to.frame(“id/name/element”) 传入的是代表frame唯一的特征值


"""
frame的切换
"""
from time import sleep
from selenium import webdriver

driver = webdriver.Chrome()

driver.get('url')

# 切换到frame
driver.switch_to.frame('idframe1')
# 在frame表单中填写信息
driver.find_element_by_id('userA').send_keys('admin')

sleep(3)

driver.quit()

连续切换frame

"""
需要默认切换到frame
方法:driver.switch_to.default_content()
"""
from time import sleep
from selenium import webdriver

driver = webdriver.Chrome()

driver.get('url')

driver.switch_to.frame('idframe1')
driver.find_element_by_id('userA').send_keys('admin')

driver.switch_to.default_content()
driver.switch_to.frame('myframe2')
driver.find_element_by_id('userB').send_keys('admin4')

sleep(3)

driver.quit()

多窗口切换

1、为什么要切换多窗口

页面是存在多窗口的,但是selenium默认焦点只会在主窗口上的所有元素,不切换窗口,就不能操作除主窗口以外的窗口内元素。

2、如何切换

每个窗口都有唯一的一个句柄值,那么我们就可以通过句柄值来完成窗口的切换操作

​ 方法:

​ 1)、driver.current_window_handle (获取当前的句柄值)

​ 2)、driver.window_handles ( 获取当前由driver启动所有窗口句柄)

​ 3)、driver.switch_to.window(handle) —> 切换窗口

"""
从百度搜索页面切换到百度账号注册页面,并进行注册
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

url = "https://www.baidu.com"
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get(url)

# 获取百度搜索窗口句柄
search_window = driver.current_window_handle
print(search_window)

# 切换到注册界面
driver.find_element(By.ID,"s-top-loginbtn").click()
driver.find_element(By.ID,"TANGRAM__PSP_11__regLink").click()   # 此时有一个百度搜索页面,一个百度注册页面

print("==========")
# 获取当前窗口的所有句柄
handles = driver.window_handles # 返回的是一个数组
print(handles)

for handle in handles:
    if handle != search_window:
        driver.switch_to.window(handle) # 切换到注册页面
        print(driver.title) # 打印当前页面名称
        driver.find_element(By.NAME,"userName").send_keys("baidu")

        time.sleep(2)
        # 关闭当前窗口
        driver.close()


# 返回搜索窗口
driver.switch_to.window(search_window)
print(driver.title)

driver.quit()

截图操作

使用的方法:

driver.get_screenshot_as_file(imgepath)

参数:

imagepath:为图片要保存的目录地址及文件名称

"""
截图:driver.get_screenshot_as_file(imgepath)
"""
from time import sleep

from selenium import webdriver

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

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

driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys('苹果15')
# 截图方法,建议使用png格式 , ./为当前路径,  ../为上一级路径
driver.get_screenshot_as_file('./info.png')

sleep(3)

driver.quit()

验证码

1、什么是验证码?

​ 一种随机生成的信息(文字,数字,图片)

2、验证码的作用?

​ 防止恶意请求

3、验证码的处理

​ 这边讲的是cookie解决

4、使用cookie 登录

​ 客户端登录账号后,将登录状态的想关 cookie 信息发给服务器保存,再发送去请求,携带cookie信息如果跟服务器保留的一致,则服务器认为客户端是登录状态。

5、这里实现自动登录的功能

​ 1)、准备工作,在客户端登录的状态下,获取cookie字段
在这里插入图片描述
2、方法步骤:

1、整理cookie信息为字典数据,对应的是name和value,保存的一个变量中
2、调用方法添加cookie
	driver.add_cookie(cookie变量)
# 3、刷新页面 -->发送cookie给服务器验证
	driver.refresh()

"""
验证码:
{'name':'BDUSS',
'value':'............................'}
"""
from time import sleep

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')
driver.maximize_window()

# 1、整理cookie信息为字典数据,对应的是name和value,保存的一个变量中
cookie_value = {'name':'BDUSS',
'value':'........................'}

# 2、调用方法添加cookie
driver.add_cookie(cookie_value)

# 3、刷新页面 -->发送cookie给服务器验证
driver.refresh()

sleep(3)

driver.quit()

学习链接

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

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

相关文章

HTTP项目常见状态码笔记(200,302,400,403,404,405,500...),

目录 认识 "状态码" (status code) 出现200 403 Forbidden 出现404 404 Not Found 出现 405 Method Not Allowed 出现 500 Internal Server Error 504 Gateway Timeout 302 Move temporarily 301 Moved Permanently 出现 "空白页面" 出现 &qu…

制作内网离线百度地图

下载离线地图瓦片 通过百度ak&#xff08;没有的可以去百度官网自行申请下载&#xff09;&#xff0c;拉取下列git 项目&#xff0c;可以免费下载离线瓦片 https://gitee.com/jinqianwang/baidu-offline-map-download 目录结构&#xff1a; 使用步骤&#xff1a; 第一步&am…

Midjourney绘画常用聊天界面介绍

刚开始使用MJ (Midjourney) 的小伙伴可能对这个复杂的界面有点迷糊&#xff0c;网站也无法翻译。 实不相瞒刚开始的时候我也一脸懵逼&#xff0c;对于小白来说启动门槛很高&#xff0c;但是认识之后就一点也不复杂。 接下来我们分三步认识Midjourney的界面: 第一步: 打开Mid…

基于Java+Swing+Mysql实现酒店管理系统

基于JavaSwingMysql实现酒店管理系统 一、系统介绍二、功能展示1.用户登陆2.首页3.开房4.退房5.房间信息6、顾客信息 三、数据库四、其它1.其他系统实现2.获取源码 一、系统介绍 系统功能&#xff1a;用户登陆、验证码验证、开房、退房、房间信息、顾客信息 运行环境&#xf…

【im群发推送软件】(Apple Push Notification service):APNs 是苹果提供的推送服务

iMessage 推送需要您对苹果的推送服务和相关开发技术有一定的了解&#xff0c;并熟悉应用程序开发的相关知识。以下是一些关键的方面和步骤&#xff0c;供您参考&#xff1a; 开发者账号和证书&#xff1a;您需要注册苹果开发者账号&#xff0c;并获取开发者证书用于推送服务。…

PEFAT:通过伪损失估计和特征对抗训练增强半监督医学图像分类

文章目录 PEFAT: Boosting Semi-supervised Medical Image Classification via Pseudo-loss Estimation and Feature Adversarial Training摘要本文方法Feature Adversarial Training 实验结果 PEFAT: Boosting Semi-supervised Medical Image Classification via Pseudo-loss …

PIQN:Parallel Instance Query Network for Named Entity Recognition

原文链接&#xff1a;https://aclanthology.org/2022.acl-long.67.pdf ACL 2022 介绍 问题 将命名实体识别任务作为阅读理解任务&#xff08;MRC&#xff1a;machine reading comprehensive&#xff09;来做&#xff0c;存在3个问题&#xff1a; 1&#xff09;一类问题只能提取…

腾讯云服务器可用区什么意思?怎么选择合适?

腾讯云服务器可用区是什么意思&#xff1f;可用区是指在同一个地域内电力和网络相互独立的区域&#xff0c;可用区可以做到故障隔离&#xff0c;所以可用区存在的意义在于构建高可用、高容灾应用&#xff0c;将应用部署在不同可用区内&#xff0c;一个可用区发生故障&#xff0…

Cisco MPLS VPN Option C1

一、拓扑 AR1和AR8是一家公司两个站点&#xff0c;现在通过MPLS VPN Option C1实现跨域互联 使用思科设备模拟 AR1到AR8各有一个loopback0接口分别是1.1.1.1 2.2.2.2 二、配置思路 1、先配置AS内底层网络 AR2 AR3 AR4配置eigrp实现互联 AR5 AR6 AR7同样方法 2、AS 10…

ChatGPT 更新:大杀器!函数调用示范

自ChatGPT 3.5/4 双双升级&#xff1a;更长&#xff0c;更便宜&#xff0c;更开放&#xff0c;更可控发出去之后&#xff0c;有朋友问怎么接入 API。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 什么是函数调用&#xff1f; 函数调用指 Chat-GPT 模型会自动逻辑判断后&#xff0c;调用在代…

如何让程序在后台隐藏窗口运行 - 静默运行器

有的时候你可能会想让一个程序或多个在后台运行&#xff0c;并隐藏其窗口界面。你可以使用静默运行器这款软件。 静默运行器是一款小巧的Windows系统工具软件&#xff0c;它可以轻松的让你在后台静默运行多个程序&#xff0c;隐藏程序窗口和界面&#xff0c;并提高或降低后台进…

在 Debian 12 上安装 KubeSphere 实战入门

老 Z&#xff0c;运维架构师&#xff0c;云原生爱好者&#xff0c;目前专注于云原生运维&#xff0c;云原生领域技术栈涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 前言 知识点 定级&#xff1a;入门级KubeKey 安装部署 KubeSphere 和 KubernetesDebian 操…

【Python】函数进阶 ④ ( Lambda 匿名函数 | 具名函数与匿名函数 | Lambda 函数定义语法 )

文章目录 一、具名函数与匿名函数二、Lambda 函数定义语法三、代码示例 - Lambda 函数定义语法 一、具名函数与匿名函数 在 Python 中 , 使用 def 关键字定义的函数 是 " 具名函数 " , 也就是有名字的函数 ; 与 " 具名函数 " 相对应的是 " 匿名函数 …

DDR3引脚分配问题

前言 ddr3引脚分配基础知识ddr3引脚分配过程中遇到的问题一次作者在某项目设计时,应硬件同事要求,验证设计管脚摆放位置。出现的问题记录一下,以便以后避坑。 ddr3引脚分配基础知识 1.ddr3一个bank可以放置4个group。 2.每个group包括1对dqs差分信号,8个数据信号,1个dm信…

Nginx运维常用技术点总结

文章目录 一、简介&#xff1a;1、Nginx简介2、常用四大发行版 二、Nginx编译安装&#xff1a;1、Nginx编译安装2、Nginx目录结构3、Nginx 相关命令 三、Nginx配置文件解析1、最小配置2、虚拟主机3、匹配正则表达式 四、Nginx反向代理1、理论2、实践&#xff1a;Nginx反代代理T…

兼容性测试如何提高网站的安全性?

兼容性测试如何提高网站的安全性? 在今天的互联网时代&#xff0c;随着各种网络攻击和黑客活动的频繁发生&#xff0c;网站的安全性问题越来越引起人们的关注。而在提高网站安全性方面&#xff0c;兼容性测试是一个非常重要的环节。本文将从什么是兼容性测试、为什么兼容性测试…

【MySQL】数据库基础 ①

✍什么MYSQL是数据库&#xff1f; MySQL 是一个关系型数据库管理系统&#xff0c;它是基于关系模型的数据存储方式&#xff0c;以表格形式组织数据&#xff0c;并使用结构化查询语言 (SQL) 进行数据操作。MySQL 是一个流行的数据库管理系统&#xff0c;被广泛用于互联网应用和网…

Python基础(6)——Python输出

Python基础&#xff08;6&#xff09;——Python输出 文章目录 Python基础&#xff08;6&#xff09;——Python输出目标输出格式化输出1.1 格式化符号1.2 体验1.3 转义字符1.4 结束符 总结 目标 格式化输出 格式化符号f-字符串 print的结束符 输出 作用&#xff1a;程序输出…

【正点原子STM32连载】 第三十四章 PWM DAC实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第三…

NSS刷web(1)

一点点做,简单的也不跳了,就当回忆知识了 [SWPUCTF 2021 新生赛]gift_F12 ctrlu [SWPUCTF 2021 新生赛]jicao [SWPUCTF 2021 新生赛]easy_md5 [SWPUCTF 2021 新生赛]easy_sql [SWPUCTF 2021 新生赛]include [SWPUCTF 2021 新生赛]easyrce [SWPUCTF 2021 新生赛]caidao [SWP…