当前位置:网站首页>Selenium测试案例一步步学之(2)Selenium自动测试脚本模块化(下)
Selenium测试案例一步步学之(2)Selenium自动测试脚本模块化(下)
2022-08-09 07:52:00 【play_big_knife】
Selenium测试案例一步步学之(2)Selenium自动测试脚本模块化(下)
一、selenium测试模块化
selenium测试模块化可以概括为下图的功能函数。

二、QQ登录查找当前页最新邮件模块化后的功能函数对应关系
导包部分:
from selenium import webdriver
import time
依据模块化图示的功能函数对应实现如下:
OpenBrowoser()打开模块函数的实现,代码如下。
'''
打开浏览器
'''
def open_browser():
browser=webdriver.Firefox()
return browser
代码直接调用webdriver.Firefox()启动火狐浏览器.
OpenUrl函数模块的实现,代码如下。
'''
打开测试url
'''
def open_url(browser,url):
browser.get(url)
browser.maximize_window()
代码通过get方法访问需求网站,再通过maximize_window()把浏览器窗口最大化。
FindElement查找元素的函数模块实现,代码如下。
'''
查找元素
'''
def find_element(browser,link_text,usr_id,pwd_id,btn_id):
if link_text:
browser.find_element_by_link_text(link_text).click()
usrElement=browser.find_element_by_id(usr_id)
pwdElement=browser.find_element_by_id(pwd_id)
btnElement=browser.find_element_by_id(btn_id)
return usrElement,pwdElement,btnElement
代码通过findelementbylinktext定位链接文本,在qq邮箱登录中,传入的就是帐户登录,再通过findelementby_id方法通过传入的id定位元素。
sendKeys()对元素赋值函数模块实现,代码如下。
'''
对查找的元素赋值
'''
def set_vals(elem,usr_txt,pwd_txt):
listkey=[usr_txt,pwd_txt]
i=0
for key in listkey:
elem[i].clear()
elem[i].send_keys(key)
i+=1
elem[i].click()
代码首先将传入的用户输入框文本,和密码输入框文本放在列表中,使用for循环对列表中文本的遍历,对传入文本的元素集合中的元素依次通过clear()方法清空原有文本,send_keys()传入本次需要设置的文本内容。
getResult检测测试结果函数模块的实现,代码如下。
'''
获取对应测试结果
'''
def get_result(browser,class_name):
elems=browser.find_elements_by_class_name(class_name)
for el in elems:
print (el.text)
代码通过findelementsbyclassname方法获取类名对应文本,收件箱中的邮件文本就可以通过类名对应的方法找到文本元素,然后遍历每一个文本元素,输出文本元素的内容。
最后,关闭浏览器模块的功能函数实现,代码如下。
'''
关闭登陆效果,并关闭浏览器
'''
def close(browser):
browser.find_element_by_link_text("退出").click()
browser.close()
在切换QQ登陆邮箱时,需要切换到frame框架内,这时需要添加一个切换框架的功能函数OpenFrame模块,代码如下。
'''
进入对应框架内
'''
def open_frame(browser,framename=""):
if framename!="":
browser.switch_to.frame(framename)
有切换frame框架的函数,就要有切换回到根部的函数,当操作完切换QQ登陆邮箱的frame框架后,还需要返回窗口根部,不然不能对浏览器内的元素进行操作.ReturnFrame返回浏览器根部的功能函数模块,代码如下。
'''
返回根
'''
def return_frame(browser):
browser.switch_to_default_content()
在进行QQ邮箱操作过程中,进入页面后,需要链接文本的模糊匹配函数实现链接文本的点击操作.GetResponse就是进入到邮箱后的页面操作功能函数模块实现,代码如下。
'''
进入页面的操作
'''
def get_response(browser,action_txt):
browser.find_element_by_partial_link_text(action_txt).click()
完成上述的功能函数模块后,主函数进行调用代码如下。
if name=="main": ''' 此段代码被修改 driver=webdriver.Firefox() ''' driver=openbrowser() ''' 此段代码被修改 driver.get("http://mail.qq.com") ''' openurl(driver,"http://mail.qq.com") ''' 此段代码被修改 driver.switchto.frame("loginframe") ''' openframe(driver,"loginframe") ''' 此段代码被修改 label=driver.findelementbylinktext(u"帐号密码登录").click() usr=driver.findelementbyid("u") pwd=driver.findelementbyid("p") btn=driver.findelementbyid("loginbutton") ''' elemtmp=findelement(driver,u"帐号密码登录","u","p","loginbutton") ''' 此段代码被修改 usr..sendkeys("XXXXXXXX") pwd..sendkeys("XXXXXXXXXXXXXX") btn.click() ''' setvals(elemtmp,"XXXXXXXX","XXXXXXXXXXXXX") ''' 此段代码换成公用的切换回主界面的代码 driver.switchtodefaultcontent() ''' returnframe(driver) ''' 此段代码换成功能性代码 driver.findelementbypartiallinktext(u"收件箱").click() ''' getresponse(driver,u"收件箱") ''' 此段回到相关frame ''' openframe(driver,"mainFrame") ''' 此段获取功能结果
''' getresult(driver,"F") ''' 此段代码退出 ''' returnframe(driver) close(driver)
三、数据的归整
上述完成代码中,部分功能模块的传参,参数太复杂。
把数据归整在一起,如下所示。
ele_dict={
"url":"http://mail.qq.com",
"link_text":u"帐号密码登录",
"usr_id":"u",
"pwd_id":"p",
"btn_id":"login_button"
}
于是代码就变成了:
from selenium import webdriver
import time
'''
打开浏览器
'''
def open_browser():
browser=webdriver.Firefox()
return browser
'''
打开测试url
'''
def open_url(browser,url):
browser.get(url)
browser.maximize_window()
'''
查找元素
'''
def find_element(browser,arg):
if arg["link_text"]:
browser.find_element_by_link_text(arg["link_text"]).click()
usrElement=browser.find_element_by_id(arg["usr_id"])
pwdElement=browser.find_element_by_id(arg["pwd_id"])
btnElement=browser.find_element_by_id(arg["btn_id"])
return usrElement,pwdElement,btnElement
'''
对查找的元素赋值
'''
def set_vals(elem,usr_txt,pwd_txt):
listkey=[usr_txt,pwd_txt]
i=0
for key in listkey:
elem[i].clear()
elem[i].send_keys(key)
i+=1
elem[i].click()
'''
获取对应测试结果
'''
def get_result(browser,class_name):
elems=browser.find_elements_by_class_name(class_name)
for el in elems:
print (el.text)
'''
关闭登陆效果,并关闭浏览器
'''
def close(browser):
time.sleep(10)
browser.find_element_by_link_text("退出").click()
browser.close()
'''
进入对应框架内
'''
def open_frame(browser,framename=""):
if framename!="":
browser.switch_to.frame(framename)
'''
返回根
'''
def return_frame(browser):
browser.switch_to_default_content()
'''
进入页面的操作
'''
def get_response(browser,action_txt):
browser.find_element_by_partial_link_text(action_txt).click()
if __name__=="__main__":
'''
定义数据
将分散的参数整合到一起
定义与元素有关的字典
'''
ele_dict={
"url":"http://mail.qq.com",
"link_text":u"帐号密码登录",
"usr_id":"u",
"pwd_id":"p",
"btn_id":"login_button"
}
'''
此段代码被修改
driver=webdriver.Firefox()
'''
driver=open_browser()
'''
此段代码被修改
driver.get("http://mail.qq.com")
'''
open_url(driver,ele_dict["url"])
'''
此段代码被修改
driver.switch_to.frame("login_frame")
'''
open_frame(driver,"login_frame")
'''
此段代码被修改
label=driver.find_element_by_link_text(u"帐号密码登录").click()
usr=driver.find_element_by_id("u")
pwd=driver.find_element_by_id("p")
btn=driver.find_element_by_id("login_button")
'''
elem_tmp=find_element(driver,ele_dict)
'''
此段代码被修改
usr..send_keys("XXXXXXXXX")
pwd..send_keys("XXXXXXXXXXXXXXXXXXXXX")
btn.click()
'''
set_vals(elem_tmp,"XXXXXXXXX","XXXXXXXXXXXXXX")
'''
此段代码换成公用的切换回主界面的代码
driver.switch_to_default_content()
'''
return_frame(driver)
'''
此段代码换成功能性代码
driver.find_element_by_partial_link_text(u"收件箱").click()
'''
get_response(driver,u"收件箱")
'''
此段回到相关frame
'''
open_frame(driver,"mainFrame")
'''
此段获取功能结果
'''
get_result(driver,"F")
'''
此段代码退出
'''
return_frame(driver)
close(driver)
四、传入多个user后的处理
上述我们只改变固定化的数据,对于user进行压测,可能产生多个user,对于user另外定义一套数据。
user_list=[
{"uname":"XXXXXXXXXXX","pwd":"XXXXXXXXXXXXXXXXXX"},
{"uname":"XXXXXXXXXXX","pwd":"XXXXXXXXXXXXXXXXXX"},
{"uname":"XXXXXXXXXXX","pwd":"XXXXXXXXXXXXXXXXXX"},
......
]
于是代码就变成了:
from selenium import webdriver
import time
'''
打开浏览器
'''
def open_browser():
browser=webdriver.Firefox()
return browser
'''
打开测试url
'''
def open_url(browser,url):
browser.get(url)
browser.maximize_window()
'''
查找元素
'''
def find_element(browser,arg):
if arg["link_text"]:
browser.find_element_by_link_text(arg["link_text"]).click()
usrElement=browser.find_element_by_id(arg["usr_id"])
pwdElement=browser.find_element_by_id(arg["pwd_id"])
btnElement=browser.find_element_by_id(arg["btn_id"])
return usrElement,pwdElement,btnElement
'''
对查找的元素赋值
'''
def set_vals(elem,lists):
listkey=["uname","pwd"]
i=0
for key in listkey:
elem[i].clear()
elem[i].send_keys(lists[key])
i+=1
elem[i].click()
'''
获取对应测试结果
'''
def get_result(browser,class_name):
elems=browser.find_elements_by_class_name(class_name)
for el in elems:
print (el.text)
time.sleep(10)
'''
关闭登陆效果,并关闭浏览器
'''
def close(browser):
browser.find_element_by_link_text("退出").click()
browser.close()
'''
进入对应框架内
'''
def open_frame(browser,framename=""):
if framename!="":
browser.switch_to.frame(framename)
'''
返回根
'''
def return_frame(browser):
browser.switch_to_default_content()
'''
进入页面的操作
'''
def get_response(browser,action_txt):
browser.find_element_by_partial_link_text(action_txt).click()
if __name__=="__main__":
'''
定义数据
将分散的参数整合到一起
定义与元素有关的字典
'''
ele_dict={
"url":"http://mail.qq.com",
"link_text":u"帐号密码登录",
"usr_id":"u",
"pwd_id":"p",
"btn_id":"login_button"
}
user_list=[
{"uname":"XXXXXXXXX","pwd":"XXXXXXXXXX"}
]
'''
把数据变成外部加载
'''
'''
此段代码被修改
driver=webdriver.Firefox()
'''
driver=open_browser()
'''
此段代码被修改
driver.get("http://mail.qq.com")
'''
open_url(driver,ele_dict["url"])
'''
此段代码被修改
driver.switch_to.frame("login_frame")
'''
open_frame(driver,"login_frame")
'''
此段代码被修改
label=driver.find_element_by_link_text(u"帐号密码登录").click()
usr=driver.find_element_by_id("u")
pwd=driver.find_element_by_id("p")
btn=driver.find_element_by_id("login_button")
'''
elem_tmp=find_element(driver,ele_dict)
'''
此段代码被修改
usr..send_keys("XXXXXXXXX")
pwd..send_keys("XXXXXXXXXXXXXXXXXXXX")
btn.click()
'''
set_vals(elem_tmp,user_list[0])
'''
此段代码换成公用的切换回主界面的代码
driver.switch_to_default_content()
'''
return_frame(driver)
'''
此段代码换成功能性代码
driver.find_element_by_partial_link_text(u"收件箱").click()
'''
get_response(driver,u"收件箱")
'''
此段回到相关frame
'''
open_frame(driver,"mainFrame")
'''
此段获取功能结果
'''
get_result(driver,"F")
'''
此段代码退出
'''
return_frame(driver)
close(driver)
五、把用户名改成外部文件加载
####把ele_dict变成外部加载,先给出需要加载的外部数据文件webdata.txt。
url="http://mail.qq.com"
link_text="帐号密码登录"
usr_id="u"
pwd_id="p"
btn_id="login_button"
####读入此代码的测试.
def readline():
webdata={}
code=codecs.open("e:\测试类相关资料\文档资料\外部调用示例文件\webdata.txt","r","utf8")
for line in code:
(key,value)=line.split("=")
key=key.strip()
key=key.encode("utf-8").decode("utf-8-sig")// 去除/ufeff行为
value=value.strip()
webdata[key]=value
print (webdata)
if __name__=="__main__":
readline()
将此函数作为返回webdata的值放入到项目中:
def getwebdata(path): code=codecs.open("e:\测试类相关资料\文档资料\外部调用示例文件\webdata.txt","r","utf8") webdata={} for line in code: (key,value)=line.split("=") key=key.strip() key=key.encode("utf-8").decode("utf-8-sig") value=value.strip() webdata[key]=value print (webdata) return webdata
将原来直接给出的值加以注释
'''
定义数据
将分散的参数整合到一起
定义与元素有关的字典
此段代码注释掉,由外部调用获取
ele_dict={
"url":"http://mail.qq.com",
"link_text":u"帐号密码登录",
"usr_id":"u",
"pwd_id":"p",
"btn_id":"login_button"
}
'''
ele_dict=get_web_data("e:\测试类相关资料\文档资料\外部调用示例文件\webdata.txt")
于是代码就变成了:
from selenium import webdriver
import time
import codecs
'''
打开浏览器
'''
def open_browser():
browser=webdriver.Firefox()
return browser
'''
打开测试url
'''
def open_url(browser,url):
browser.get(url)
browser.maximize_window()
'''
查找元素
'''
def find_element(browser,arg):
if arg["link_text"]:
browser.find_element_by_link_text(arg["link_text"]).click()
usrElement=browser.find_element_by_id(arg["usr_id"])
pwdElement=browser.find_element_by_id(arg["pwd_id"])
btnElement=browser.find_element_by_id(arg["btn_id"])
return usrElement,pwdElement,btnElement
'''
对查找的元素赋值
'''
def set_vals(elem,lists):
listkey=["uname","pwd"]
i=0
for key in listkey:
elem[i].clear()
elem[i].send_keys(lists[key])
i+=1
elem[i].click()
'''
获取对应测试结果
'''
def get_result(browser,class_name):
elems=browser.find_elements_by_class_name(class_name)
for el in elems:
print (el.text)
time.sleep(10)
'''
关闭登陆效果,并关闭浏览器
'''
def close(browser):
browser.find_element_by_link_text("退出").click()
browser.close()
'''
进入对应框架内
'''
def open_frame(browser,framename=""):
if framename!="":
browser.switch_to.frame(framename)
'''
返回根
'''
def return_frame(browser):
browser.switch_to_default_content()
'''
进入页面的操作
'''
def get_response(browser,action_txt):
browser.find_element_by_partial_link_text(action_txt).click()
def get_web_data(path):
code=codecs.open("e:\\测试类相关资料\文档资料\外部调用示例文件\webdata.txt","r","utf8")
webdata={}
for line in code:
(key,value)=line.split("=")
key=key.strip()
key=key.encode("utf-8").decode("utf-8-sig")
value=value.strip()
webdata[key]=value
print (webdata)
return webdata
if __name__=="__main__":
'''
定义数据
将分散的参数整合到一起
定义与元素有关的字典
此段代码注释掉,由外部调用获取
ele_dict={
"url":"http://mail.qq.com",
"link_text":u"帐号密码登录",
"usr_id":"u",
"pwd_id":"p",
"btn_id":"login_button"
}
'''
ele_dict=get_web_data("e:\测试类相关资料\文档资料\外部调用示例文件\webdata.txt")
print (ele_dict)
user_list=[
{"uname":"XXXXXXXXXXXXXXXXX","pwd":"XXXXXXXXXXXX"}
]
'''
把数据变成外部加载
'''
'''
此段代码被修改
driver=webdriver.Firefox()
'''
driver=open_browser()
'''
此段代码被修改
driver.get("http://mail.qq.com")
'''
open_url(driver,ele_dict["url"])
'''
此段代码被修改
driver.switch_to.frame("login_frame")
'''
open_frame(driver,"login_frame")
'''
此段代码被修改
label=driver.find_element_by_link_text(u"帐号密码登录").click()
usr=driver.find_element_by_id("u")
pwd=driver.find_element_by_id("p")
btn=driver.find_element_by_id("login_button")
'''
elem_tmp=find_element(driver,ele_dict)
'''
此段代码被修改
usr..send_keys("XXXXXXXXXXXXXX")
pwd..send_keys("XXXXXXXXXXXXXXXXXXXXXXXXXXXX")
btn.click()
'''
set_vals(elem_tmp,user_list[0])
'''
此段代码换成公用的切换回主界面的代码
driver.switch_to_default_content()
'''
return_frame(driver)
'''
此段代码换成功能性代码
driver.find_element_by_partial_link_text(u"收件箱").click()
'''
get_response(driver,u"收件箱")
'''
此段回到相关frame
'''
open_frame(driver,"mainFrame")
'''
此段获取功能结果
'''
get_result(driver,"F")
'''
此段代码退出
'''
return_frame(driver)
close(driver)
六、读取大量的user
把大量user数据用excel表读出来,excel表格式如下。

