当前位置:网站首页>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

原网站

版权声明
本文为[play_big_knife]所创,转载请带上原文链接,感谢
https://blog.csdn.net/play_big_knife/article/details/110792681