ui自动化知识点-web端

news2024/10/24 7:02:08
UI User Interface( ⽤户接⼝ - ⽤户界⾯ ) ,主要包括: app web
ui ⾃动化测试:使⽤⼯具或代码执⾏⽤例的过程
什么样的项⽬适合做⾃动化:
    1、需要回归测试项⽬(甲⽅⾃营项⽬、⾦融、电商)
    2、需求变动不频繁:稳定的模块
    3、项⽬周期⻓的项⽬:(甲⽅⾃营项⽬、6个⽉以上的外包)
⾃动化测试⽬的:提⾼测试效率
⾃动化测试⼯具及环境:
⼯具
        QTP:商业、收费、⽀持 UI
        robot Framework: python 扩展库、使⽤封装好的关键字驱动、半代码⽔平、 ⽀持UI         selenium:开源、免费、主流 ⽀持 UI(推荐)
selenium介绍:
提示:
 1、selenium-grid可以做分布式(批量在不同平台中运⾏⽤例),⾃动化⽤例较多时、或测试不
同浏览器在不同平台运⾏时可以使⽤。
 2、对⻚⾯元素实施⾃动化测试,主要使⽤:webdriver (我觉得这个最多使用的,可能是接触不深)
selenium-webdriver环境搭建
所需环境: pthon 解释器 +pycharm+selenium+ 浏览器 + 浏览器驱动
selenium安装命令
pip install selenium
(特地去查了一 下安装 pip 自从Python 3.4版本开始,pip已经被内置在Python中,所以无需再次安装。)
浏览器驱动(这里我是使用的edge浏览器,所以根据需求自己安装相应的驱动,可以去查一下)
chrome: http://npm.taobao.org/mirrors/chromedriver/
提示:浏览器驱动⼤版本必须和浏览器版本⼀致。

windows:
 1、解压下载的驱动,获取到chromedriver.exe
 2、将chromedriver.exe复制到python.exe所在⽬录即可(避免再次将chromedrver.exe
添加path变量)
mac:
 1、解压下载的驱动,获取到chromedriver
 2、将chromedriver复制到/usr/local/bin⽬录即可。
元素定位:
为什么要学习 xpath css
1、如果标签没有(id\name\class)3个属性,也不是链接标签,只能使⽤tag_name定位,⽐较麻
烦。
2、⽅便在⼯作⽤中查找元素,使⽤xpath和css⽐较⽅便(⽀持任意属性、层级)来找元素

Xpath:使⽤标签路径来定位

绝对路径:从根⽬录开始,逐级查找标签。/html/body/form/div/fieldset/center/p[1]/input
相对路径:从任意路径开始,查找标签。//center/p[1]/input
# 绝对路径
#el =driver.find_element_by_xpath("/html/body/form/div/fieldset/center/p[1]/input
")
el=driver.find_element(By.XPATH,'/html/body/form/div/fieldset/center/p[1]/input')

el.send_keys("admin")
sleep(2)
# 清除内容
el.clear()
# 相对路径
driver.find_element(By.XPATH,"//p[1]/input").send_keys("123")
属性
单属性: //*[@ 属性名 =' 属性值 ']
多属性: //*[@ 属性名 =' 属性值 ' and @ 属性名 =' 属性值 ']
提示:可以使⽤任何属性。

层级与属性
说明: 如果元素现有的属性不能唯⼀匹配,需要结合层级使⽤
语法:
        //⽗标签 / ⼦标签 必须为直属⼦级
        //⽗标签 [@ 属性 =' ']// 后代标签 ⽗和后代之间可以跨越元素
可以扩展:
        根据显示⽂本定位: //*[text()=' ⽂本值 ']
        属性值模糊匹配: //*[contains(@ 属性名 ,' 属性部分值 ')]
from time import sleep
from selenium import webdriver
# 1、获取浏览器
driver = webdriver.Chrome()

# 2、打开url
driver.get("file:///E:/%E6%B5%8B%E8%AF%95%E8%B5%84%E6%96%99%E3%80%90%E5%AF%86%E7%A0%81%E6%98%AF%EF%BC%9A666java.com%E3%80%91/%E6%B5%8B%E8%AF%95%E8%B5%84%E6%96%99/09UI/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/%E6%B3%A8%E5%86%8CA.html")

