1. 程式人生 > >python + selenium 模組封裝及引數化

python + selenium 模組封裝及引數化

模組封裝

示例程式碼:
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']