一步到位带你入门Selenium
其实,关于这篇文章发布前还是有很多思考的,我是不想发布的,因为关于selenium的文章博客园里面有很多的介绍,写的详细的,也有写的不详细的,那么我的这篇文章的定位是基于selnium从开始到最后的框架组织。其实套路和很多的教程类似,但是更多的是本篇文章是以笔记的形式展示给大家,可能对于一些初学者来说,并不是一篇很好的文章,但是对于一些有经验的测试童鞋来说,本篇确是值得你回忆selenium过往的一篇文章。
一、Selenium自动化测试环境搭建
1.cmd --- pip install selenium==2.53.0 (如果selenium后面不跟==,表示默认安装最新版本)
2. pip show selenium 查看selenium安装的版本号(该操作在cmd->windows下面查看)
(注意:1.pip 是什么? pip是python2.7.9版本以后自动集成到python中的一个包管理工具,方便下载和python
有关的包或者模块)
3.验证环境是否安装成功python交互模式下--->输入from selenium import webdriver -->运行无报错(安装成功)
4.配置浏览器驱动,这里我们教学使用的chrome浏览器,目前最新的版本是63.0.3239.84(正式版本)
5.下载谷歌浏览器的驱动文件 chromedriver.exe
谷歌浏览器驱动下载地址:
http://chromedriver.storage.googleapis.com/index.html
谷歌浏览器驱动及版本对应匹配参考表:
http://chromedriver.storage.googleapis.com/index.html
6.直接将chromedriver.exe (chromedriver.exe原封不动复制到C:\Python27目录下面)
7.在idle编辑器里面敲一段代码:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
二、PyCharm开发集成环境部署及快捷键
1.科学上网:访问 https://www.jetbrains.com/pycharm/download/#section=windows
2.选择community(社区版) 版本 足够用
快捷键:
1.注释 ctrl + /
2.取消注释 在次ctrl + /
3.运行 右键点击Run按钮 或者使用快捷键 ctrl + shift + F10
4.创建python文件
1.点击编辑器主项目工程文件目录->file->python file
2.在windows下面的主项目工程文件目录里面->创建一个pyhton文件 如demo.txt ---->demo.py
5.替换 ctrl+r 替换单个或者替换多个 replace replace all
6.回退 shift+table
7.缩进 table
8.#coding=utf-8 (中文编码的声明 允许在编辑中写入中文注释 否则报错)
三、前端工具的安装
目的:方便web页面的元素定位。
只有火狐浏览器提供。高版本的火狐浏览器没有,只有低版本的有这个插件。
FireBug:附加组件--扩展--搜索firebug--点击安装--重启---F12查看 小虫子
FirePath:附加组件--扩展--搜索firepath--点击安装--重启---F12查看 小虫子上面有没有firepath
四、前端技术讲解
前端三剑客:
HTML
CSS
Javascript HTML静态网页 == 文档
标签有开口有闭合(并不是所有标签都有闭合标签 如 img input标签):
开始标签: <a>
结束标签: </a>
标签都是有层级关系的:爷爷类标签-->父类标签-->子类标签
自动化测试要定位元素---->要认识HTML页面---->要了解HTML页面的层级关系--->学会用程序的视角去找到他们
HTML中的常用标签说明:
<html> 声明 这是一个HTML文档
<head> HTML标签的头部
<body> 身体包含了N多组标签对
<a> 超链接 如果a标签后面跟着 href="任何链接" 说明<a>一定是链接
<p> 段落
<img> 图像
<input> 输入 文本框
<form> 表单(结构 包含input 包含一个button)
<title> 窗口的标题
<iframe> 框架 HTML中的框架
<div> 无名式 代表的是块级元素 div是一个容器 可以包含任意标签
<span> 无名式 代表的是块级元素 span是一个文本容器 可以包含任意标签
什么是元素?
HTML中的开始标签和结束标签之间的所有代码都是元素,元素有属性和属性值。
demo:
<input id="kw" name="wd" class="s_ipt" value="" maxlength="" autocomplete="off">
如上所述 id 是该元素中的一个属性 它的属性值是 kw 依此类推
检查属性值的唯一性: f12 -->ctrl + f -->拷贝属性对应的属性值--复制到HTML中的文本框-->enter键查看该属性值是否在整个页面中是否唯一,如果唯一就可以使用该元素去定位。
五、Webdriver API 学习
什么是webdriver API?
他是一套操作浏览器的规范。可以理解为一套N多个函数来实现操作浏览器的方法的集合。比如:元素定位/操作浏览器 /最大化窗口/设置等待/多窗口切换/切换框架/操作警告框等
元素的八大定位精讲
id
name
class_name
link_text
partial_link_text
tag_name
xpath
css_selector
以上8种元素定位在Python语言中对应的写法如下:
.find_element_by_id('id的属性值') #必须掌握
.find_element_by_name('name的属性值') #必须掌握
.find_element_by_class_name('class的属性值') #必须掌握
.find_element_by_link_text('文本链接') #必须掌握
.find_element_by_partial_link_text('部分文本链接') #了解
.find_element_by_ tag_name('标签名') #了解
.find_element_by_xpath('很多') #超级重点
.find_element_by_css_selector('很多') #超级重点
.click() 点击事件
.send_keys() 向文本框输入内容
1.使用id定位百度文本框
driver.find_element_by_id('kw').send_keys('demo') 2.使用name定位百度文本框
driver.find_element_by_name('kw').send_keys('demo') 3.使用class定位百度文本框
driver.find_element_by_class_name('s_ipt').send_keys('demo') 4.使用link_text定位百度首页新闻链接
driver.find_element_by_link_text(u'新闻').click() 5.partial_link_text部分文本定位新闻链接
driver.find_element_by_partial_link_text(u'闻').click() 6.使用tag定位百度文本框(不建议使用该方法 因为实际项目中标签名重复的概率非常大 不能代表要定位的元素的唯一性)
driver.find_element_by_tag_name('input').send_keys('demo')
7.定位界的倚天剑 --------xpath 定位
定位的优缺点:
优点: 定位语法丰富 当元素没有属性时可以通过xpah的路径定位
缺点:1.抗变性弱 2.不稳定 3.查找速度慢(相对于CSS定位)
xpath 的层级关系表示方法: / a.绝对路径定位(不稳定,从根一级级往里找)
driver.find_element_by_xpath('html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input').send_keys('demo') b.相对路径定位(层级和属性结合定位,经常用)
driver.find_element_by_xpath("//input[@id='kw']").send_keys('demo') c.父类属性和层级关系定位(很强大,很实用)
driver.find_element_by_xpath("//span[@class='bg s_ipt_wr quickdelete-wrap']/input").send_keys('demo') d.爷爷类属性和层级关系定位(一定能定位)
driver.find_element_by_xpath("//form[@id='form']/span/input").send_keys('demo') e.使用逻辑运算符定位 and
driver.find_element_by_xpath("//input[@name='wd' and @autocomplete='off']").send_keys('demo')
8.定位界的屠龙刀---CSS定位
CSS是层叠样式表,用于美化web页面的一种技术,我们主要使用CSS中的选择器作为我们元素定位的一种策略。
CSS定位优缺点:
优点:1.语法简洁 2.定位速度快 3.抗变性强
缺点:暂时没发现
CSS的层级关系表示方法: > CSS简写说明:
id -----------------> #
class ------------------> . 8.1CSS使用id class定位百度文本框
driver.find_element_by_css_selector("#kw").send_keys('demo')
driver.find_element_by_css_selector(".s_ipt").send_keys('demo') 8.2CSS使用属性定位(很常用)
driver.find_element_by_css_selector("input[id='kw']").send_keys('demo') 8.3CSS的父类属性和层级定位方法(和xpath区分开 用的也比较多)
driver.find_element_by_css_selector("span#s_ipt_wr>input.s_ipt").send_keys('demo') 8.4CSS的爷爷属性和层级定位方式
driver.find_element_by_css_selector("form#form>span>input").send_keys('demo')
登录sina邮箱发邮件实战:
.手动注册一个新浪邮箱http://mail.sina.com.cn/
.模拟用户输入账号和密码
.模拟用户点击登录按钮
.输出 Login is ok---------->
.点击写信----->收件人----->主题----->写入内容(收件人为同桌的邮箱账号)
(定位过程中多使用css定位,少用xpath)
元素定位注意事项:
定位前先思考:
a.有id属性优先使用id定位。没有id的尽量使用css、xpath定位。
b.Xpath/CSS/定位的灵活运用
c.对HMTL各类标签代表的含义补充学习
d.一个定位方式行不通,可以多尝试其他的定位方式(不要一个树上吊死)
e.元素的属性值如果数字、动态变化的,你应该放弃使用该属性
脚本中检查:
.脚本的上下文是否引入sleep 增强脚本稳定性
.元素的属性值是否唯一
.元素的属性值是否真实可见 is_displayed()
.元素是否在iframe框架中?
.元素定位方式需要改变
.元素是否真正定位到是真正的元素
.网络环境是否良好
.Web页面操作前后页面关联是否是否检查过?思考过?
.定位元素的代码是否是正常的 比如代码敲错了 或者是否引入了相关的模块 没加相关的声明 #coding=utf-?
.认真检查控制台的报错信息 代码报错行数
六、Webdriver api 继续
1.控制浏览器
.maximize_window() 最大化浏览器窗口
.set_window_size(a,b) a、b代表的浏览器的长宽
.forword() 前进操作
.back() 后退操作
.refresh() 模拟F5刷新
代码示例:
from time import sleep
from selenium import webdriver driver = webdriver.Chrome() #调用谷歌浏览器驱动
driver.get("https://www.baidu.com") #访问百度站点
sleep(3)
driver.maximize_window() #最大化窗口
sleep(4)
driver.find_element_by_link_text(u'新闻').click()
sleep(3)
driver.back() #返回百度首页
print driver.current_url #获取url
sleep(3)
driver.forward() #前进新闻页面
print driver.current_url #获取url
sleep(5)
driver.refresh() #模拟浏览器刷新
sleep(5)
driver.set_window_size(900,900) #设置浏览器长和宽
sleep(3)
driver.quit() #关闭浏览器
2.webdriver 常用操作方法
.click() 点击事件
.send_keys() 向文本框输入内容
.quit() 关闭所有浏览器窗口
.close() 只关闭当前窗口
.clear() 清空
3.webdriver常用接口方法
.text 获取元素对应文本
.is_displayed() 检查元素是否用户可见 实例:
demo = driver.find_element_by_id('kw').size #文本框的尺寸
print demo
demo = driver.find_element_by_id('cp').text #打印元素对应的文本
print demo
demo = driver.find_element_by_id('kw').is_displayed() #检查元素是否用户可见
print demo 4.获取验证信息
webdriver提供了三种验证信息的方法,也叫断言。根据测试用例中的描述的规程一步一步的执行测试用例,在最后会将测用例的实际结果很预期结果进行比较,这种方式在自动化测试中叫:断言。
.url (由句柄提供)
.text (由元素定位提供)
.title (由句柄提供) #text 获取元素对应的文本进行断言
text = driver.find_element_by_css_selector('span[class="nick"]').text
if text == 'luruifengx@sohu.com':
print 'login is ok--------------->'
else:
print 'login is error---------------->' #title 窗口标题
title = driver.title
if title == u'我的通行证':
print 'login is ok--------------->'
else:
print 'login is error---------------->' #url 通过url做断言
url = driver.current_url
if url == u'https://passport.sohu.com/mypassport/index':
print 'login is ok--------------->'
else:
print 'login is error---------------->'
5.设置元素等待
sleep(S) Python的time模块提供的方法 强制等待
.implicitly_wait(S) 是webdriver提供的隐式等待 (比较温柔,这个用法和网络传输速度有关系,比较智能一些对比强制等待
原理是:在规定时间内比如设置60S,那么假如在运行第10S元素访问到了则会继续往下执行脚本,否则将以轮询的方式不断的去判断元素是否被加载出来)
6.上传文件
webdriver中的send_keys()支持上传文件
该操作只能针对的是标签 input 标签 使用方法:send_keys('上传本地文件的路径')
driver.find_element_by_name("file").send_keys("上传本地文件所在路径")
7.JS操作浏览器滚动条
调用js代码实现
excute_script("window.scrollTo(0,2500);") 从最顶端拉到最下面(实际项目中最常用)2500为一般参考值,具体要看需求,有的可能1000就到滚动条的底部
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("python")
driver.set_window_size(800,600)
driver.find_element_by_id("su").click()
time.sleep(5)
driver.execute_script("window.scrollTo(0,2500);") #上---->下
time.sleep(5)
driver.execute_script("window.scrollTo(2500,0);") #下---->上
driver.execute_script("window.scrollTo(900,900);") #从上网下 从左往右 同时拖动
8.多窗口切换
句柄.switch_to.window(句柄.window_handles[1]) #跳转到第二个窗口
switch_to.window 切换窗口
window_handles[1] [1] 代表的是切换到第二个窗口
window_handles[2] [2] 代表的是切换到第三个窗口
9.下拉框处理
有三种定位策略
1. 引入一个Select类 (下拉框的实现必须是select标签才可以使用1方法)
from selenium.webdriver.support.select import Select 引入select类
Select(demo).select_by_index(2) #通过索引
Select(demo).select_by_value('') #通过value值
Select(demo).select_by_visible_text(u'审核不通过') #通过文本描述
time.sleep(5) 2.链式定位
第一步:先定位下拉框大标签,将定位的结果赋值给一个变量demo
第二步:拿着第一步中赋值好的demo,直接操作下拉框里面的选项
demo = driver.find_element_by_name('status')
demo.find_element_by_css_selector("option[value='1']").click() 3.一步到位法
driver.find_element_by_name('status').find_element_by_css_selector("option[value='1']").click()
driver.find_element_by_name('status') #定位下拉框
find_element_by_css_selector("option[value='1']").click() 选择里面的选项
10.警告框的处理
有三种表现形式:
1.alert 只有一个确定按钮
2.confirm 有一个确定按钮和一个取消按钮
3.prompt() 有一个确定按钮和一个取消按钮,还有一个文本框 以上三种统一的定位方式如下:
句柄.switch_to.alert.accept( ) 接收弹窗
句柄.switch_to.alert.dismiss( ) 拒绝弹窗
11.多框架iframe处理
有两种形式: 1.平行框架 2.嵌套框架
1.iframe标签本身有id/name的情况
句柄.switch_to.frame('id或者name的属性值') 然后继续操作下面的步骤即可。 2.iframe标签本身有id/name的情况
a.先使用Xpath定位到iframe标签,将结果赋值给一个变量demo
b.使用a中定义好的变量执行下面的语句 句柄.switch_to.frame(demo) demo=driver.find_element_by_xpath('//*[@id="f1"]') #先定位大框架 (demo为变量名字)
driver.switch_to.frame(demo) demo=driver.find_element_by_xpath('//*[@id="f2"]') #再定位小框架
driver.switch_to.frame(demo) 3.框架有进入就要有退出(除嵌套框架以外)----针对是平行框架
句柄.switch_to.default_content()
七、面向对象编程(三大特点:继承/多态/封装)
.类定义:类是一个具有相同属性或者方法的集合。 .类的写法:
a.定义类的关键字:class
b.类的关键字后面跟的是类的名字,类的首字母一般是 大写 class Student():
pass #如果这个类什么都不做 使用pass表示
c.类下面的def (函数)我们叫类方法,不叫函数。类方法中的第一个参数是self,self代表的是类本身自己属性。
self一定要写在类方法中的第一个位置,在进行传参的时候,我们可以不对self传参。 d.访问类下面的属性时通过创建化对象进行访问,如果在创建类的时候,给类强制性的绑定一些属性以后,这时访问类的时候
需要进行对应的传参。
#代码示例
class Stundent():
pass bart = Stundent() #创建一个实例对象
print bart #查看创建实例对象所在计算机内存位置
bart.name = 'zhangshan'
print bart.name
3.类的初始化 __init__方法
#代码示例
class Student():
def __init__(self,name,age):
self.name = name
self.age = age demo = Student('zhaoming',250)
a = demo.name
b = demo.age
print a,b class Student():
def __init__(self,name,age):
self.name = name
self.age = age def print_message(self):
print 'hello,{} my age is {}'.format(self.name,self.age) demo = Student('zhaoming',250)
demo.print_message() 4.类的继承
class Animals():
def running(self):
print "Animals is running---------------->" class Dog(Animals):
pass real_demo = Dog()
print real_demo
real_demo.running() #访问animals下面的running方法 class Animals():
def running(self):
print "Animals is running---------------->"
class Dog(Animals):
def singsing(self):
print 'dog is singsing+++++++++++++++>' if __name__ == "__main__":
real_demo = Dog()
real_demo.running() #访问animals下面的running方法
real_demo.singsing()
5.学生成绩封装 (函数对比类实现) 函数式编程 面向整个过程 注重的功能的实现
std1 = {'name':'zhangshan','score':150}
std2 = {'name':'lukuncai','score':100}
def print_score(std):
print "student:{},score:{}".format(std['name'],std['score'])
print_score(std1)
print_score(std2)
面向对象编程把学生看做一个类,学生有name score属性 print_score功能
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score def print_score(self):
print "student:{},score:{}".format(self.name,self.score) if __name__=='__main__':
demo1 = Student('zhangshan',150)
demo2 = Student('lukuncai',100)
print demo1,demo2
demo1.print_score()
八、unittest单元测试框架
每一种开发语言都有自己的原生的单元测试框架。
(pyunit)unittest --------> Python语言内部的一个单元测试框架
pytest --------> Python语言内部的单元测试框架
TestNg、Junit --------------->Java语言的原生框架
1.unittest单元测试框架好处
a.提供用例的组织和管理
b.提供丰富的断言方法
assertIn(a,b)
assertEqual(a,b)
assertTrue(a)
assertIs(a,b)
..............
c.提供丰富的日志(执行的测试用例数量,通过数有多少,失败数量有多少,环境信息)
2.unittest单元测试框架组成
import unittest #导包unittest
class Leiming(unittest.TestCase):
#定义一个测试类 类名Leiming 继承unittest.TestCase def test_Add(self): #test method names begin 'test*'
#测试用例的开头必须以test test后面跟什么不需要关注
self.assertEqual(3, 3)
#assertEqual(a,b) 断言的函数 由TestCase提供,表示a是否等于b def test_Multiply(self):
self.assertEqual(10, 0) if __name__ == '__main__':#作用是用来运行整个模块的主函数
unittest.main()
#.main方法是unittest下面提供的方法 用来运行整个测试用例中以test开头的测试用例
3.自动化测试用例执行顺序
0-9数字优先----->其次A-Z大写字母------>最后a-z小写字母
import unittest
class Test(unittest.TestCase):
def test123Add(self):
print '第一次打印------------->' def test123Aub(self):
print '第一次打印+++++++++++++>' def test123(self):
print '第一次打印%%%%%%%%%%%%%%' if __name__=="__main__":
unittest.main()
4.前置条件和后置条件
前置:setUp()
后置:tearDown( )
前置指的是:比如打开浏览器、最大化窗口、休眠等一系列动作,都可以看做是前置。
后置指的是:执行完测试用例,数据还原,浏览器的关闭等操作。
前置和后置属于非必要条件,如果在前置条件和后置条件什么都不做,用pass 表示。但是一般写自动化测试脚本必须要有前置和后置。结构清晰、组织代码正常运行。
import unittest
class Test(unittest.TestCase): def setUp(self):
print '' def test123Add(self):
print '第一次打印------------->' def test123Aub(self):
print '第一次打印+++++++++++++>' def test123(self):
print '第一次打印%%%%%%%%%%%%%%' def tearDown(self):
print '' if __name__=="__main__":
unittest.main()
运行看效果。
5.unittest单元测试框架之--断言
什么是断言?
在编写用例的过程中,不管用例的执行过程是怎样的,最初都会有一个预期结果,用例的执行就是通过执行用例的步骤,验证实际的结果是否与预期结果相等。unittest 框架的 TestCase 类提供一些方法用检查比较和报告失败。
assertEqual(a,b) ----------判断a是否等于b
assertNotEqual(a,b) --------判断a是否不等于b
assertIn(a,b) -------- 判断a是否在b中
assertNotIn(a,b) --------判断a是否不在b中
assertTrue(x) --------判断x是否为真
assertFalse(x) --------判断x是否为假
assertIs(a,b) -------- 判断a是否是b
6.整合百度/有道测试用例到uniitest单元测试框架
import unittest,time
from selenium import webdriver
class Test_baidu_search(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome()
self.base_url = 'https://www.baidu.com'
self.driver.implicitly_wait(30)
self.driver.maximize_window() def test_baidu(self): '''百度搜索测试用例''' driver = self.driver
driver.get(self.base_url)
driver.find_element_by_css_selector('#kw').send_keys('demo')
driver.find_element_by_css_selector('#su').click()
time.sleep(3)
title = driver.title
self.assertEqual(title,u'demo_百度搜索') def test_youdao(self): '''有道搜索测试用例''' driver = self.driver
driver.get('http://www.youdao.com/')
driver.find_element_by_name("q").clear()
driver.find_element_by_name("q").send_keys("webdriver")
driver.find_element_by_xpath("//*[@id='form']/button").click()
time.sleep(2)
driver.find_element_by_xpath("html/body/div[7]/i/a[1]").click()
text01 = driver.find_element_by_css_selector("span[class='keyword']").text
self.assertEqual(text01,'webdriver') def tearDown(self):
self.driver.quit() if __name__ == '__main__':
unittest.main()
7.引包机制
- 同级引包
- 跨目录引包
pub.py下面的代码:
def add(a,b):
return a+b def sub(a,b):
return a-b
from Change_Directory.count import add,sub
print add(1,2)
print sub(1,2)
一步到位带你入门Selenium的更多相关文章
- 可能是史上最强大的js图表库——ECharts带你入门
PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 StanZhai 两位仁兄让我试试 ECharts ,去主页看到<Why ECharts ?&g ...
- 史上最强大的js图表库——ECharts带你入门(转)
出处:http://www.cnblogs.com/zrtqsk/p/4019412.html PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 Sta ...
- C#单元测试,带你入门
注:本文示例环境 VS2017 XUnit 2.2.0 单元测试框架 xunit.runner.visualstudio 2.2.0 测试运行工具 Moq 4.7.10 模拟框架 为什么要编写单元测试 ...
- SQLite 带你入门
SQLite数据库相较于我们常用的Mysql,Oracle而言,实在是轻量得不行(最低只占几百K的内存).平时开发或生产环境中使用各种类型的数据库,可能都需要先安装数据库服务(server),然后才能 ...
- 一天带你入门到放弃vue.js(三)
自定义指令 在上面学习了自定义组件接下来看一下自定义指令 自己新建的标签赋予特殊功能的是组件,而指定是在标签上使用类似于属性,以v-name开头,v-on,v-if...是系统指令! v-是表示这是v ...
- 一天带你入门到放弃vue.js(二)
接下来我们继续学习一天带你入门到放弃系列vue.js(二),如有问题请留言讨论! v-if index.html <div id="app"> <p v-if=& ...
- 一天带你入门到放弃vue.js(一)
写在前面的话! 每个新的框架入手都会进行一些列的扯犊子!这里不多说那么多!简简单单说一下vue吧! Vue.js是目前三大框架(angular,vue,react)之一,是渐进式js框架,据说是摒弃了 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-1目录
asp.net core2.0大白话带你入门 本系列包括: 1.新建asp.net core项目2.web项目目录解读3.配置访问地址4.环境变量详解5.配置文件6.日志7.DI容器8.服务的生命周期 ...
- 一个有趣的小例子,带你入门协程模块-asyncio
一个有趣的小例子,带你入门协程模块-asyncio 上篇文章写了关于yield from的用法,简单的了解异步模式,[https://www.cnblogs.com/c-x-a/p/10106031. ...
随机推荐
- OLAP和OLTP的区别(基础知识)
联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的,他同时提出了关于OLAP的12条准则.OLAP的提出引起了很大的反响,OLAP作为一类产品同联机事务处理 ( ...
- List,ArrayList
List是一个接口,而ListArray是一个类. ListArray继承并实现了List. 所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造. Lis ...
- laravel中session的过期时间
在项目开发的过程中,前后端分离 需要用session保存用户的登陆信息 这就涉及到session的有效期了 session又分为php中的session有效期和laravel中的session的有效期 ...
- linux下通过sysfs操作GPIO
linux下通过sysfs操作GPIO 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的.其实linux下面有一个通用的GPIO操作接口,那就是 ...
- UnQLite简介
UnQLite是,由Symisc Systems公司出品的一个嵌入式C语言软件库,它实现了一个自包含.无服务器.零配置.事务化的NoSQL数据库引擎.UnQLite是一个文档存储数据库,类似于Mong ...
- 杂项:WiKi
ylbtech-杂项:WiKi Wiki是一种在网络上开放且可供多人协同创作的超文本系统,由沃德·坎宁安于1995年首先开发,这种超文本系统支持面向社群的协作式写作,同时也包括一组支持这种写作.沃德· ...
- sublime text3 FTP直接上传
- Py修行路 内置模块补充 datetime模块
Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.datetime模块用于是date和time模块的合集,他内部重新封装了time模块,相比于time ...
- Python之模拟职场人生游戏
题目:模拟人生 要求:1.至少有两个角色 2.玩的过程中,有冲突 3.根据不同的交互,产生不同的行为. 4.一定要用到面向对象语法和思想 1.解题思路 创建一个类,赋予角色不同的方法,使用面向对象思想 ...
- pandas层级索引1
层级索引(hierarchical indexing) 下面创建一个Series, 在输入索引Index时,输入了由两个子list组成的list,第一个子list是外层索引,第二个list是内层索引. ...