# 3、查找操作元素
# 点击登录链接 ⽂本
driver.find_element(By.XPATH,"//*[text()='登录']").click()
# 输⼊⽤户名 属性
driver.find_element(By.XPATH,"//*[@placeholder='⼿机号/邮箱']").send_keys("13600001111")
# 密码 包含
driver.find_element(By.XPATH,"//*[contains(@placeholder,'密')]").send_keys("123456")
# 验证码 多属性
driver.find_element(By.XPATH,"//*[@placeholder='验证码' and @name='verify_code']").send_keys("8888")
# 登录按钮 层级
driver.find_element(By.XPATH,"//*[@class='login_bnt']/a").click()

# 4、关闭浏览器
sleep(3)
driver.quit()
css选择器:html 查找元素的⼯具
id 选择器
        语法: #id 属性值
        前置: 标签必须 id 属性
类选择器
        语法: .class 属性值
        前置: 标签必须 class 属性
标签选择器
        语法: 标签名
        提示: 注意标签是否在⻚⾯中唯⼀,否则返回单个或所有
属性选择器
        语法: [ 属性名 =' 属性值 ']
        说明: 标签任意属性都可以
 ⽤户名 id选择->#id属性值
driver.find_element_by_css_selector("#userA").send_keys("admin")
# 密码 属性选择器->[属性名='属性值']
driver.find_element_by_css_selector("[name='passwordA']").send_keys("123456")
# 电话 类选择器->.class属性值
driver.find_element_by_css_selector(".telA").send_keys("18600000000")
# 确定 标签选择器-标签名
sleep(2)
driver.find_element_by_css_selector("button").click()
层级选择器
⽗⼦关系: 选择器 > 选择器 如: #p1>input
后代关系: 选择器 选择器 如: #p1 input
提示: 选择器使⽤任何⼀种 css 选择器( id 选择器、类选择器、属性选择器、标签选
择器)都可以
find_element:
说明: ⼋种元素定位⽅法底层使⽤的查找元素⽅法都是 find_element, 通过 By 不同的值区
分定位⽅式
⽬的: 后期为了查找元素⽅法的封装
#By的导入 可以使用alt+enter键,就会导入相应的包
from selenium.webdriver.common.by import By

driver.find_element(By.ID,"userA").send_keys("admin")
driver.find_element(By.NAME,"passwordA").send_keys("123456")
driver.find_element(By.CLASS_NAME,"telA").send_keys("18600000000")
sleep(2)
driver.find_element(By.TAG_NAME,"button").click()
结论: 1、⾸推css定位,原因执⾏速度快。 (我个人最喜欢这个哈,最常用的上面的一行的方式)
                ①如果有ID属性,使⽤#id
                ②没有id属性,使⽤其他有的属性(能代表唯⼀的属性)
                ③如果属性都带不了唯⼀,使⽤层级
2、如果css解决不了,使⽤xpath。

元素操作:

元素 =driver.find_element()
点击:元素 .click()
输⼊:元素 .send_keys( 内容 )
清空:元素 .clear()
获取元素信息:
获取⼤⼩: 元素 .size
获取⽂本: 元素 .text
获取属性: 元素 .get_attribute(' 属性名 ')
元素是否可⻅: 元素 .is_displayed()
元素是否可⽤: 元素 .is_enabled()
元素是否选中: 元素 .is_selected()
# 获取⼤⼩ 元素.size
user = driver.find_element(By.CSS_SELECTOR,"#userA").size
print("⽤户名输⼊框的⼤⼩:",user)
# 获取内容 元素.text
a_text = driver.find_element(By.TAG_NAME,"a").text
print("第⼀个a标签的⽂本:",a_text)
# 获取属性 超连接地址
a_href = driver.find_element(By.TAG_NAME,"a").get_attribute("href")
print("第⼀个a标签的链接:",a_href)
# 判断span标签是否可⻅ 元素.is_displayed
span = driver.find_element(By.TAG_NAME,"span").is_displayed()
print("span是否可⻅:",span)
# 判断取消按钮是否可⽤ is_enabled
btn_is_enabled = driver.find_element(By.CSS_SELECTOR,"#cancelA").is_enabled()
print("取消按钮是否可⽤:",btn_is_enabled)
# 旅游是否选中 is_selected
is_selected = driver.find_element(By.CSS_SELECTOR,"#lyA").is_selected()
print("旅游是否被选中:",is_selected)

