進階Python,從編寫Python函數開始
讀懂十行代碼不如自己親自上手編寫一行!代碼想熟練最好的方法就是能夠通過代碼解決工作中的實際問題,例如完成UI自動化測試、接口測試、創建測試數據、構建測試環境、清理數據環境等等。上述這些場景我們都可以從把要解決的問題封裝成函數開始,例如我用ui自動化進行登陸,可以把登陸的幾行代碼封裝成函數login(p_user,p_pwd),做接口測試可以把常用的get和post方法封裝成 get(p_url)和post(p_url,p_data)。在這里我會詳細的講解python中關于函數的基礎知識,最后以selenium 進行百度搜索為例來講解自動化測試中如何把具體業務封裝成方法實現代碼復用,相信大家一定會有所收獲!
函數基礎知識
函數的本質就是代碼復用,在面向對象中把函數稱為方法。Python提供了許多內建函數,比如
print()。我們也可以自己創建函數,這被叫做用戶自定義函數。以下是函數定義的簡單規則:
- 函數代碼塊以def關鍵詞開頭,后接函數標識符名稱和圓括號()。
- 圓括號之間用于定義參數。
- 函數內容以冒號起始,并且縮進。
- return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當于返回None
例如:
- def func():
- print("函數實例")
- func()
輸出結果是:
函數實例
函數的參數
形參和實參
定義一個帶參數的函數,如下:
- def func_para(p_str):
- print(p_str)
在函數func_para中,p_str就是一個形參,也就是形式參數,是用來接收調用函數時傳入的參數,你傳的是什么它就是什么。實參就是實際參數,在調用函數的時候,傳遞是Kevin,那么Kevin就是實參,傳遞的是Mike,那么Mike也是實參,實參傳遞給函數后,會賦值給函數中的形參
把實參Kevin,賦值給函數,即func_para(“Kevin”),輸出結果是Kevin
把實參Mike,賦值給函數,即func_para(“Mike”),輸出結果是Mike
函數的返回值
調用方運行函數會得到一個值。首先說明,所有的函數都是有返回值的,如果編程人員沒有指定返回值,那默認會返回None。
例如:
- def func_return(p_str):
- return p_str
- str=func_return (“Kevin”)print(str)
運行結果
Kevin
函數高級用法
以上是python中函數最基礎的定義,相信絕大多數同學都知道,接下來我會給大家介紹一些在python中函數的高級用法
參數的默認值
python允許我們給函數的形參設置一個默認值,不傳參數調用的話,就統一默認是這個值。
- def func_default(name='kevin'):
- print("名字是"+name)
- func_default()
- func_default("mike")
輸出:
名字是kevin
名字是mike
關鍵字參數
關鍵字參數讓你可以不用考慮函數的參數位置,你需以鍵值對的形式指定參數的對應形參。
- def func_key(name,age):
- print("你好"+ name+", 你的年齡是"+age+" !")
- func_key(age='38',name='kevin')
輸出:
你好kevin, 你的年齡是38 !
不固定長度參數
有時候我們需要允許用戶提供任意數量的參數,函數的形參可以帶個星號來接收,不管調用函數的時候傳遞了多少實參,都將被收集到形參這個變量當中,形參的類型是元組。例如:
- def fun_unfixedlength_1 (*args):
- print(args)fun_unfixedlength_1 ('kevin','38','67674297')
輸出
('kevin', '38', '67674297')
還有一種是帶兩個星號的形參,用于接收鍵值對形式的實參,導入到函數中的類型是字典。
- def fun_unfixedlength_2 (**args):
- print(args)fun_unfixedlength_2(name='kevin',age='38',qq='67674297')
輸出
{'name': 'kevin', 'age':'38', 'qq': '67674297'}
匿名函數
匿名函數就是不用走正常函數定義的流程,可以直接定義一個簡單的函數并把函數本身賦值給一個變量,使得這個變量可以像函數一樣被調用,在python中可以用lambda關鍵字來申明定義一個匿名函數。例如
- lambda_demo = lambda first_name,last_name : first_name + " "+last_name
- name = lambda_demo('kevin','li')
- print(name)
輸出kevin li
函數實際應用
最后我結合ui自動化測試給大家舉一個函數在測試工作中的實際應用。我們以selenium 進行百度搜索為例,selenium的核心代碼如下:
- driver.get("https://www.baidu.com/")
- driver.find_element_by_id("kw").clear()
- driver.find_element_by_id("kw").send_keys("selenium") #輸入框輸入selenium
- driver.find_element_by_id("su").click() #點擊搜索按鈕
備注:我的頭條中有很多文章講解了關于selenium應用的具體方法,在這里就不再贅述了。可以參考:
一文搞定Java和Python在Selenium3中的應用
Selenium原理精講
場景分析:由于搜索的關鍵字是千變萬化的,而進行搜索的動作是固定的,即:打開百度網頁>在輸入框輸入關鍵字>點擊百度一下搜索按鈕。所以我們可以把該場景編寫為函數,用一個函數來處理進行各種關鍵字搜索的需求。核心代碼實現如下:
- def baidu_search(p_key):
- driver.get("https://www.baidu.com/")
- driver.find_element_by_id("kw").clear()
- driver.find_element_by_id("kw").send_keys(p_key) # 輸入框輸入selenium
- driver.find_element_by_id("su").click() # 點擊搜索按鈕
如果大家想通過函數來檢查是否找到了需要搜索的關鍵字,那么可以對函數進行改進,如果在搜索結果頁面中出現了“百度為您找到相關結果約*個”的文字證明搜索到了關鍵字返回True,否則返回
False,如下圖所示:
改進后的代碼方法如下:
- def baidu_search(p_key):
- driver.get("https://www.baidu.com/")
- driver.find_element_by_id("kw").clear()
- driver.find_element_by_id("kw").send_keys(p_key) # 輸入框輸入selenium
- driver.find_element_by_id("su").click() # 點擊搜索按鈕
- time.sleep(3)
- try:
- result=driver.find_elements_by_class_name("nums_text").get_attribute('value') #獲取搜索結果的統計個數值,默認是:百度為您找到相關結果約...個
- if re.match('百度為您找到相關結果約.*個', result)is None: #通過正則進行匹配,沒匹配到正則返回None
- return False
- else:
- return True
- exceptNoSuchElementException as e:
- return False
- return True