读取excel表格的数据,用模块xlrd
Python语言中,读取Excel的扩展工具。
(意为:xls文件read库,只能读。)
可以实现指定表单、指定单元格的读取。
使用时请确保已经安装python环境。
安装方法:
pip install xlrd
示例:
1、导入扩展包
import xlrd
2、打开Excel文件读取数据
data = xlrd.open_workbook('excelFile.xls') [1]
3、使用技巧
获取一个工作表
table = data.sheets()[0] #通过索引顺序获取
table = data.sheet_by_index(0) #通过索引顺序获取
table = data.sheet_by_name(u'Sheet1')#通过名称获取
获取整行和整列的值(数组)
table.row_values(i)
table.col_values(i)
获取行数和列数
nrows = table.nrows
ncols = table.ncols
循环行列表数据
for i in range(nrows ):
print table.row_values(i)
单元格
table.cell(rowx,colx)
cell_A1 = table.cell(0,0).value
cell_C4 = table.cell(3,2).value
使用行列索引
cell_A1 = table.row(0)[0].value
cell_A2 = table.col(1)[0].value
我们具体去完成从excel表中取出数据的简单示例是:
import xlrd
data=xlrd.open_workbook("e:\测试类相关资料\文档资料\外部调用示例文件\\userlist.xls")
mysheet=data.sheet_by_index(0)
userlist=[]
listkey=mysheet.row_values(0)
for i in range(1,mysheet.nrows):
user={}
listvalue=mysheet.row_values(i)
for indexs in range(0,mysheet.ncols):
if(isinstance(listvalue[indexs],float)):
listvalue[indexs]=str(listvalue[indexs])[0:-2]
user[listkey[indexs]]=listvalue[indexs]
userlist.append(user)
print (userlist)
最终形成数组,数组中的元素是一个字典。
将此代码放到我们的项目工程中去,可以用class的概念思想:
class UserInfo(object):
def __init__(self,path=''):
self.xl=xlrd.open_workbook(path)
def get_sheetinfo_by_index(self,index):
self.sheet=self.xl.sheet_by_index(index)
return self.get_sheetinfo()
def get_sheetinfo_by_name(self,name):
self.sheet=self.xl.sheet_by_name(name)
return self.get_sheetinfo()
def get_sheetinfo(self):
userlist=[]
listkey=self.sheet.row_values(0)
for i in range(1,self.sheet.nrows):
user={}
listvalue=self.sheet.row_values(i)
for index in range(0,self.sheet.ncols):
if(isinstance(listvalue[index],float)):
listvalue[index]=str(listvalue[index])[0:-2]
user[listkey[index]]=listvalue[index]
userlist.append(user)
return userlist
于是代码就变成了下面的样子:
from selenium import webdriver
import time
import codecs
import xlrd
from selenium.webdriver.support.ui import WebDriverWait
'''
打开浏览器
'''
def open_browser():
browser=webdriver.Firefox()
return browser
'''
打开测试url
'''
def open_url(browser,url):
browser.get(url)
browser.maximize_window()
'''
查找元素
'''
def find_element(browser,arg):
if arg["link_text"]:
els=browser.find_element_by_link_text(arg["link_text"]))
els.click()
usrElement=browser.find_element_by_id(arg["usr_id"])
pwdElement=browser.find_element_by_id(arg["pwd_id"])
btnElement=browser.find_element_by_id(arg["btn_id"])
return usrElement,pwdElement,btnElement
'''
对查找的元素赋值
'''
def set_vals(elem,lists):
listkey=["uname","pwd"]
i=0
for key in listkey:
elem[i].clear()
elem[i].send_keys(lists[key])
i+=1
elem[i].click()
'''
获取对应测试结果
'''
def get_result(browser,class_name):
elems=browser.find_elements_by_class_name(class_name))
for el in elems:
print (el.text)
time.sleep(10)
'''
关闭登陆效果,并关闭浏览器
'''
def close(browser):
browser.find_element_by_link_text("退出").click()
browser.close()
'''
进入对应框架内
'''
def open_frame(browser,framename=""):
if framename!="":
browser.switch_to.frame(framename)
'''
返回根
'''
def return_frame(browser):
browser.switch_to_default_content()
'''
进入页面的操作
'''
def get_response(browser,action_txt):
browser.find_element_by_partial_link_text(action_txt).click()
def get_web_data(path):
code=codecs.open("e:\\测试类相关资料\文档资料\外部调用示例文件\webdata.txt","r","utf8")
webdata={}
for line in code:
(key,value)=line.split("=")
key=key.strip()
key=key.encode("utf-8").decode("utf-8-sig")
value=value.strip()
webdata[key]=value
print (webdata)
return webdata
class UserInfo(object):
def __init__(self,path=''):
self.xl=xlrd.open_workbook(path)
def get_sheetinfo_by_index(self,index):
self.sheet=self.xl.sheet_by_index(index)
return self.get_sheetinfo()
def get_sheetinfo_by_name(self,name):
self.sheet=self.xl.sheet_by_name(name)
return self.get_sheetinfo()
def get_sheetinfo(self):
userlist=[]
listkey=self.sheet.row_values(0)
for i in range(1,self.sheet.nrows):
user={}
listvalue=self.sheet.row_values(i)
for index in range(0,self.sheet.ncols):
if(isinstance(listvalue[index],float)):
listvalue[index]=str(listvalue[index])[0:-2]
user[listkey[index]]=listvalue[index]
userlist.append(user)
return userlist
if __name__=="__main__":
'''
定义数据
将分散的参数整合到一起
定义与元素有关的字典
此段代码注释掉,由外部调用获取
ele_dict={
"url":"http://mail.qq.com",
"link_text":u"帐号密码登录",
"usr_id":"u",
"pwd_id":"p",
"btn_id":"login_button"
}
'''
ele_dict=get_web_data("e:\测试类相关资料\文档资料\外部调用示例文件\webdata.txt")
print (ele_dict)
'''
将用户的产生也注释掉
用类的方法实现
user_list=[
{"uname":"XXXXXXXXXX","pwd":"XXXXXXXXXXXXXXXXX"}
]
'''
userinfo=UserInfo(u"e:\测试类相关资料\文档资料\外部调用示例文件\\userlist.xls")
user_list=userinfo.get_sheetinfo_by_index(0)
print (user_list)
'''
把数据变成外部加载
'''
'''
此段代码被修改
driver=webdriver.Firefox()
'''
driver=open_browser()
'''
此段代码被修改
driver.get("http://mail.qq.com")
'''
open_url(driver,ele_dict["url"])
'''
此段代码被修改
driver.switch_to.frame("login_frame")
'''
open_frame(driver,"login_frame")
'''
此段代码被修改
label=driver.find_element_by_link_text(u"帐号密码登录").click()
usr=driver.find_element_by_id("u")
pwd=driver.find_element_by_id("p")
btn=driver.find_element_by_id("login_button")
'''
elem_tmp=find_element(driver,ele_dict)
'''
此段代码被修改
usr..send_keys("XXXXXXXXXXXXXXXXXX")
pwd..send_keys("XXXXXXXXXXXXXXXXXXXXXXX")
btn.click()
'''
set_vals(elem_tmp,user_list[0])
'''
此段代码换成公用的切换回主界面的代码
driver.switch_to_default_content()
'''
return_frame(driver)
'''
此段代码换成功能性代码
driver.find_element_by_partial_link_text(u"收件箱").click()
'''
get_response(driver,u"收件箱")
'''
此段回到相关frame
'''
open_frame(driver,"mainFrame")
'''
此段获取功能结果
'''
get_result(driver,"F")
'''
此段代码退出
'''
return_frame(driver)
close(driver)
七、延时等待
有的时候能显示出来结果,有的时候显示不出来结果,用selenium的延时等待
隐性等待
implicitly_wait(xx)
隐性等待的意义是:闪电侠和凹凸曼约定好,不论闪电侠去哪儿,都要等凹凸曼xx秒,如果凹凸曼在这段时间内来了,则俩人立即出发去打怪兽,如果凹凸曼在规定时间内没到,则闪电侠自己去,那自然就等着凹凸曼给你抛异常吧。
显性等待
WebDriverWait
配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
将项目定义一个显性等待的功能函数:
def get_time_delays(browser,times,func):
return WebDriverWait(browser,times).until(func)
然后在进行框架切换的时候可以进行一次等待:
def find_element(browser,arg):
if arg["link_text"]:
els=get_time_delays(browser,10,lambda d:d.find_element_by_link_text(arg["link_text"]))
els.click()
usrElement=browser.find_element_by_id(arg["usr_id"])
pwdElement=browser.find_element_by_id(arg["pwd_id"])
btnElement=browser.find_element_by_id(arg["btn_id"])
return usrElement,pwdElement,btnElement
在等待测试结果,也可以设置一定时间的等待:
def get_result(browser,class_name):
elems=get_time_delays(browser,10,lambda d:d.find_elements_by_class_name(class_name))
for el in elems:
print (el.text)
最后在程序主体也可以设置隐性等待:
driver.implicitly_wait(10)
return_frame(driver)
close(driver)
于是代码就变成了:
from selenium import webdriver
import time
import codecs
import xlrd
from selenium.webdriver.support.ui import WebDriverWait
'''
打开浏览器
'''
def get_time_delays(browser,times,func):
return WebDriverWait(browser,times).until(func)
def open_browser():
browser=webdriver.Firefox()
return browser
'''
打开测试url
'''
def open_url(browser,url):
browser.get(url)
browser.maximize_window()
'''
查找元素
'''
def find_element(browser,arg):
if arg["link_text"]:
els=get_time_delays(browser,10,lambda d:d.find_element_by_link_text(arg["link_text"]))
els.click()
usrElement=browser.find_element_by_id(arg["usr_id"])
pwdElement=browser.find_element_by_id(arg["pwd_id"])
btnElement=browser.find_element_by_id(arg["btn_id"])
return usrElement,pwdElement,btnElement
'''
对查找的元素赋值
'''
def set_vals(elem,lists):
listkey=["uname","pwd"]
i=0
for key in listkey:
elem[i].clear()
elem[i].send_keys(lists[key])
i+=1
elem[i].click()
'''
获取对应测试结果
'''
def get_result(browser,class_name):
elems=get_time_delays(browser,10,lambda d:d.find_elements_by_class_name(class_name))
for el in elems:
print (el.text)
'''
关闭登陆效果,并关闭浏览器
'''
def close(browser):
browser.find_element_by_link_text("退出").click()
browser.close()
'''
进入对应框架内
'''
def open_frame(browser,framename=""):
if framename!="":
browser.switch_to.frame(framename)
'''
返回根
'''
def return_frame(browser):
browser.switch_to_default_content()
'''
进入页面的操作
'''
def get_response(browser,action_txt):
browser.find_element_by_partial_link_text(action_txt).click()
def get_web_data(path):
code=codecs.open("e:\\测试类相关资料\文档资料\外部调用示例文件\webdata.txt","r","utf8")
webdata={}
for line in code:
(key,value)=line.split("=")
key=key.strip()
key=key.encode("utf-8").decode("utf-8-sig")
value=value.strip()
webdata[key]=value
print (webdata)
return webdata
class UserInfo(object):
def __init__(self,path=''):
self.xl=xlrd.open_workbook(path)
def get_sheetinfo_by_index(self,index):
self.sheet=self.xl.sheet_by_index(index)
return self.get_sheetinfo()
def get_sheetinfo_by_name(self,name):
self.sheet=self.xl.sheet_by_name(name)
return self.get_sheetinfo()
def get_sheetinfo(self):
userlist=[]
listkey=self.sheet.row_values(0)
for i in range(1,self.sheet.nrows):
user={}
listvalue=self.sheet.row_values(i)
for index in range(0,self.sheet.ncols):
if(isinstance(listvalue[index],float)):
listvalue[index]=str(listvalue[index])[0:-2]
user[listkey[index]]=listvalue[index]
userlist.append(user)
return userlist
if __name__=="__main__":
'''
定义数据
将分散的参数整合到一起
定义与元素有关的字典
此段代码注释掉,由外部调用获取
ele_dict={
"url":"http://mail.qq.com",
"link_text":u"帐号密码登录",
"usr_id":"u",
"pwd_id":"p",
"btn_id":"login_button"
}
'''
ele_dict=get_web_data("e:\测试类相关资料\文档资料\外部调用示例文件\webdata.txt")
print (ele_dict)
'''
将用户的产生也注释掉
用类的方法实现
user_list=[
{"uname":"XXXXXXXXXXXX","pwd":"XXXXXXXXXXXXXXXXXXXXXX"}
]
'''
userinfo=UserInfo(u"e:\测试类相关资料\文档资料\外部调用示例文件\\userlist.xls")
user_list=userinfo.get_sheetinfo_by_index(0)
print (user_list)
'''
把数据变成外部加载
'''
'''
此段代码被修改
driver=webdriver.Firefox()
'''
driver=open_browser()
'''
此段代码被修改
driver.get("http://mail.qq.com")
'''
open_url(driver,ele_dict["url"])
'''
此段代码被修改
driver.switch_to.frame("login_frame")
'''
open_frame(driver,"login_frame")
'''
此段代码被修改
label=driver.find_element_by_link_text(u"帐号密码登录").click()
usr=driver.find_element_by_id("u")
pwd=driver.find_element_by_id("p")
btn=driver.find_element_by_id("login_button")
'''
elem_tmp=find_element(driver,ele_dict)
'''
此段代码被修改
usr..send_keys("XXXXXXXXXXXXX")
pwd..send_keys("XXXXXXXXXXXXXXXXXX")
btn.click()
'''
set_vals(elem_tmp,user_list[0])
'''
此段代码换成公用的切换回主界面的代码
driver.switch_to_default_content()
'''
return_frame(driver)
'''
此段代码换成功能性代码
driver.find_element_by_partial_link_text(u"收件箱").click()
'''
get_response(driver,u"收件箱")
'''
此段回到相关frame
'''
open_frame(driver,"mainFrame")
'''
此段获取功能结果
'''
get_result(driver,"F")
'''
此段代码退出
'''
driver.implicitly_wait(10)
return_frame(driver)
close(driver)
八、错误的处理
在登陆的时候也可能会产生错误页面,比如:

检查这句话对应的元素

用try exception抛出异常,正常可登陆,查看邮件未读,不可登陆,退出不进行查找。
try:
return_frame(driver)
get_response(driver,u"收件箱")
open_frame(driver,"mainFrame")
get_result(driver,"F")
driver.implicitly_wait(10)
return_frame(driver)
close(driver)
except:
print("不能登录")
driver.close()
于是代码为变成:
from selenium import webdriver
import time
import codecs
import xlrd
from selenium.webdriver.support.ui import WebDriverWait
'''
打开浏览器
'''
def get_time_delays(browser,times,func):
return WebDriverWait(browser,times).until(func)
def open_browser():
browser=webdriver.Firefox()
return browser
'''
打开测试url
'''
def open_url(browser,url):
browser.get(url)
browser.maximize_window()
'''
查找元素
'''
def find_element(browser,arg):
if arg["link_text"]:
els=get_time_delays(browser,10,lambda d:d.find_element_by_link_text(arg["link_text"]))
els.click()
usrElement=browser.find_element_by_id(arg["usr_id"])
pwdElement=browser.find_element_by_id(arg["pwd_id"])
btnElement=browser.find_element_by_id(arg["btn_id"])
return usrElement,pwdElement,btnElement
'''
对查找的元素赋值
'''
def set_vals(elem,lists):
listkey=["uname","pwd"]
i=0
for key in listkey:
elem[i].clear()
elem[i].send_keys(lists[key])
i+=1
elem[i].click()
'''
获取对应测试结果
'''
def get_result(browser,class_name):
elems=get_time_delays(browser,10,lambda d:d.find_elements_by_class_name(class_name))
for el in elems:
print (el.text)
'''
关闭登陆效果,并关闭浏览器
'''
def close(browser):
browser.find_element_by_link_text("退出").click()
browser.close()
'''
进入对应框架内
'''
def open_frame(browser,framename=""):
if framename!="":
browser.switch_to.frame(framename)
'''
返回根
'''
def return_frame(browser):
browser.switch_to_default_content()
'''
进入页面的操作
'''
def get_response(browser,action_txt):
browser.find_element_by_partial_link_text(action_txt).click()
def get_web_data(path):
code=codecs.open("e:\\测试类相关资料\文档资料\外部调用示例文件\webdata.txt","r","utf8")
webdata={}
for line in code:
(key,value)=line.split("=")
key=key.strip()
key=key.encode("utf-8").decode("utf-8-sig")
value=value.strip()
webdata[key]=value
print (webdata)
return webdata
def error_msg(browser):
err=browser.find_element_by_id("err_m")
return err.text
class UserInfo(object):
def __init__(self,path=''):
self.xl=xlrd.open_workbook(path)
def get_sheetinfo_by_index(self,index):
self.sheet=self.xl.sheet_by_index(index)
return self.get_sheetinfo()
def get_sheetinfo_by_name(self,name):
self.sheet=self.xl.sheet_by_name(name)
return self.get_sheetinfo()
def get_sheetinfo(self):
userlist=[]
listkey=self.sheet.row_values(0)
for i in range(1,self.sheet.nrows):
user={}
listvalue=self.sheet.row_values(i)
for index in range(0,self.sheet.ncols):
if(isinstance(listvalue[index],float)):
listvalue[index]=str(listvalue[index])[0:-2]
user[listkey[index]]=listvalue[index]
userlist.append(user)
return userlist
if __name__=="__main__":
'''
定义数据
将分散的参数整合到一起
定义与元素有关的字典
此段代码注释掉,由外部调用获取
ele_dict={
"url":"http://mail.qq.com",
"link_text":u"帐号密码登录",
"usr_id":"u",
"pwd_id":"p",
"btn_id":"login_button"
}
'''
ele_dict=get_web_data("e:\测试类相关资料\文档资料\外部调用示例文件\webdata.txt")
print (ele_dict)
'''
将用户的产生也注释掉
用类的方法实现
user_list=[
{"uname":"XXXXXXXXXXXXXX","pwd":"XXXXXXXXXXXXXXXXXXXXXXXXXX"}
]
'''
userinfo=UserInfo(u"e:\测试类相关资料\文档资料\外部调用示例文件\\userlist.xls")
user_list=userinfo.get_sheetinfo_by_index(0)
print (user_list)
'''
把数据变成外部加载
'''
'''
此段代码被修改
driver=webdriver.Firefox()
'''
driver=open_browser()
'''
此段代码被修改
driver.get("http://mail.qq.com")
'''
open_url(driver,ele_dict["url"])
'''
此段代码被修改
driver.switch_to.frame("login_frame")
'''
open_frame(driver,"login_frame")
'''
此段代码被修改
label=driver.find_element_by_link_text(u"帐号密码登录").click()
usr=driver.find_element_by_id("u")
pwd=driver.find_element_by_id("p")
btn=driver.find_element_by_id("login_button")
'''
elem_tmp=find_element(driver,ele_dict)
'''
此段代码被修改
usr..send_keys("XXXXXXXXXXXXXXXXX")
pwd..send_keys("XXXXXXXXXXXXXXXXXXXXXX")
btn.click()
'''
set_vals(elem_tmp,user_list[0])
'''
此段代码换成公用的切换回主界面的代码
driver.switch_to_default_content()
'''
try:
return_frame(driver)
get_response(driver,u"收件箱")
open_frame(driver,"mainFrame")
get_result(driver,"F")
driver.implicitly_wait(10)
return_frame(driver)
close(driver)
except:
print("不能登录")
driver.close()代码的github地址:https://github.com/wawacode/selenium_login_qq_mail
边栏推荐
猜你喜欢
随机推荐
[STL]list
A brief introduction to microservice architecture
线程API
如何把无用的代码注释为 Deprecated 弃用
JSONObject遍历的时候顺序不一致,导致数据对应出错
jmeter concurrency and some limitations of the press
The String class objects created by the JVM memory allocation and the difference between equals and = =
SA-Siam:用于实时目标跟踪的双重连体网络A Twofold Siamese Network for Real-Time Object Tracking
Apache POI
“互联网+”大学生创新创业大赛经历
pip安装更换镜像
记录一次客户的APP数据库版本号升级失败的情况
Change Jupyter Notebook default open directory
设备指纹详解之识别垃圾账号
js数组相关知识复习
redis学习笔记
毕业我选择了保家卫国,退伍我选择了华为外包
账户和权限管理2
接口测试概念
MUV LUV EXTRA 2019CCPC Qinhuangdao Station J Question KMP









