肖 sir_就业课__009ui自动化讲解
ui自动化讲解
1、你做过自动化测试吗?做过 ui自动化测试、接口自动化、app自动化
2、你讲下你做的ui接口自动化?
(1)第一种:按照线性流程讲解 :python+selenium 库做ui自动化
(2)第二种:python+selenim+unittest 框架做的ui自动化
(2)第三种:po框架或则pom模型做ui自动化
3、自动化编写的规则
(1)熟悉场景写详细、不熟悉场景不写
(2)按场景讲解
4、
(1)第一种:按照线性流程讲解 :python+selenium 库做ui自动化
代码:
格式一:
自动化是使用python+selenium做的自动化,
我就以我最近做的xx项目讲下====一个场景(注册,登录,下单)的一个流程:
首先导入selenium 库 , 创建webdriver的对象driver,打开网站driver.get加上网址,让窗口最大化maxzewindow,设置一个时间等待,导入一个时间模块;打开页面f12查找注册按钮定位元素,元素有id,name,class,使用id=什么;
参考:
案例1:结合python+seleuim线性脚本
结合业务写UI自动化
(1)做ui自动化用的python+selenium库。 先导入selemiun中webdriver模块和time库中sleep模块。 我做自动化都是用的chrome浏览器或(ie、火狐等),然后下载对应驱动,创建对象driver=webdriver.chrome()调用驱动,通过对象driver去操作,通过用driver.get方法打开项目首页,在将浏览器最大化maximize_window,最大化是为了防止有些元素加载不完全或者点击不到。然后我会用一个implicitly_wait隐式等待方法,因为网速追不上程序的运行速度。如果是页面不跳转在页面加载元素的话,我会选择再用个sleep方法强制等待2S左右,因为不跳转的时候implictly wait不会生效,如果需要定位这些元素就会定位不到。 进入后先登录,通过link_text定位登录这个链接元素,用click点击,然后定位用户名输入框和密码输入框,用send_keys传入账户名和密码,然后用xpath定位确认登录按钮用click点击,登录就完成了。这个时候回跳转至首页。 项目首页就有投资模块的入口,用find_element_by_link__text找到元素然后用click点击,这个时候页面会跳转,跳转完是进入标的搜索页面,选择标的类型:正常的标投资或者债权转让,标的时间,我们项目是1月,2月,12个月,标的类型是用click就可以点击实现了,时间选择我们是个下拉框,需要先导入select模块,然后先select接这个元素,然后用select by index方法,选择1个对应的值。这里说明下我为什么用index,因为有时候会换中英文,或者value值,会导致脚本失败,而index就可以避免这种情况了。选择完这两个后等待元素的加载,这里也是用sleep,选择某一个标的投资按钮,也是用xpath定位然后click点击,这个时候页面新开一个确认投资窗口,这个时候就涉及到页面的切换,这里涉及到一个利用句柄handle切换窗口,先使用browser.window_handles获取所有句柄,索引位-1就是最新的窗口的,用switch_to_window()接新窗口的句柄就可以切换窗口了。然后用send_keys传入投资金额,支付密码,然后验证码是让开发同事写成了固定的字符,短信验证码关闭了。然后点击确认投资换这个button,也是用xptah定位,click点击。这个时候页面会跳转显示投资成功,这里我会用投资完成这个文本来做断言,用的是if not 加上assert false做的。然后就关闭浏览器用quit。然后前台的操作就完成了,再进入数据库校验数据,这里需要导入pymysql模块,然后用connect连接项目的数据库,用cursor获取游标,(游标就是一个数据的缓存区,用execute方法就可以吧sql语句取出来的临时表放入游标中,fetchall就可以把游标内的数据都是放在toupl容器中,通过索引位就可以把真实数据取出来做断言了)用execute接sql语句来获取对应的投资者在此项目的投资金额,在用fetchall取出此数据,断言这个数据是否等于我们在前台输入的投资金额。然后就断开数据库链接,关闭浏览器。这就是我的大概流程了。
梳理流程:
导入selenium选择浏览器创建对象通过对象get打开浏览器窗口最大化====时间等待(三种)====业务场景(id、name、class、css、xpath、link_txt、js方法)===比如一些控件(farm框、弹框、按钮、切换句柄、点击、输入)==断言(通过title、text)连接数据库区校验正确性
方式二:
自动化是使用python+selenium做的自动化,
我就以我最近做的xx项目讲下一个场景(注册,登录,下单)的一个流程:
首先导入selenium 库 , 创建webdriver的对象driver,打开网站driver.get加上网址,让窗口最大化maxzewindow,设置一个时间等待,导入一个时间模块;打开页面f12,通多查找定位元素有id,name,class,css、xpath,js,link_txex ,tag_name 去定位,以及一些操
做send_key输入,click点击, 下拉框select ,单选框、多选框、按钮等;
(2)概括性说ui自动化
用的是python+selenium来做的,那我大概和您讲一下我做ui自动化的流程吧
答:首先的话就是我需要打开pycharm然后新建一个py模块,然后导入selenium模块,time模块等等,然后通过from selenium import webdriver语句导入webdriver模块,然后创建一个driver对象:driver=webdriver.Chrome(),再通过driver.get方法来打开我们测试环境的地址,再使用 driver.maximize_window()最大化浏览器窗口,然后会使用driver.implicitly_wait()设置一个隐式等待,我可以通过driver.find_element_by_id,或者xpath,name,class,css等元素定位方法来进行定位到用户名和密码输入框,并且通过调用send_keys进行输入用户名和密码,最后通过调用click方法进行登录,登录之后,有一些表单的填写页面(比如主要有姓名、证件信息、手机号码、常住地址、邮箱、紧急联系人等等),如果是输入框我依旧用send_keys,如果有一些下拉框我会导入Select类,通过select_by_value方法进行定位,如果有滑动的地方我也会用window.scrollTo()方法,设置变量为js,然后通过driver.execute_script()来调用js变量来达到滑动滚动条的目的,包括如果是有iframe弹框的话,我首先会通过switch_to.frame()进入到iframe弹框,然后再进行其他的操作,如果要退出iframe框的话,直接用switch_to.default_content()方法就可以了,最后写完整个一个流程之后,我还会通过调用text方法拿到某个元素的文本值赋值给到一个变量,然后通过assert方法把预期结果和实际结果进行一个断言,以上就是我做ui自动化的一个大致流程,但是这是我们最开始做ui自动化的方法,后面因为做的时间也比较久,用例也比较多,所以后续用了一些PO设计模式和分层对用例进行了一些封装
(3)代码
复制代码
from selenium import webdriver
from time import sleep
d=webdriver.Chrome()#通过对象谷歌浏览区且输入网址,在用get方法打开浏览区
url=“http://www.baidu.com/”
d.get(url)
sleep(2)
d.maximize_window()
sleep(3)
d.find_element_by_id(“kw”).send_keys(“dcs”)
复制代码
(3)第二种:python+selenim+unittest 框架做的ui自动化
unittest 框架作用:管理和执行自动化用例,方便后续维护测试用例
代码:
import unittest
from ui_zidonghua.selenium2 import *
from ui_zidonghua.HTMLTestRunner3_New import HTMLTestRunner
import time
class Dcs(unittest.TestCase):@classmethoddef setUpClass(cls):#类的开始print('类的开始')@classmethoddef tearDownClass(cls):print("类结束")def setUp(self):print('方法开始')def tearDown(self):print("方法结束")def test2(self):print('22222')def test1(self):print('11111')def testA(self):print('AAAAA')def testa(self):print('aaaaa')def no(self):print('no')
if __name__ == '__main__':# unittest.main()# 第一种:运行所有的用例# tj=unittest.TestSuite()# # tj.addTest(Dcs('test1'))# tj.addTests([Dcs('test1'),Dcs('test2')])# r=unittest.TextTestRunner()# r.run(tj) @运行部分用例# xpath=r'C:\Users\Administrator\PycharmProjects\untitled6\ui_zidonghua'
# # ss=unittest.defaultTestLoader.discover(start_dir=xpath,pattern="ui*.py")
# # r=unittest.TextTestRunner()
# # r.run(ss)#运行一份路径下的用例xpath=r'C:\Users\Administrator\PycharmProjects\untitled6\ui_zidonghua'ss=unittest.defaultTestLoader.discover(start_dir=xpath,pattern="ui*.py")new=time.strftime("%Y-%m-%d %H-%M-%S")filename=xpath+"/"+str(new)+"_ui.html"f=open(filename,"bw")r=HTMLTestRunner(stream=f,title="ui自动化报告",description="用例执行情况",tester="dcs")r.run(ss)
讲解
案例2:结合unittest框架讲解
(1)我做ui自动化是通过Python+selenium+Unittest进行自动化测试,整个用例框它能帮我们比较规范的、系统的管理和执行用例,也便于后续的维护。下面我讲解下这个框架,首先需要导入unittest这个模块,我们做自动化的话还需要导入selenium这个模块,以及一些相关的模块,比方说time模块,OS模块,HTMLTestRunner报告模块。把我们需要的模块都导入,在unittest里我们需要去定义一个类,定义类名可以根据项目名定义,继承unittset.testcase,一个testcase的实例就是一个用例,类里需要有类的开始:setupclass,以及类的结束:teardownclass,在整个框架中只运行一次,然后在定义方法开始setup、方法结束teardown ,在用例每次执行中都会运行一次;然后我们需要去定义我们的用例,test1,test2,注意一定要以test开头,顺序按照ascii码1-9,大写A-Z,小写a-z,写完用例以后,我们需要去调用它,我们以main作为unittest的入口,执行自动化用例我们主要有4种调用的方式
第一种用unittest.main()去运行所有用例
第二种是创建一个套件TestSuite(),然后用addtest去添加你要执行的用例,这种方法可以执行部分测试用例,
第三种就是搜索绝对路径去执行自动化,调用unittest.testloader().discover()去搜索路径下的用例,在通过unittest.TextTestRunner() .run()方法执行搜索到用例
第四种是生成测试报告,搜索绝对路径去执行自动化,调用unittest.testloader.discover方法执行用例,然后把执行结果写入我们导入的报告模板文件,执行之后就能看到我们路径下所有用例的执行结果。
以上就是unittest框架的整个基本流程
(2)案例2:
我说下电商下单自动化测试流程吧,因为是基于unittest框架进行编写所以需要用import unittest导入unittest模块还需要导入webdriver模块因为需要用webdriver方法去调用谷歌浏览器的驱动来打开浏览器,然后先定义一个类在参数中输入unittest.testcase用来继承unittest.testcase中的类,然后定义setup方法在setup中先将webdriver.Chrome赋值给self.变量chrome是我用的谷歌浏览器的驱动,并用login.dl(self.变量)来调用之前封装好的登录功能,然后再定义一个test打头的函数这里主要用于编写实际测试用例,然后在test函数中将slef.变量再次进行赋值给一个变量方便于操作。接下来进行定位搜索栏,输入商品名称,点击搜索按钮,用F12获取xpath值然后用find_element_By_xpath对搜索栏进行定位并赋值给一个变量这里这里说下为啥用xpath进行定位,因为有时候id 和name 等属性值不是唯一的或者没有,所以直接使用xpath进行定位会比较好能解决百分90的定位问题,然后使用send_keys()去进行输入操作和click()进行点击按钮操作,此时页面中会搜索出我搜索的商品,仍然通过xpath定位和click()操作搜索出的商品页面会新开窗口进入商品详情页,这时候就需要用window handles获取所有窗口的句柄并赋值给一个变量,然后使用switch to window加变量索引值切换到新窗口,有时候网页会加载比较慢所以需要使用from time import sleep导入时间模块然后使用sleep等待3秒,确保网页加载完成后进行下一步操作,然后在用find_element by xpath.click选择商品的规格型号和商品数量,接下来通过find_element_by_xpath.text获取商品详情页中我选择的规格型号、商品数量、商品单价、订单小计/合计,通过find_element_by_xpath.click点击立即购买按钮,页面进入到确认订单页,然后通过find_element_by_xpath.text获取确认订单页规格型号、商品数量、商品单价、订单小计/合计与商品详情页选择的数据使用if判断进行比较,如果一致就print 成功,否则else pirnt失败,确保订单中的数据是我在商品详情页中选择的数据,再接下来点击提交订单操作进行下单,下单后通过调用封装好的数据库读取模块传参(ip/dbuser/dbpwd/dbname/sql)进行访问数据库中order库获取我的订单数据,然后用order库中获取的数据与下单的数据进行if判断比较判断数据库中的订单数据是否正确,如果正确就print 成功,否则else pirnt失败,然后就是定义teardown方法在teardown中用close命令关闭浏览器,然后就是进行调用执行,执行方法有三种第一种unittest.main(),main的话就是执行了testloader类中的方法帮我们搜索test开头的用例并执行,执行顺序是按ascll码分布顺序运行的,第二种方法是用unittest.testsuit()方法,先将unittest.testsuit赋值给一个变量,然后通过这个变量使用addtest命令添加用例,在使用unittest.testrunner中的run方法执行这个变量。执行顺序的化是按照添加的顺序执行的。第三种方法是用unittest.default testloader.discover(加用例存放的路径,pattern等于模块名)再赋值给一个变量,然后同样通过unittest.testrunner中的run方法执行这个变量,然后为了查看执行详情结果所以需要写入执行报告。写入执行报告的话需要先导入一个HTMLtestrunnerCN 模块使用这个模块中 的htmltestrunner来写入执行报告并存放到指定的路径中
代码:
import unittest
class Test(unittest.TestCase):
@classmethod #类方法
def setUpClass(cls) -> None:
print(“类的开始”)
@classmethod
def tearDownClass(cls) -> None:
print(“类的结束”)
def setUp(self) -> None:
print(“方法开始”)
def tearDown(self) -> None:
print(“方法结束”)
def test001(self): #测试用例1
print(1111)
def test002(self): #测试用例2
print(2222)
def testb(self): #测试用例3
print(‘bbbb’)
def testa(self): # 测试用例4
print(‘aaaa’)
def hz(self): # 测试用例5
print(‘hz’)
if name == ‘main’:
unittest.main() #unittest 单元测试调用所有
import unittest
from selenium import webdriver
from time import *
from ui_zidonghua.HTMLTestRunner3_New import HTMLTestRunner #导入报告模板
class Test_Baidu(unittest.TestCase):
def setUp(self) -> None: #方法开始
self.driver=webdriver.Chrome()
self.driver.get(“https://www.baidu.com/”)
self.driver.implicitly_wait(3)
def tearDown(self) -> None:
sleep(3)
self.driver.close()
def test001(self):
self.driver.find_element_by_id(“kw”).send_keys(“selenium”)
self.driver.find_element_by_id(“su”).click()
def test002(self):
self.driver.find_element_by_id(“kw”).send_keys(“python”)
sleep(2)
self.driver.find_element_by_id(“su”).click()
def test003(self):
self.driver.find_element_by_id(“kw”).send_keys(“html”)
sleep(2)
self.driver.find_element_by_id(“su”).click()
title=self.driver.title
self.assertEqual(title,“zhong”)
def hz(self):
self.driver.find_element_by_id(“kw”).send_keys(“hzdcs”)
sleep(2)
self.driver.find_element_by_id(“su”).click()
#def test_all_case(): #定义一个函数
suit=unittest.TestSuite() #创建一个套件或者是一个容器,作用用来装所有的测试的的对象
suit.addTest(Test_Baidu(‘test002’)) #addtest添加用例
#suit.addTests([Test_Baidu(‘test001’),Test_Baidu(‘test002’),Test_Baidu(‘test002’)],)
return suit
if name == ‘main’:
unittest.main() #第一种执行框架中全部用例
# runner=unittest.TextTestRunner()
# runner.run(test_all_case()) #第二种执行部分用例
#执行脚本的相对路径
# path=r"C:\Users\Administrator\PycharmProjects\untitled6\ui_zidonghua"
ss=unittest.defaultTestLoader.discover(start_dir=path,pattern=“test*.py”)
runner=unittest.TextTestRunner()
runner.run(ss) # 第三种方法 自动化搜索用例执行
# path=r"C:\Users\Administrator\PycharmProjects\untitled6\ui_zidonghua"
# ss=unittest.defaultTestLoader.discover(start_dir=path,pattern=“test*.py”)
# bgpath=path=r"C:\Users\Administrator\PycharmProjects\untitled6\ui_zidonghua"
# now=strftime(“%Y-%m-%d-%H-%M-%S”)
# filename=bgpath+“\”+str(now)+“_ui.html”
# f=open(filename,“bw”) #b 表示二进制的方法写入,w是写入
# runner=HTMLTestRunner(stream=f,title=“ui自动化测试报告”,description=“用例执行情况”,
# tester=“hz” )
# runner.run(ss) # 第三种方法 自动化搜索用例执行
TestCase:
一个Testcase的实例就是一个测试用例,测试用例就是一个完整的测试流程,包括初始化setUp、运行run、测试后的还原tearDown(字面意思,测试用例。为一个或多个方法提供测试方法。一般是一个test)
TestSuite:
对一个功能的测试往往需要多测试用例的,可以把多的测试用例集合在一起执行,这就是TestSuite的概念。常用addTest()方法将一个测试用例添加到测试套件中(测试集合,即一组测试。一个test suite是把多个相关测试归入一组的快捷方式)
TextTestRunner:
是用来执行测试用例的,其中的run(test)用来执行TestSuite/TestCase。测试的结果会保存在TextTestResult实例中(测试运行器。执行test suite的程序)
TestLoader:是用来搜索所有以test开头的测试用例,然后将其加入到testsuite中
======================================================================================
(2)第三种:po框架或则pom模型做ui自动化
po框架
(1)参考:https://www.cnblogs.com/xiaolehua/p/14434567.html
讲解:
案例1:
ui自动化测试,我是用po框架做的,对自动化用例进行分层:先创建一个项目名称xx;在项目下创建对应的包,一般我是分为6个包
(1)先创建第一个cofing包==存放所有配置文件信息(比如项目路径和数据,用例的路径)
(2)在创建第二个Data包==放数据(测试数据)
(3)在创建第三个report包==存放测试报告
(4)在创建第四个包public公共公开包(存放一些功能用例);在这个包下面在创建两个子包:
pages包和utils包
a、在pages包中存放元素层流程层(封装所有页面的公共方法,基类)
b、在utils包(处理公共类公共函数都存放在此)
可以在utils中来读取pages中封装的登录的流程(封装读取ini文件或者EXCEL表格的工具类和工具函数
(5)在创建一个TestCase用例包用来存放用例
(6)在创建一个run_all用来运行
通过运行测试用例中封装好的用例在运行然后在repot中生成测试报告
这就是我的框架;
案例2:我讲解下我的框架,po框架,可以分成6层:如下
第1层的话是config配置层,这个里面主要是封装了一些我们测试环境的url地址和一些连接数据库的IP地址,用户名密码等等
第2层是utils工具类层,这个里面主要封装了一些读取Excel表格的工具类,还有发邮件的工具类,还有一些读取配置文件的工具类
第3层是一个public基类,这个里面主要封装了元素定位的方法比如把id,name,class,xpath,css等等都封装在一个类方法里面了,还把一些send_keys和隐式等待和其他其他公共方法都进行了二次的封装
第4层就是testcase用例层了,这个里面主要就是通过定义一个类然后继承unittest.TestCase这个类,通过unittest单元测试框架来管理用例,在setupclass里面去创建driver对象,然后通过设置和取值的方法,拿到driver对象,先编写登录的用例,然后这个里面也用到了PO设计模式,把我们的元素定位和流程层,代码层进行了分离,最后用例写完再通过self.assertEquals进行一个断言
第5层就是run运行层,首先会通过把所有的用例加载到一个suite套件里面,然后再通过调用run方法运行这个套件
第6层就是通过HTMLtestrunner模块生成测试报告,然后最后通过Jenkins做可持续集成,在回归测试阶段,每天晚上都会运行一下我们的ui自动化用例,大致的一个框架结构就是这样的。
案例3:
写自动化用例的时候我喜欢对用例进行分层处理。我一般会设置六个模块:公共模块、用例模块、执行模块、报告模块、数据模块、页面元素模块。
把一些公共的,经常调用的属性放到公共模块中,比如登录登退出啊,连接断开数据库等。
页面元素模块就是将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),这样的话当页面元素变动的话我们只需要更改页面元素对象即可。
把用例的具体内容放到用例模块中,比如我要借款,通过设置一些类,再把我要借款相应的用例放到这下面,这样后续我进行维护就非常的直观方便。
执行模块就是对上面各个类的执行方法,要执行哪些类里的哪些用例和对应测试报告的生成。
报告模块就是存放生成测试报告的地方,这样我们就能一目了然的看到是哪些模块下的用例的执行情况。
数据模块的是就是存放一些数据的地方,比方说用户的账户密码,网址信息等。
就拿我要出借这个流程的举个例子讲解一下吧!首先导入相应的库 from selenium import webdriver ,import unittest。然后新建一个继承unittest.testcase类。然后在def setup里写一些前置条件:像是webdrvier.chrome()选择谷歌浏览器,用get方式?获取网址打开,用maximize.window进行浏览器最大化处理,避免出现页面中元素定位后无?法点击报错的现象,确保用例执行的准确性,因为有时候用例执行太快,而网页加载太慢会?导致报错,所以我一般都会用implicity_wait进行智能等待,确保页面加载完成。把登入写进了公共模块中直接调用他。
接下来定位我要出借,因为他是一个下拉列表,所以我们得先导入from selenium.webdriver.support.ui import Select模块,用 Select(dr.find_element_by_xpath(“ ”).select_by_index(1),通过索引位进行定位。这个时候会打开一个新页面,所以我们得定位到这个新页面。
首先我们先获取所以页面的句柄allhead=dr.window_handles,再用dr.switch_to_window(allhead[-1])定位到我要出借这个新页面,通过find_element_by_xpath定位对应的标,然后定位到投资金额框,至于输入金额的话为了提高效率,我是之前已经写好了随机生成整百金额的函数,所以我这边直接调用就可以了,至于验证码我之前就已经请开发帮我去掉了,然后定位确认投资按钮点击。接下来系统会弹出一个风险提示
揭示书,它是一个alter弹框,alter=driver.switch_to_alter()进入到alter弹框里,再用alter.accept()。
这时候为了保证用例执行的准确性,再用unittest框架中的断言,之后用if语句和assertEquals判断前后两个值是否相符如:(出借成功,出借失败),不相符的话用dr.get_screenshot_as_file(“d:\yy\erorr1.png”),最后到执行和生成报告了,用unittest中的testloader方法。
定义一个变量接收测试用例的目录,discover=unittest.defaultTestLoader.discover(测试用例的目录,“text*.py”)加载该目录下所有以text开头。
的Py文件。
导入生成报告所需的HTMLTestRunnerCN模块,用with open打开对应的报告文件,“wb”二进制方式写入,用HTMLTestRunnerCN里的runner方法生成测试报告。最后用runnrt.run(discover)方法执行之前加 载的用例就好了。
这就是之前公司用python加selenium做自动化测试的一个基本流程。
========================================================
一、自动化中遇到哪些问题?====>肖sir_自动化遇到问题归纳
(1)定位问题:
验证码、日历控件、弹框、定位属性的空格、内嵌滚动条、切换窗口、等
如:
(1)动态元素定位不到
解决方法:尽量使用固定元素定位,如没有固定元素,则采用绝对路径进行定位,因为元素路径是唯一且不变的
(2)自动化脚本执行速度较慢
尽量使用css方法定位元素,使用等待时,少用sleep方法,尽量不用隐式等待,涉及到一些if elif条件判断时,尽量把可能发生的条件放在前面写,这样可以减少程序判断的次数,提高效率
二、自动化面试题
1、你有做过自动化?你用什么语言? python
2、自动化中如何使用语言打开一个网址?浏览器,浏览器对应驱动,导入库,类,get,url
3、在一个浏览器中打开多个窗口?open_windows driver.execute_script
4、在自动化中如何释放资源? 当一个注意点,经验(不去quit,close)
5、如何切换窗口? switch_to_window(handle)
6、如何获取当前句柄?如何获取所有句柄?
7、如何获取当标题?如何获取所有标题?
8、如何在自动化输入文本?
9、如何点击按钮?
10、清除当前的内容的语句?
11、为什么使用时间等待?(使用时间的优点)
12、如何窗口最大化?
13、复现框如何多选或者全选?
14、单选框如何选择?
15、说一下自动化常用的定位方法? (9种)
16、下拉框如何定位?导入Select 类
17、iframe框如何定位?进入ifrme框的语句?ifrme退出框的语句?
18、弹框的定位?(确认型弹框,输入型弹框,alert弹框,)
19、自动化中本地文件上传?
20、如何定位滚动条?
相关文章:
肖 sir_就业课__009ui自动化讲解
ui自动化讲解 1、你做过自动化测试吗?做过 ui自动化测试、接口自动化、app自动化 2、你讲下你做的ui接口自动化? (1)第一种:按照线性流程讲解 :pythonselenium 库做ui自动化 (2)第二…...
「线性DP」花店橱窗
花店橱窗 https://ac.nowcoder.com/acm/contest/24213/1005 题目描述 小q和他的老婆小z最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里。 但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同…...
数组的去重方法
1、ES6的Set方法去重 new Set是ES6新推出的一种类型。它和数组的区别在于,Set类型中的数据不可以有重复的值。当然,数组的一些方法Set也无法调用。 使用方法:将一个数组转化为Set数据,再转化回来,就完成了去重。 cons…...

ESP32-LORA通信
文章目录好久没更新博客了,今天清明节,写个LORA通信。在此记念在天堂的外婆。祝她安好LORA通信简介一、模块二、使用步骤1.电脑通过USB串口模块联接LORA模块2.ESP32连接LORA通信进行收发通信3.电脑运行调试助手,ESP32运行代码。实现LORA通信测…...

博客首页效果
学习来自风宇blog的博客首页效果 全部用的基本上都是原生的html,css,js特别是flex布局的使用,主轴方向可以是横轴,也可以是纵轴,弹性项还可可以使用百分比sticky粘性布局,作为侧边栏,它不会超出…...

【LeetCode】剑指 Offer(29)
目录 题目:剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 57. 和为s的两个数…...

自然语言处理(八):Lexical Semantics
目录 1. Sentiment Analysis 2. Lexical Database 2.1 What is Lexical Database 2.2 Definitions 2.3 Meaning Through Dictionary 2.4 WordNet 2.5 Synsets 2.6 Hypernymy Chain 3. Word Similarity 3.1 Word Similarity with Paths 3.2 超越路径长度 3.3 Abstra…...

推荐一款 AI 脑图软件,助你神速提高知识体系搭建
觅得一款神器,接近我理想中,搭建知识体系的方法,先来看视频作为数据库开发或管理者,知识体系搭建尤为重要。来看看近些年缺乏足够数据库知识面造成的危害:a/ 数据安全风险:例如,2017年Equifax数…...
掌握这些“学习方法和工具”,让你事半功倍!
在中国这个高竞争的社会环境下,学习成为了每个人都需要掌握的技能。然而,学习并不仅仅是读书和听课,更是需要一系列高效的方法和习惯来提高效率。本文将介绍一些实用的学习经验和方法,以及推荐一些国内好的学习工具和平台…...

MyBatis 源码解析 面试题总结
MyBatis源码学习环境下载 文章目录1、工作原理1.1 初始化1.1.1 系统启动的时候,加载解析全局配置文件和相应的映射文件1.1.2 建造者模式帮助我们解决复杂对象的创建:1.2 处理SQL请求的流程1.2.1 通过sqlSession中提供的API方法来操作数据库1.2.2 获取接口…...

「业务架构」需求工程—需求规范(第3部分)
将用户和系统需求记录到文档中。需求规范它是将用户和系统需求写入文档的过程。需求应该是清晰的、容易理解的、完整的和一致的。在实践中,这是很难实现的,因为涉众以不同的方式解释需求,并且在需求中经常存在固有的冲突和不一致。正如我们之…...

chapter-1数据管理技术的发展
以下课程来源于MOOC学习—原课程请见:数据库原理与应用 数据管理技术的发展 发展三阶段 人工管理【1950前】 采用批处理;主要用于科学计算;外部设备只有磁带,卡片,纸带等 特点:1.数据面向应用2.数据不保…...

23.Spring练习(spring、springMVC)
目录 一、Spring练习环境搭建。 (1)设置服务器启动的展示页面。 (2)创建工程步骤。 (3)applicationContext.xml配置文件。 (4)spring-mvc.xml配置文件。 (5&#x…...

【数据库原理 • 七】数据库并发控制
前言 数据库技术是计算机科学技术中发展最快,应用最广的技术之一,它是专门研究如何科学的组织和存储数据,如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进,最常用的技术。 当前…...
内部人员或给企业造成毁灭性损失
全球每年有近百万企业因数据丢失而倒闭。而媒体几乎每个月都会报道数百起恶意和无意的内部威胁事件,导致的企业机构名誉损失、巨额赔款甚至于面临运营危机。 内部威胁主要有三个来源: 1、疏忽或无意的员工; 2、有意识或恶意的内部人员&…...

【技巧】Word“只读方式”的设置与取消
如果你担心在阅读Word文档的时候,不小心修改并保存了内容,那就给文档设置“只读方式”吧,这样就算不小心做了修改也不能随意保存。 Word文档的“只读方式”有两种模式,对此不清楚的小伙伴,来看看如何设置和取消吧。 模…...

【软考备战·希赛网每日一练】2023年4月12日
文章目录一、今日成绩二、错题总结第一题三、知识查缺题目及解析来源:2023年04月12日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析: 依据题目画出PERT图如下: 关键路径长度(从起点到终点的路径中最长的一条&#x…...
算法记录 | Day28 回溯算法
93.复原IP地址 思路: 1.确定回溯函数参数:定义全局遍历存放res集合和单个path,还需要 s字符 startindex(int)为下一层for循环搜索的起始位置。 2.终止条件:当len(path)4且遍历到字符串最末尾ÿ…...
气象历史数据和空气质量历史数据资源汇总免费
气象数据和空气质量数据资源汇总 1.全球气象数据资源 WorldClim 网址:Global climate and weather data — WorldClim 1 documentation WorldClim是一个全球高分辨率气候数据分享平台。截止2021年03月,其包括以下数据: •Climate数据&am…...

【区块链】走进web3的世界-对于前端来说,web2与web3的区别
web3离不开几个概念,智能合约、区块链、前端交互 1、智能合约可以直接与区块链中的区块进行交互; 2、前端通过web3.js/ethers.js等npm库可以和智能合约进行交互; 说的直白点,web3与web2对于前端来说,只是对接的对象发生…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...