整个代码的设计思路是,利用page object思想,融合selenium+python,将某个系统的每个登录页面常用到的元素将其封装为一个类,此文章以登录XX学院的系统为例。

接下来为大家一一附上实现代码:

1、首先附上整个登录测试脚本的工程结构:

python msal 登陆 python登录系统_测试用例

其中,Pages模块专门用于写登录一一些常用到的页面元素。一个page就写一个类,便于数据与代码分离。

(1)Maizi_base_bage:这个class文件专门提供并简化了对页面元素的定位操作功能,下载url,获取当前url等操作

# -*- coding:utf-8 -*-
#应用HTMLRunner和page_object的思维来实现网易云课堂的登录,并规定,从本地文件.txt中读取用户名和密码

from selenium import webdriver

class Maizi_base_page(object):
    driver = None
    url = None
    def __init__(self,driver):
self.driver = driver

#对元素的基本操作
    def by_id(self,the_id):
return self.driver.find_element_by_id(the_id)

def by_id_error(self,the_id):
return self.driver.find_elements_by_id(the_id)

def by_name(self,the_name):
return self.driver.find_element_by_name(the_name)

def by_class_name(self,the_calss_name):
return self.driver.find_element_by_class_name(the_calss_name)

def by_class_selector(self,the_class_selector):
return self.driver.find_element_by_css_selector(the_class_selector)

def by_link_text(self,the_link_text):
return self.driver.find_element_by_link_text(the_link_text)

def by_js(self,js): 
return self.driver.execute_script(js)

#加载页面
    def navigate(self,url):
self.driver.get(url)

#获取url
    def get_url(self):
return self.url


(2)Deault_Page:此页面是进入系统时的默认显示页面,在该页面获取【登录】链接元素,

       以便在最终编写单独的测试用例脚本代码时能够调用该函数,并实现其对应操作

# -*- coding:utf-8 -*-
#此页面是进入麦子学院的默认页面,需要对某个特定的元素来进行操作
from Pages.Maizi_base_page import Maizi_base_page

class Deaultf_Page(Maizi_base_page):
def click_login_link(self):
return self.by_link_text('登录')


(3)login_page:此代码专门用于对登录页面的用户名、密码输入框、以及【登录】按钮进行操作

# -*- coding:utf-8 -*-
#此页面是用户登录页面,需要对用户名输入框,密码输入框进行操作

from Pages.Maizi_base_page import Maizi_base_page

class login_page(Maizi_base_page):

def username(self):
return self.by_id('id_account_l')


def password(self):
return self.by_id('id_password_l')

def click_login_btn(self):
return self.by_id('login_btn')

#这里返回一个登录组件的元组
    def Find_Login_Element(self):
return self.username(),self.password(),self.click_login_btn()

#这里的用户名及密码都是从XSL文件中读取,所以需要修改一些地方
    def login_start(self,username,password):
self.username().clear()
self.username().send_keys(username)
self.password().clear()
self.password().send_keys(password)
self.click_login_btn().click()


(4)dashboard_page:此页面,其实代表的是一个正确的输入用户名、密码之后,点击【登录】按钮一定能够登录成功,

       此时,页面应该会跳转到一个admin页面,其页面右上角会出现你的用户名【链接】显示

# -*- coding:utf-8 -*-
#此页面是登录成功以后跳转的页面,登录成功后我们需要加载该页面
from Pages.Maizi_base_page import Maizi_base_page

class dashboard_page(Maizi_base_page):
def greeking_link(self):
return self.by_class_name('nick')  #登录成功后,右上角会有账户显示link


(5)Read_Data:此class用来从表格文件中读取数据,如果你在本地上存在一个已经设计好了的登录测试用例数据,并且是.xlsx文件的用户名及密码,

那么该class就允许你从表格文件中获取数据,并且把他们转换为字典型的list列表。

# -*- coding:utf-8 -*-
#此文件代码,是专门用于从指定文件中读取

import xlrd

class Read_Data(object):

def __init__(self,path=''):
self.xl = xlrd.open_workbook(path)

def Get_Use_Info(self): #从表格中,一行一行来读取数据,然后把对应的数据与变量来组成相应的字典,并且添加到一个list列表中
        listkey = ['username','password']
        info_list = []
for row in range(1,self.sheet.nrows):
            info = self.sheet.row_values(row)
            tmp = zip(listkey,info)
            info_list.append(dict(tmp))
return info_list

#通过表格名字来获取表格内容,并且得到的还是一个字典型的list列表
    def Get_Sheet_By_Name(self,name):
self.sheet = self.xl.sheet_by_name(name)
return self.Get_Use_Info()