api操作:

需求:
打开注册A.html页面,完成以下操作
1).最大化窗口
2).暂停3s,设置窗口宽度:500px,高度:700px
3).暂停3s,设置窗口位置:x=0px,y=500px
4).暂停3s,点击界面 百度 超链接
5).暂停3s,返回注册A页面
6).暂停3s,前进到百度页面
7).暂停3s,刷新百度页面
8).暂停3s,关闭浏览器
# 最⼤化浏览器
driver.maximize_window()
sleep(3)
# 设置窗⼝⼤⼩
driver.set_window_size(500,700)
sleep(3)
driver.set_window_position(0,500)
sleep(3)

# 点击新浪
driver.find_element_by_partial_link_text("新浪").click()
sleep(3)
# 后退
driver.back()
sleep(3)
# 前进
driver.forward()
sleep(3)
driver.refresh()
sleep(3)
driver.quit()
1、close关闭当前焦点所在窗⼝ driver.close()
2、quit关闭的是浏览器 driver.quit()
3、获取标题  driver.title
4、获取网页地址 driver.current_url
下拉框:
方式一:(这种更加简洁,推荐哈)
# 点击⼴州
driver.find_element(By.CSS_SELECTOR, "[value='gz']").click()
sleep(2)
driver.find_element(By.CSS_SELECTOR, "[value='sh']").click()
sleep(2)
driver.find_element(By.CSS_SELECTOR, "[value='bj']").click()

方式二:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
# 使⽤Select类来实现
# 1、定位下拉框元素 select
el = driver.find_element(By.CSS_SELECTOR,"#selectA")
# 2、实例化Select对象
select = Select(el)
# 3、使⽤下标定位⼴州
select.select_by_index(2)
sleep(2)
# 使⽤value定位上海
select.select_by_value("sh")
# 使⽤⽂本定位 北京
sleep(2)
select.select_by_visible_text("A北京")

弹框:

当界面存在弹出框时,必须先处理掉弹出框才能继续其它操作!
1、获取弹窗对象
2、点⽤同意或取消⽅法
# 点击弹窗
driver.find_element(By.ID,"alerta").click()
sleep(2)
# 获取弹窗对象
el = driver.switch_to.alert
# 处理弹窗 同意/取消
# el.dismiss() # 取消
# print("弹出⽂本:",el.text)
el.accept() # 同意
sleep(2)
# 输⼊⽤户名
driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")

滚动条:

有些⻚⾯场景,必须滚动条拉倒最底下才做某事
如:注册⻚⾯,阅读完需求,协议才能勾选,此时就必须拖动滚动条。

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


driver = webdriver.Edge()
driver.get("file:///E:/%E6%B5%8B%E8%AF%95%E8%B5%84%E6%96%99%E3%80%90%E5%AF%86%E7%A0%81%E6%98%AF%EF%BC%9A666java.com%E3%80%91/%E6%B5%8B%E8%AF%95%E8%B5%84%E6%96%99/09UI/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/%E6%B3%A8%E5%86%8CA%E7%B4%AB%E8%89%B2.html")

# driver.set_window_size(100,500)
# sleep(2)

# js -> 向下滑动10000像素
# js_down = "window.scrollTo(0,10000)"
# 动态执⾏滑倒底部 向下滑动滚动条⾼度
# js(0,10000) 第⼀个0为⽔平滚动条
js_down = "window.scrollTo(0,document.body.scrollHeight)"
# 执⾏js⽅法
driver.execute_script(js_down)
sleep(2)
# js—> 向上
js_top = "window.scrollTo(0,0)"
driver.execute_script(js_top)

鼠标操作:

from selenium.webdriver import ActionChains
# 获取ActionChains对象
action = ActionChains(driver)

# 查找注册按钮
el = driver.find_element(By.CSS_SELECTOR,"button")
sleep(2)
# 调⽤悬停⽅法
action.move_to_element(el).perform()

