模块封装
示例代码:
baidu.py
from time import sleepfrom selenium import webdriverdriver = 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 sleepfrom selenium import webdriverfrom 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 sleepfrom selenium import webdriverfrom 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 sleepfrom selenium import webdriverfrom module import baidumoduledriver = 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 #这是一段指引并不会被读取seleniumwebdriverselenium2selenium3
使用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 sleepfrom selenium import webdriverfrom module import baidumoduledriver = 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,zhangsanname2,lisiname3,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']