其实,关于这篇文章发布前还是有很多思考的,我是不想发布的,因为关于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的更多相关文章

  1. 可能是史上最强大的js图表库——ECharts带你入门

    PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 StanZhai 两位仁兄让我试试 ECharts ,去主页看到<Why ECharts ?&g ...

  2. 史上最强大的js图表库——ECharts带你入门(转)

    出处:http://www.cnblogs.com/zrtqsk/p/4019412.html PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 Sta ...

  3. C#单元测试,带你入门

    注:本文示例环境 VS2017 XUnit 2.2.0 单元测试框架 xunit.runner.visualstudio 2.2.0 测试运行工具 Moq 4.7.10 模拟框架 为什么要编写单元测试 ...

  4. SQLite 带你入门

    SQLite数据库相较于我们常用的Mysql,Oracle而言,实在是轻量得不行(最低只占几百K的内存).平时开发或生产环境中使用各种类型的数据库,可能都需要先安装数据库服务(server),然后才能 ...

  5. 一天带你入门到放弃vue.js(三)

    自定义指令 在上面学习了自定义组件接下来看一下自定义指令 自己新建的标签赋予特殊功能的是组件,而指定是在标签上使用类似于属性,以v-name开头,v-on,v-if...是系统指令! v-是表示这是v ...

  6. 一天带你入门到放弃vue.js(二)

    接下来我们继续学习一天带你入门到放弃系列vue.js(二),如有问题请留言讨论! v-if index.html <div id="app"> <p v-if=& ...

  7. 一天带你入门到放弃vue.js(一)

    写在前面的话! 每个新的框架入手都会进行一些列的扯犊子!这里不多说那么多!简简单单说一下vue吧! Vue.js是目前三大框架(angular,vue,react)之一,是渐进式js框架,据说是摒弃了 ...

  8. net core体系-web应用程序-4net core2.0大白话带你入门-1目录

    asp.net core2.0大白话带你入门 本系列包括: 1.新建asp.net core项目2.web项目目录解读3.配置访问地址4.环境变量详解5.配置文件6.日志7.DI容器8.服务的生命周期 ...

  9. 一个有趣的小例子,带你入门协程模块-asyncio

    一个有趣的小例子,带你入门协程模块-asyncio 上篇文章写了关于yield from的用法,简单的了解异步模式,[https://www.cnblogs.com/c-x-a/p/10106031. ...

随机推荐

  1. fn project 生产环境使用

    此为官方的参考说明   Running Fn in Production The QuickStart guide is intended to quickly get started and kic ...

  2. VUE API 重点

    VUE API 重点 生命周期方法 每个组件都有生命周期,是向 ReactJs 学习的. computed 在一个组件声明一个人,人有名,人有姓,输入姓和名.((&--&%--& ...

  3. Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)

    一.确认已经装好了GCC和Make的软件包 可以使用whereis命令查看: 如果whereis  gcc和whereis  make命令有结果,说明安装了这两个软件,可以继续往下做. 二.使用GCC ...

  4. java ------------用Array.sort()输出数组元素的最大值,最小值,平均值~~~~

    总结:输出最大值,最小值,可以先排序,再输出就容易点了.不用循环判断.我还没学.但是觉得很好用 package com.aini; import java.util.Arrays; import ja ...

  5. 浏览器访问IPv6地址

    http://[IPv6]:port/index.html http://[3ffe:3201:1200:1::91]:8080/index.html 目前现在的网络运营商基本都不支持基于IPv6地址 ...

  6. Linux - 对文件和目录的权限管理

    对文件的权限管理 ls -l,也可以用 ll 命令查看文件权限的相关信息 第一列“-rw-r--r--.”为权限信息,权限信息的最后一个点表示为在安全环境下创建的 第二列“1”为硬链接数,第三列“ro ...

  7. 基本的Ceph性能测试工具和方法

    测试环境 1. 测试准备 1.1 磁盘读写性能 1.1.1 单个 OSD 磁盘写性能,大概 165MB/s. root@ceph1:~# echo 3 > /proc/sys/vm/drop_c ...

  8. python's twenty day for me 继承 和 super()方法

    super(): 在单继承中就是单纯的寻找父类. 在多继承中就是根据子节点所在图 的mro顺序,找寻下一个类. 遇到多继承和super(): 对象.方法 1,找到这个对象对应的类. 2,将这个类的所有 ...

  9. Mycat实战之新增基于hash分片的表

    1. 修改rule.xml hash分片规则 主要改两个地方: vi rule.xml 分片数量,这里改为3 对应 三个库 hash规则 默认是id列 这里为 PROVINCE 2. reload 加 ...

  10. Android Studio 配置模拟器AVD存放路径(默认在c盘,解决c盘空间不够问题)

    Android Studio 安装之后,默认的会给我们创建一个 Nexus 的模拟器, 这个模拟器的镜像文件放在了 C:\Users\Administrator\.android  中 其中的avd文 ...