# username = driver.find_element(By.CSS_SELECTOR,"#userA")
# # 右击
# action.context_click(username).perform()

username = driver.find_element(By.CSS_SELECTOR,"#userA")
username.send_keys("admin")
sleep(3)

# 双击
action.double_click(username).perform()

# 拖拽
action = ActionChains(driver)
div1 = driver.find_element(By.CSS_SELECTOR, "#div1")
div2 = driver.find_element(By.CSS_SELECTOR, "#div2")
action.drag_and_drop(div1, div2).perform()

等待:

代码执⾏过程中,第⼀次未找到元素,先不抛出异常。激活等待时间,在等待过程中如果找到元素
就执⾏。
类型:
        1、隐式等待
        2、显示等待
        3、强制等待 -->time.seep(秒)
隐式元素等待
说明: 针对全部元素⽣效
⽅法: driver.implicitly_wait( )
定位元素时,如果能定位到元素则直接返回该元素,不触发等待;
如果不能定位到该元素,则间隔一段时间后再去定位元素;
如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常NoSuchElementException。
显示等待
说明: 针对单个元素⽣效,可以修改查找频率和超时时间。
        定位元素时,如果能定位到元素则直接返回该元素,不触发等待;
        如果不能定位到该元素,则间隔一段时间后再去定位元素;
        如果在达到最大时长时还没有找到指定元素,则抛出超时异常 TimeoutException
特点: 查找并返回元素
from selenium.webdriver.support.wait import WebDriverWait
# 2、显示等待 -> 返回查找到的元素
el = WebDriverWait(driver,10,0.5).until(lambda x:
x.find_element(By.CSS_SELECTOR,"#userAA"))
el.send_keys("admin")
强制等待
语法: sleep(10)
提示: 执⾏到这句必须等待 10 秒,不灵活。
frame标签:在页面中加载另一个页面。
焦点默认在启动⻚⾯,如果不出处理 iframe ,⽆法操作 iframe 嵌⼊的⻚⾯元素。
步骤:
1、切换到iframe driver.switch_to.frame(iframe元素)
2、操作元素
3、回到默认⻚⾯ driver.switch_to.default_content()
# 获取注册A iframe元素
A = driver.find_element(By.CSS_SELECTOR, "#idframe1")
# 1、切换到A
driver.switch_to.frame(A)
# 2、注册A操作
driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")
# 3、回到默认⽬录 注册时例.html
driver.switch_to.default_content()
# 4、获取注册B iframe元素
B = driver.find_element(By.CSS_SELECTOR, "#idframe2")
# 5、切换到B
driver.switch_to.frame(B)
# 6、注册B操作
driver.find_element(By.CSS_SELECTOR,"#userB").send_keys("admin")

多窗口切换:

selenium默认启动时,所有的焦点在启动窗⼝,那么意味着⽆法操作其他窗⼝的标签。
步骤:
1、获取窗⼝句柄 driver.window_handles
2、使⽤句柄切换窗⼝ driver.switch_to.widnow(handle)
句柄:窗⼝的唯⼀标识符。
"""
 需求:
 1、打开注册示例⻚⾯
 2、点击注册A⽹⻚链接
 3、填写注册A⽹⻚内容
"""
print("操作之前所有窗⼝的句柄:", driver.window_handles)
driver.find_element(By.LINK_TEXT, "注册A⽹⻚").click()
handles = driver.window_handles
print("操作之后所有窗⼝的句柄:", handles)
# 重点:切换窗⼝
driver.switch_to.window(handles[1])
# 填写注册A⽹⻚ ⽤户名
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin")

多窗口之间切换工具封装:

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

driver= webdriver.Edge()
driver.implicitly_wait(10)

driver.get("file:///E:/%E6%B5%8B%E8%AF%95%E8%B5%84%E6%96%99%E3%80%90%E5%AF%86%E7%A0%81%E6%98%AF%EF%BC%9A666java.com%E3%80%91/%E6%B5%8B%E8%AF%95%E8%B5%84%E6%96%99/09UI/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/Register.html")