#通过表格下标获取表格内容,并且得到的还是一个字典型的list列表
    def Get_Sheet_By_Index(self,index):
self.sheet = self.xl.sheet_by_index(index)
return self.Get_Use_Info()

#定义一个函数,专门用于把表格中的所有数据转换成字符串类型,因为对于表格中的数据
    #python会把从表格中获得的数据默认为float类型
    def Switch_Var_To_String(self,value):
if isinstance(value,float):
            value = str(int(value))
return value
运行效果如下:

注意:此时list列表中的字典元素中的值是float型,这是因为,纯数字的字符串,从表格中读取出来默认是float类型,
后期应用是需要调用Switch_Var_To_String(self,value)函数来转换其数据类型。

(5)Write_Login_Info_To_XSL_File:这是为了把最后的测试结果报告写入到指定的表格文件中,使得测试报告独立成份!!

# -*- coding:utf-8 -*-

import xlsxwriter
import time

class Write_Login_Info_To_XSL_File(object):
'''
    该函数用于创建工作簿,并且创建一个表格
    '''
    #初始化工作簿
    def __init__(self,path='',mode = 'w'):
        fname = time.strftime('%Y-%m-%d',time.gmtime())
self.xls = xlsxwriter.Workbook(path + fname +'.xls')
self.row = 0

    # 向表格中写入数据
    def xls_write(self, args):
        col = 0
        for value in args:
self.sheet.write_string(self.row, col, value)
            col += 1
        self.row += 1

    #初始化表格
    def login_sheet_init(self,sheetname,*table_header):
self.sheet = self.xls.add_worksheet(sheetname)
self.sheet.set_column('A:C',30)
self.xls_write(*table_header)

#创建一个写登录信息的接口
    def Write_Log(self,*args):
self.xls_write(*args)

def Close_XLS(self):
self.xls.close()

if __name__ =='__main__':
    xinfo = Write_Login_Info_To_XSL_File()
    header = ['uname','pwd','error_msg']
    xinfo.login_sheet_init('test',header)
    info = ['小程序','2435456','right!']
    xinfo.Write_Log(info)
    xinfo.Close_XLS()

运行结果:

此时,数据已成功写到指定目录下的.xlsx文件中。


(6)登录成功的测试用例:

# -*- coding:utf-8 -*-
#此处专门用于写测试用例,page和测试用例应该分离开来,用户数据应该跟代码分离开来
#测试结果用HTMLRunner来实现报告输出
from selenium import webdriver
from Pages.Login_Page import login_page
from Pages.Default_Page import Deaultf_Page
from Read_Data.Read_Data_From_File import Read_Data
from Write_Login_Info_To_XSL_File.Write_Login_Info_To_XSL_File import Write_Login_Info_To_XSL_File

if __name__ == '__main__':
    driver = webdriver.Firefox()
    url = 'http://www.maiziedu.com/'
    default = Deaultf_Page(driver) #实例化麦子学院默认页面
    default.navigate(url) #然后加载麦子学院页面
    default.click_login_link().click() #在默认页面找到【登录】按钮并实现点击,此时到达登录页面
    #向登录页面的用户名输入框和密码输入框输入数据,数据从文件中读取
    login_page = login_page(driver) #实例化一个登录页面,然后对其用户名元素和密码元素进行数据设置

    #对于输入用户名和密码,我们专门从本地XLS文件中读取出来,并把读取出来的信息通过send_keys来实现登录操作
    read_object = Read_Data(r'C:\Users\Administrator\Desktop\userinfo.xlsx')
#然后调用然后调用这个类里面的Get_Sheet_By_Name()方法来获取字典型用户信息
    infolist = read_object.Get_Sheet_By_Name('userinfo')

# 在此处来判断是否登录成功,并把登录成功与否的信息写入到测试报告表格中
    # 把登录是否成功的信息写入到XSL文件中
    # 1、首先,实例化一个写文件的对象
    write_object = Write_Login_Info_To_XSL_File()
    header = ['uname', 'pwd', 'error_msg']
    write_object.login_sheet_init('test', header)

#然后根据每个元素里面的键找到对应的值即可。
    for dict in infolist:
# 但是从表格中读取出来的数据默认是float型,所以需要强制转换为string类型
        username = read_object.Switch_Var_To_String(dict['username'])
        password = read_object.Switch_Var_To_String(dict['password'])
        login_page.login_start(username,password)
        log_mark = '登录成功'
        log_info = [username,password,log_mark]
        write_object.Write_Log(log_info)

注意:写测试用例时,应将成功的测试用例和失败的测试用例单独分离出来,这样可以减小代码复杂度,同时也能更好的管理和维护测试脚本代码。