最近換了新工作命雀,公司讓使用python寫自動化測試腳本蒜哀,緊急學(xué)習(xí)中
課程體系
基礎(chǔ)入門:語法、常用數(shù)據(jù)類型吏砂、條件語句撵儿、異常處理、類與對象狐血、單元測試
接口自動化:P2P業(yè)務(wù)+unittest+request+ddt+excel+mysql+smtp+loging+jenkins
+svn
Web自動化:UI層+pytest+selenium+PageObject+jenkins
APP自動化:UI層+pytest+appium+jenkins
RF:RF+接口 RF+web RF+app RF+jenkins
編碼工具
- python 3.x --->解釋器
- pycharm社區(qū)版--->編輯器
- 認(rèn)識編輯器
- pycharm中常用的文件類型
基礎(chǔ)語法
標(biāo)識符
-
標(biāo)識符:寫代碼過程中自己取的名字
- 項(xiàng)目名:project name
- 包名:package name
- 模塊名:.py python文件名
-
命名規(guī)范:
1.數(shù)字淀歇、字母、下劃線組成匈织,不能以數(shù)字開頭浪默,區(qū)分大小寫
2.見名知意
3.不同的字母、數(shù)字最好用下劃線隔開,提高可讀性
class_0901
4.不能使用關(guān)鍵字
數(shù)據(jù)類型
-
數(shù)字類型number:整型 浮點(diǎn)型
- 整型 int
- 浮點(diǎn)型 float
布爾類型 bool boolean
只有兩個(gè)值 True False浴鸿,首字母必須大寫-
字符串 str
成對的單引號井氢、雙引號、三引號
''
""
''' '''
單個(gè)字母岳链、數(shù)字花竞、漢字、單個(gè)符號都稱之為一個(gè)元素
使用
len(數(shù)據(jù))
統(tǒng)計(jì)數(shù)據(jù)的長度-
字符串取值:
字符串名[索引值]
- 正序(從0開始) 0 1 2 3 4 5
- 倒序 -6 -5 -4 -3 -2 -1 (從-1開始)
-
字符串取多個(gè)值:(又叫切片)
字符串名[索引頭:索引尾:步長]
- 步長默認(rèn)為1
- 取頭不取尾
字符串倒序輸出
print(a[::-1])
-
字符串分割
字符串.split(可以指定切割符,可以指定切割次數(shù))
- 返回一個(gè)列表類型的數(shù)據(jù)掸哑,列表中的元素都是字符串類型
a='hello!' print(a.split("l")) #輸出:['he', '', 'o!'] print(a.split("l",1)) #輸出:['he', 'lo!']
- 返回一個(gè)列表類型的數(shù)據(jù)掸哑,列表中的元素都是字符串類型
-
字符串替換
字符串.replace(替換值,新值,替換次數(shù))
a='hello!' print(a.replace("l","@",1)) #輸出:he@lo! print(a.replace("l","@",2)) #輸出:he@@o!
-
字符串的去除指定字符
字符串.strip(指定字符)
- 不指定字符時(shí)站欺,默認(rèn)去掉空格
b=' hello!' print(len(b)) #輸出:7 print(b.strip()) #輸出:hello! print(len(b.strip())) #輸出:6
- 只能去掉首和尾的指定的字符
b='hel lo!' print(len(b)) #輸出:7 print(b.strip()) ##輸出:hel lo! print(len(b.strip())) #輸出:7 c='hel!lo!' print(len(c)) #輸出:7 print(c.strip("!")) #輸出:hel!lo print(len(c.strip("!"))) #輸出:6
- 不指定字符時(shí)站欺,默認(rèn)去掉空格
-
字符串拼接 使用
+
進(jìn)行拼接- 保證
+
左右兩邊的變量類型要一致 - 強(qiáng)制轉(zhuǎn)換
str(數(shù)字)
,將數(shù)字轉(zhuǎn)化為str類型age=18 name="Andy" print("今天是"+name+"的"+str(age)+"歲生日书妻,祝他快樂") # 輸出:今天是Andy的18歲生日,祝他快樂
- 保證
-
字符串的格式化輸出 format
- 第一種format:使用
{}
占坑age=18 name="Andy" print("今天是"+name+"的"+str(age)+"歲生日,祝他快樂") print("今天是{}的{}歲生日玻孟,祝他快樂".format(name,age)) #同一個(gè)效果 print("今天是{0}的{1}歲生日陨闹,祝他快樂".format(name,age)) #同一個(gè)效果 #format后面可以填n個(gè)參數(shù)跛璧,通過在{}中加入索引襟交,打印不同的變量值
- 第二種format:使用
%
占坑,%s字符串 %d整數(shù) %f浮點(diǎn)數(shù) %2.f保留2位小數(shù)age=18 name="Andy" print("今天是"+name+"的"+str(age)+"歲生日择浊,祝他快樂") print("今天是%s的%d歲生日戴卜,祝他快樂".format(name,age)) #同一個(gè)效果 print("今天是%s的%s歲生日,祝他快樂".format(name,age)) #同一個(gè)效果 #format后面只能按順序賦值琢岩,%s可以填任何數(shù)據(jù)類型
- 第一種format:使用
-
列表 list 符號
[]
- 可以存在空列表
a=[]
- 列表可以包含任何數(shù)據(jù)類型
- 列表里的元素投剥,通過逗號來分割
- 列表里面的元素也是有索引值的,從0開始
- 獲取列表里的單個(gè)值:
列表[索引值]
- 列表的切片:同字符串切片
列表名[索引頭:索引尾:步長]
- 往列表中添加數(shù)據(jù)
列表名.append(要加的數(shù)據(jù))
追加在列表的末尾担孔,有序江锨,且一次只能追加一個(gè)元素 - 往列表中插入數(shù)據(jù)
列表名.insert(插入位置的索引,插入的數(shù)據(jù))
- 刪除
列表名.pop(索引值)
不傳值,默認(rèn)刪除最后一個(gè)元素糕篇。pop()
返回值是刪除的那個(gè)值 - 指定刪除
列表名.remove(要刪除的值)
- 修改值
a[索引值]=賦值
- 什么時(shí)候用列表啄育?存儲的數(shù)據(jù)屬于同一個(gè)類型的時(shí)候,建議使用列表
- 可以存在空列表
-
元組 tuple 符號()
- 可以存在空元組
a=()
- 可以包括任何的數(shù)據(jù)類型
- 元組的元素通過逗號分割
- 元組的元素也是有索引值的拌消,從0開始
- 獲取元組里的單個(gè)值:
元組[索引值]
- 元組的切片:同字符串切片
元組名[索引頭:索引尾:步長]
- 元組不支持任何修改灸撰,即增刪改,但是如果元組中有列表拼坎,是可以修改列表中的元素的
- 什么時(shí)候使用元組?保護(hù)數(shù)據(jù)不被修改,如數(shù)據(jù)庫操作
a=(1,'0.02','hello',[1,2,3],True) a[3]="中國" # 會報(bào)錯(cuò) a[3][1]="China" print(a) # 輸出:(1, '0.02', 'hello', [1, 'China', 3], True)
- 如果元組只有一個(gè)元素完疫,要加一個(gè)逗號
a=("happy") print(type(a)) #<class 'str'> b=(12) print(type(b)) #<class 'int'> c=("happy",) print(type(c)) #<class 'tuple'> d=(12,) print(type(d)) #<class 'tuple'>
- 可以存在空元組
-
字典 dict 符號
{}
- 可以存在空字典
a={}
- 字典中數(shù)據(jù)的存儲方式:
key:value
- 字典中的value可以包括任何數(shù)據(jù)類型
- 字典的元素通過逗號分割
- 字典是無序的泰鸡,沒有索引值,可以通過key找value
- 字典取值
字典[key]
- 字典刪除
pop(key)
因?yàn)槭菬o序的壳鹤,所以必須指定key盛龄,返回值是刪除的值 - 新增值
字典名[新key]=value
- 修改值
字典名[已存在key]=value
- 什么時(shí)候使用字典?每個(gè)數(shù)據(jù)類型不一樣,代表的內(nèi)容也不一樣余舶,用鍵值對方式表示時(shí)
a={"class":"python01","gender":"女","age":12,"score":[98,99,92]} print(a["class"]) #python01 print(a) #{'class': 'python01', 'gender': '女', 'age': 12, 'score': [98, 99, 92]} a.pop("age") print(a) #{'class': 'python01', 'gender': '女', 'score': [98, 99, 92]} a["name"]="Tom" print(a) #{'class': 'python01', 'gender': '女', 'score': [98, 99, 92], 'name': 'Tom'} a["age"]=18 print(a) #{'class': 'python01', 'gender': '女', 'score': [98, 99, 92], 'name': 'Tom', 'age': 18}
- 可以存在空字典
- 判斷數(shù)據(jù)類型
type(數(shù)據(jù))
運(yùn)算符 (常用5大類)
-
算術(shù)運(yùn)算符
+ - * / %
- 模運(yùn)算 取余
%
- 模運(yùn)算 取余
-
賦值運(yùn)算符
= += -=
a=5
-
a+=5
相當(dāng)于a=a+5
-
a-=5
相當(dāng)于a=a-5
-
比較運(yùn)算符
> >= < <= == !=
- 比較結(jié)果返回值是布爾值:True False
-
邏輯運(yùn)算符
and or not
- 返回結(jié)果是布爾值:True False
-
成員運(yùn)算符
in啊鸭、 not in
s="hello" print("e" in s) #True print(("e" not in s)) #False a={"class":"python01","gender":"女","age":12,"score":[98,99,92]} print("女" in a) #False print("class" in a) #True #對于字典 in 和not in判斷的是key,不能判斷value
if語句
控制語句:順序從上到下匿值、 分支if 赠制、循環(huán)for while
- 判斷語句 關(guān)鍵字
if...elif...else
-
語法
# 語法1 if 條件語句: 子語句 ###### 分割線 ###### # 語法2 if 條件語句: 子語句 else: 子語句 ###### 分割線 ###### #語法3 if 條件語句: 子語句 elif 條件語句: 子語句 else: 子語句
靠縮進(jìn)來分級
-
if后的條件語句:
1.比較/邏輯/成員運(yùn)算均可
2.如果是空數(shù)據(jù),其結(jié)果為False挟憔;如果是非空數(shù)據(jù)钟些,其結(jié)果為True
3.直接使用True或False,但是這種方式很雞肋
if 和elif后面可以加條件語句绊谭,else后面不能加條件語句
-
示例:接收用戶輸入年齡的功能政恍,根據(jù)年齡展示不同的歡迎語
age=input("請輸入你的年齡") #接收輸入 if age.isdigit(): #如果字符串只包含數(shù)字則返回 True 否則返回 False age=int(age) if age>=18: print("恭喜你,成年了") elif age<0: print("別鬧达传,妖怪篙耗,請輸入正確的年齡") else: print("還是個(gè)小屁孩") else: print("不是數(shù)字,請重新輸入")
-
循環(huán)語句
-
for循環(huán)
- 語法
for item in sequence:#遍歷sequence的元素宪赶,賦值給item宗弯,所以這里的item不用提前賦值 代碼塊
- sequence可以是字符串、列表逊朽、元組罕伯、字典、集合等……
- 字典數(shù)據(jù)遍歷的是key叽讳,如果要遍歷value追他,使用
字典名[key]
a={"name":"xiaofang","age":18} for i in a: print(i) #輸出: #name #age for i in a: print(a[i]) #輸出: #xiaofang #18
- 字典里可以獲取字典的key或value
字典名.values()
字典名.keys()
a={"name":"xiaofang","age":18} #循環(huán)value for item in a.values(): print(item) #循環(huán)key for item in a.keys(): print(item)
- 循環(huán)中常涉及的一個(gè)函數(shù)
range(m,n,k)
m頭 n尾 k步長,k不寫默認(rèn)為1岛蚤,m不寫邑狸,默認(rèn)為0,取頭不取尾
- 嵌套循環(huán)
#把列表中的每個(gè)元素都單獨(dú)打印出來 L=[["monica","xiaohua","dave"],["helen","san"]] for item in L: #每循環(huán)一次涤妒,拿到一個(gè)子列表 for a in item: #每循環(huán)一次单雾,拿到子列表中的元素 print(a) #打印直角三角形 for i in range(1,6): for a in range(1,i+1): print("*",end='') #內(nèi)循環(huán)不換行 print("") #外循環(huán)換行
- 語法
-
while循環(huán)
-
語法
while 條件表達(dá)式:#邏輯表達(dá)式、成員運(yùn)算她紫、比較運(yùn)算硅堆、空數(shù)據(jù)、布爾值等 代碼塊
- 執(zhí)行順序:首先判斷條件表達(dá)式贿讹,如果為True渐逃,就執(zhí)行代碼塊,否則不進(jìn)入代碼塊民褂;執(zhí)行完畢后茄菊,繼續(xù)判斷條件表達(dá)式疯潭,繼續(xù)執(zhí)行代碼塊,直到條件表達(dá)式結(jié)果為False結(jié)束循環(huán)面殖。
- 防止進(jìn)入死循環(huán)竖哩,需要加一個(gè)變量來控制循環(huán)次數(shù)
a=0 while a<10: print("這是第{}次循環(huán)".format(a+1)) a=a+1
-
while和if語句搭配使用 break continue
- break 結(jié)束循環(huán),跳出循環(huán)
- continue 跳出本次循環(huán)脊僚,開始下一次循環(huán)
-
練習(xí)
#練習(xí) #passwd={"admin":"123321","user1":"123456"} #1.設(shè)計(jì)一個(gè)程序相叁,不同的用戶名和對應(yīng)的密碼存在字典中,輸入正確的用戶名和密碼可以登錄系統(tǒng) #2.首先輸入用戶名吃挑,如果用戶名不正確或者為空钝荡,則一直提示輸入正確的用戶名 #3.當(dāng)用戶名正確時(shí),提示輸入密碼舶衬,如果密碼跟用戶名不對應(yīng)埠通,則提示密碼錯(cuò)誤重新輸入 #4.當(dāng)密碼輸入錯(cuò)誤三次時(shí),中斷程序逛犹,密碼輸入錯(cuò)誤時(shí)端辱,提示還有幾次機(jī)會 #5.用戶名、密碼都正確時(shí)虽画,提示登錄成功 passwd={"admin":"123321","user1":"123456"} username=input("請輸入用戶名: ") count_err=0 #記錄密碼輸入錯(cuò)誤的次數(shù) while username not in passwd.keys(): username=input("請輸入用戶名: ") password=input("請輸入密碼: ") while True: if password != passwd[username]: count_err+=1 if count_err==3: print("密碼錯(cuò)誤3次舞蔽,中止交易") break else: print("密碼錯(cuò)誤,剩余次數(shù){}".format(3 - count_err)) password = input("請輸入密碼: ") continue else: print("登錄成功") break
-
python內(nèi)置函數(shù)
函數(shù)的特點(diǎn):重復(fù)使用
為了提高程序員的開發(fā)效率码撰,Python提供了很多可以直接拿來用的函數(shù)渗柿,每個(gè)函數(shù)都可以幫助程序員實(shí)現(xiàn)某些具體的功能。
如:
print input len type str int list range pop append insert keys split replace remove clean
python函數(shù)
-
語法
def 函數(shù)名(參數(shù)1,參數(shù)2……): #此處參數(shù)為形參脖岛,形式參數(shù)朵栖,不是具體的值 函數(shù)體 #希望這個(gè)函數(shù)實(shí)現(xiàn)什么功能
調(diào)用函數(shù):
函數(shù)名(參數(shù)1,參數(shù)2……)
,這里的參數(shù)為實(shí)參柴梆,實(shí)際參數(shù)陨溅,具體的值return 值
函數(shù)返回值,表示調(diào)用函數(shù)時(shí)绍在,這次調(diào)用會返回一個(gè)return后面的值门扇,return后面的語句不會執(zhí)行默認(rèn)參數(shù)
def 函數(shù)名(class,name="monica"):
,name="monica"
就是默認(rèn)參數(shù)偿渡,如果調(diào)用時(shí)臼寄,不傳name的值,默認(rèn)name="monica"溜宽,如果name傳了值脯厨,name就等于傳入的值,默認(rèn)參數(shù)要放在形式參數(shù)的后面-
調(diào)用函數(shù)傳參時(shí)兩種方式坑质,按形參的順序或者指定形參對應(yīng)的值
# 求1-100的加和 # 函數(shù) def add(start,end): sum=0 for item in range(start,end+1): sum+=item return sum # 調(diào)用函數(shù)兩種方式 add(1,100) #按順序賦值 add(end=100,start=1) #指定賦值
-
動態(tài)參數(shù)合武,又叫不定長參數(shù)
def 函數(shù)名(*args):
不限制參數(shù)的長度、個(gè)數(shù)涡扼,在函數(shù)內(nèi)部以元組來傳遞def make_sanwich(*args): all='' num=0 print(len(args)) for item in args: all+=item #最后一個(gè)不要"稼跳、" while num!=len(args)-1: all+='、' num+=1 break print("您的三明治包含了"+all) make_sanwich("花生","培根","火腿","菜葉子") make_sanwich("花生","菜葉子")
-
關(guān)鍵字參數(shù) key-value keyword
def 函數(shù)名(**kwargs):
kwargs在函數(shù)中體現(xiàn)為字典def kw_func(**kwargs): print(kwargs) kw_func(x=7,classname="進(jìn)階班") #輸出:{'x': 7, 'classname': '進(jìn)階班'}
形式參數(shù)吃沪、默認(rèn)參數(shù)汤善、動態(tài)參數(shù)、關(guān)鍵字參數(shù)可以混用
-
寫函數(shù)的思路
1.先用代碼實(shí)現(xiàn)功能票彪,可以選取一組數(shù)據(jù)來證明自己的代碼是否正確
2.變成函數(shù)红淡,加def
3.提高復(fù)用性,如加入?yún)?shù)
-
變量的作用域
a=1 # 全局變量 def add_1(b): print(a+b) def add_2(b): a=5 # 局部變量 print(a+b) add_1(10) # 11 add_2(10) # 15 print(a) # 1
-
全局變量和局部變量區(qū)別:
1.作用域不同:全局變量降铸,在模塊里都可以調(diào)用在旱;函數(shù)的局部變量,只能作用于函數(shù)
2.當(dāng)全局和局部變量同名且同時(shí)存在時(shí)推掸,函數(shù)優(yōu)先調(diào)用局部變量
3.當(dāng)沒有局部變量桶蝎,函數(shù)優(yōu)先調(diào)用全局變量
4.global關(guān)鍵字,聲明這是一個(gè)全局變量
a=1 # 全局變量 def add_3(b): global a #聲明a是全局變量 a=10 #給a賦值 print(a+b) add_3(10) print(a) # 10
-
怎么看函數(shù)
按住command鍵(win是ctrl鍵)谅畅,鼠標(biāo)點(diǎn)擊要查看的函數(shù)登渣,就可以跳轉(zhuǎn)到該函數(shù)定義的模塊-
怎么引入不同的模塊
-
安裝模塊
-
a.在線安裝:
1.終端-->
pip install 模塊名
(國外源,安裝慢毡泻,可能超時(shí))2.國內(nèi)源: 終端-->
pip install -i 國內(nèi)源url 模塊名
3.file-setting-project interpreter-點(diǎn)擊+-搜索模塊名-勾選-install package(通過旁邊的manage repositories添加國內(nèi)鏡像源)
-
b.離線安裝:
在python官網(wǎng)或者網(wǎng)上找到離線安裝包
解壓--拷貝解壓后的文件到python的安裝目錄下
python setup.py install
包一般都被安裝在
lib
或lib-->sitepackage
下
-
-
使用模塊
-
a.python自帶的胜茧、第三方庫怎么導(dǎo)入
1.import
package的結(jié)構(gòu)是
lib>email>mime>base.py
導(dǎo)入模塊base.py:
improt email.mime.base
使用base.py中的方法:
email.mime.base.方法名()
如果是lib下的模塊,可以直接
import os
2.from...import (推薦用法)
導(dǎo)入模塊base.py:
from email.mime import base
使用base.py中的方法:
base.方法名()
-
b.自己寫的怎么導(dǎo)入
package的結(jié)構(gòu)是
項(xiàng)目名(python11)>package(first_demo)>basic_01>add.py
導(dǎo)入模塊:
import first_demo.basic_01 from add
(除了頂級目錄不用寫,一層一層寫下來)使用add.py中的方法:
add.方法名()
-
-
-
理解
if __name__ == '__main__':
#add.py文件仇味,自己寫的模塊 def add_two(a,b): print(a+b) print("這是一個(gè)開始呻顽,add.py模塊") add_two(10,20) print("這是一個(gè)結(jié)束,add.py模塊")
#demo.py邪铲,需要導(dǎo)入自己寫的模塊add.py from py_0906 import add add.add_two(12,12)
此時(shí)芬位,雖然我們在demo.py中只是調(diào)用add.py中的add_two方法,但是add.py中的所有代碼都會運(yùn)行带到,輸出的結(jié)果是:
這是一個(gè)開始昧碉,add.py模塊 30 這是一個(gè)結(jié)束,add.py模塊 24
怎樣避免這種情況呢揽惹?只調(diào)用我們想要調(diào)用的函數(shù)被饿,使用
if __name__ == '__main__':
#add.py文件 def add_two(a,b): print(a+b) if __name__ == '__main__': print("這是一個(gè)開始,add.py模塊") add_two(10,20) print("這是一個(gè)結(jié)束搪搏,add.py模塊")
if __name__ == '__main__':
表示主程序的執(zhí)行入口狭握,只有當(dāng)你在當(dāng)前模塊下執(zhí)行時(shí),代碼才會執(zhí)行疯溺,別人調(diào)用時(shí)论颅,不會執(zhí)行哎垦。一般用于寫一些自測代碼。__name__
是當(dāng)前模塊名恃疯,當(dāng)模塊被直接運(yùn)行時(shí)模塊名為__main__
漏设。這句話的意思就是,當(dāng)模塊被直接運(yùn)行時(shí)今妄,以下代碼塊將被運(yùn)行郑口,當(dāng)模塊是被導(dǎo)入時(shí),代碼塊不被運(yùn)行盾鳞。現(xiàn)在運(yùn)行add.py結(jié)果是:
這是一個(gè)開始犬性,add.py模塊 30 這是一個(gè)結(jié)束,add.py模塊
運(yùn)行demo.py結(jié)果是
24
冒泡排序
a=[11,29,53,6,7,0,3]
for i in range(0,len(a)): #第一輪
for j in range(1,len(a)):
if a[j-1]>a[j]:
a[j-1],a[j]=a[j],a[j-1] #python中互換位置的寫法
print(a)