def switch_window(title):
    # 1、获取所有窗⼝句柄
    handles=driver.window_handles

    # 2、遍历句柄进⾏切换
    for handle in handles:
        driver.switch_to.window(handle)

        if driver.title==title:
            return  "已找到{}窗⼝,".format(title)

title_A="注册A"
title_B="注册B"

driver.find_element(By.LINK_TEXT,"注册A网页").click()
driver.find_element(By.LINK_TEXT,"注册B网页").click()

switch_window(title_A)
driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")

switch_window(title_B)
driver.find_element(By.CSS_SELECTOR,"#userB").send_keys("admin")

sleep(13)
driver.quit()

如果定位不到元素的时候,咋办,可以分析什么原因造成的?

        检查元素定位代码是否正确,是否匹配到唯一元素,是否有做元素等待,是否需要鼠标悬浮,元素是否在新窗口,是否存在于iframe标签中

截图:

当前ui⻚⾯,截图保存;出错后,⽅便查看直观错误原因;

driver.get_screenshot_as_file("xxx.png")

driver.get_screenshot_as_file("error_{}.png".format(time.strftime("%Y_%m_%d
%H_%M_%S")))
验证码:
  处理方式:
         1、去除验证码
        2、使⽤万能验证码
        3、使⽤图⽚识别技术(识别效率低)
        4、使⽤cookie: 由服务器⽣成,存储在客户端的登录凭证
1、获取cookie # 获取所有driver.get_cookies()
2、添加cookie # driver.add_cookie(data)

driver.get("https:www.baidu.com")
data = {
    "name":"BDUSS",
    "value":"xxxxxxxxx"
}

driver.add_cookie(data)

暂时就到这,后面再补

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

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

相关文章

鸿蒙开发 三十七 ArkTs类 class 构造函数

语法格式如下: class 类名{ 字段1:类型 字段2:类型 constructor(参数...) { this.字段 参数 } } 实例化: const 实例1 new 类名(参数...)每new一次就去执行一次constructor方法,创建不同的实例。 每次new都要传参数&…

MySQL学习笔记(持续更新,目前到十一章锁)

1、Mysql概述 1.1 数据库相关概念 三个概念:数据库、数据库管理系统、SQL 名称全称简称数据库存储数据的仓库,数据是有组织的进行存储DataBase(DB)数据库管理系统操纵和管理数据库的大型软件DataBase Mangement System&#xf…

C++ -string -常见用法1

博客主页:【夜泉_ly】 本文专栏:【C】 欢迎点赞👍收藏⭐关注❤️ 文章目录 💡前言1.构造函数1.1函数原型1.2用法速览1.3详解() -重点⭐( s) -重点⭐( n, c) -重点⭐( str) -重点⭐( str, pos, len)( s, n) 2.容量函数2.1函数原型2…

github 上将 stable 合并到 master 分支步骤

本地仓库分支:origin 远端仓库分支:upstream 切到非 master 分支上,比如 dev # 本地操作 git branch -D master git fetch upstream master::master git checkout master # 这步是拉取远端 stable 到 master 上,可能会出错误 # fa…

21次惊艳亮相!凯特王妃的秋季时尚造型!在时尚领域她已经无限接近戴安娜王妃

虽然凯特米德尔顿正式成为英国王室成员才刚刚十多年,但很难想象没有她的王室会是什么样子。毕竟,凭借她非凡的风格和不可否认的魅力,威尔士王妃在2011年迅速赢得了我们以及全世界的喜爱。 我们都喜欢关注她的项目以及她和威廉王子的爱情故事…

基于STM32的智能电能表设计

引言 本项目设计了一个基于STM32的智能电能表,能够实时测量电压、电流、功率以及累计的电能消耗。通过ADC模块采集电压和电流信号,结合功率计算算法,系统可以精准地监控家庭或工业设备的电能消耗。该智能电能表还支持远程数据传输和本地数据…

Krea.ai正式发布AI视频集合站:Luma、Runway与可灵的深度整合

引言 在数字内容日益丰富的今天,视频制作的需求呈现爆发式增长。为了满足创作者对高效、创新视频工具的渴求,Krea.ai推出了全新的AI视频集合站。此平台整合了多款领先工具,如Luma、Runway、可灵和Minimax,为用户提供一站式的视频…

【等号绕过】

简介 一、大小于号绕过 上面的<>是不等于的意思 测试注入点&#xff1a; id1 正常输入id1 测试是否有注入id1 and 11%23 提示hacker~ 被过滤了id1 and 1%23 没有被过滤&#xff0c;说明是被过滤&#xff0c;但是没有输出id1 and 1%23 页面有输…

25四非网安保研回忆录(北航网安/东南网安/重大计科等)

目录 0 个人情况 1 夏令营 西南大学计科 西南交通大学计科 重庆大学计科 2 预推免 东南大学网安 北京航空航天大学网安 3 写在最后 0 个人情况 计算机类比较强的四非&#xff0c;信安专业rank1&#xff0c;六级540&#xff0c;竞赛十几个&#xff0c;无论文&#xff…

【Linux网络编程】网络基础 | Socket 编程基础

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

2.13寸电子墨水屏HINK-E0213+esp8266

记录好数字 2.13寸电子墨水屏HINK-E0213esp8266 声明:大部分资料来源于微雪电子http://微雪电子-官网 https://www.waveshare.net/ 前言 很久以前买的一块电子墨水屏,运气很好,这个型号HINK-E0213资料很全,而且微雪官网也有相关电路资料http://2.13inch e-Paper HAT - Waves…

java邮件发送

文章目录 前言一、开启SMTP邮箱配置二、spring-mail1.引入依赖2.yml配置3.使用二、hutool-mail1.引入hutool2.在resource下新增mail.setting3.使用总结前言 发送邮件: 目前比较简单的有两种方式实现: spring-mailhuool-mail现在看下两种方式 一、开启SMTP邮箱配置 两种方式…

mysql查询2张表连接列名一样的情况

people表&#xff1a; person表&#xff1a; SELECT * FROM person LEFT JOIN people on people.idperson.id 查询的结果id(1)和name(1)说明列名重复 SELECT person.id,person.name,people.id as pid,people.name as pname FROM person LEFT JOIN people on people.idperso…

Linux shellcheck工具

安装工具 通过linux yum源下载&#xff0c;可能因为yum源的问题找不到软件包&#xff0c;或者下载的软件包版本太旧。 ShellCheck的源代码托管在GitHub上(推荐下载方式)&#xff1a; GitHub - koalaman/shellcheck: ShellCheck, a static analysis tool for shell scripts 对下…

10.高级存储过程技巧(10/10)

高级存储过程技巧博客大纲 引言 在现代数据库管理系统中&#xff0c;存储过程作为提升数据操作效率和安全性的关键工具&#xff0c;已被广泛应用于各种数据库操作中。存储过程是一组为了完成特定功能的SQL语句集合&#xff0c;这些语句在数据库中被保存、编译和优化&#xff0…

Chromium 前端window对象c++实现定义

前端中window.document window.alert()等一些列方法和对象在c对应定义如下&#xff1a; 1、window对象接口定义文件window.idl third_party\blink\renderer\core\frame\window.idl // https://html.spec.whatwg.org/C/#the-window-object// FIXME: explain all uses of [Cros…

【原创】java+springboot+mysql在线课程学习网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

陪诊小程序搭建:打造便利的陪诊环境

陪诊行业作为一个新兴行业&#xff0c;随着老龄化的严重&#xff0c;在近几年中需求量日益旺盛。陪诊师为大众的就医提供了极大的便利性&#xff0c;在看病难、医疗资源紧张方面发挥了积极作用。 在陪诊行业的快速发展下&#xff0c;陪诊小程序为行业带来了便捷的模式&#xf…

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器 源链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idchinaFlag 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z2586300277/three-ce…

数学建模算法与应用 第6章 微分方程建模及其求解方法

目录 6.1 微分方程建模概述 6.2 发射卫星与三阶火箭建模 Matlab代码示例&#xff1a;火箭发射模拟 6.3 微分方程数值解法 Matlab代码示例&#xff1a;欧拉法与龙格-库塔法 6.4 放射性废料的处理 Matlab代码示例&#xff1a;放射性衰变 6.5 初值问题的Matlab数值求解 习…