python + selenium 模組封裝及引數化
阿新 • • 發佈:2019-02-14
模組封裝
示例程式碼:
baidu.py
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")
driver.find_element_by_xpath("//*[@id='su']").click()
我們對上面的程式碼簡單的程式碼做一個模組化簡單示例:
在當前目錄建立封裝用的module.py
driver.get("https://www.baidu.com/")
driver.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")
driver.find_element_by_xpath("//*[@id='su']").click()
sleep(2)
driver.quit()
將上面這段程式碼剪下到我們新建的module.py
檔案,稍加改裝:
class baidumodule():
def __init__(self,driver,):
self.dr = driver #不能在類中再次匯入webdriver 兩邊的driver等於兩個視窗,直接讓呼叫方傳入driver即可
def login(self,values):
login_dr = self.dr
login_dr.get("https://www.baidu.com/")
login_dr.find_element_by_xpath("//*[@id='kw']").send_keys(values)
login_dr.find_element_by_xpath("//*[@id='su']").click()
def login_out(self):
self.dr.quit()
開始引用:
from time import sleep
from selenium import webdriver
from module import baidumodule #從我們我們建立的module.py匯入baidumodule類
driver = webdriver.Chrome()
start = baidumodule(driver) #將driver傳給aidumodule這個類
start.login("selenium") #呼叫aidumodule下的login函式,並傳入我們想要搜尋的類容
sleep(2)
start.login("webdriver")#呼叫aidumodule下的login函式,並傳入我們想要搜尋的類容
sleep(2)
start.login_out()#引用退出函式
以上為簡單示例,好處是每次使用重複程式碼時不需要重複敲那些重複的程式碼,寫一次,傳參呼叫即可
引數化
我們依然使用上面的程式碼進行演示:
from time import sleep
from selenium import webdriver
from module import baidumodule #從我們我們建立的module.py匯入baidumodule類
driver = webdriver.Chrome()
start = baidumodule(driver) #將driver傳給aidumodule這個類
start.login("selenium") #呼叫aidumodule下的login函式,並傳入我們想要搜尋的類容
sleep(2)
start.login("webdriver")#呼叫aidumodule下的login函式,並傳入我們想要搜尋的類容
sleep(2)
start.login_out()
示例一
直接使用一個列表
一個簡單的引數化列表,如我們要測試百度搜索多種類的值,那就來一個引數化,就不需要每次重複的手動呼叫及重複的敲程式碼了
from time import sleep
from selenium import webdriver
from module import baidumodule
driver = webdriver.Chrome()
start = baidumodule(driver) #將driver傳給aidumodule這個類
name = ["selenium","webdriver","selenium2","selenium3"]#我們需要搜尋的值
for i in name: #迴圈這個列表並使用
start.login(i) #呼叫aidumodule下的login函式並傳入我們遍歷列表的值,第一次第0個,二次第1個
sleep(2)
start.login_out()
注:專案中並不推薦使用for迴圈來進行引數化,因為我們不方便進行用例條目統計,及錯誤定位,(如我們上面的程式碼使用unittest 寫在test函式中不管我們讓其搜尋了多少個值,它都只會計數為1,而且如果出錯他只會顯示這一條出錯,可能並不會顯示指定錯誤的細節,不方便定位錯誤)
示例二
使用csv檔案匯入
建立file.csv
檔案並將我們前面name列表中的資料貼上進去
vulues #這是一段指引並不會被讀取
selenium
webdriver
selenium2
selenium3
使用open引入:
方法一
需要關閉檔案:
name = open("file.csv","r") #以只讀方式開啟檔案
for i in name:
print(i)
name.close() #用完記得關閉檔案
方法二
不需要關閉檔案:
with open("file.csv","r") as name: 匯入檔案
lines = name.readlines()#以行讀取整個檔案
print(lines)
返回一個列表:['selenium\n', 'webdriver\n', 'selenium2\n', 'selenium3']
改寫上面的baidu.py
檔案
import csv #匯入csv模組
from itertools import islice #從itertools匯入islice,後邊讓其預設跳過第一行使用
from time import sleep
from selenium import webdriver
from module import baidumodule
driver = webdriver.Chrome()
start = baidumodule(driver) #將driver傳給aidumodule這個類
with open("file.csv","r") as name:
lines = name.readlines()#以行讀取整個檔案
for i in islice(lines,1,None): #每次從第二個遍歷,因為第一行為我們設定的指引行
start.login(i) #呼叫aidumodule下的login函式
sleep(2)
start.login_out()
一行多個值的情況如我們上面的file.csv
檔案中的值使引數化使用者名稱及密碼
name,passwd #這是一段指引並不會被讀取
name1,zhangsan
name2,lisi
name3,wanger
那我們讀取的時候進行拆分使用split
with open("file.csv","r") as name:
lines = name.readlines()
for i in islice(lines,1,None): #每次從第二個遍歷
a = i.split(",")#以,進行拆分
#print(a)
start.login(a[0])#就可以使用位置引數0來取user,1來取passwd
a返回的結果為多個列表:
['name1', 'abc123\n']
['name2', 'lisi\n']
['name3', 'abc123']