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