selenium+python系统登录实战代码

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

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

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

其中,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)

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

posted on 2018-11-28 18:41  酒儿Neko  阅读(1325)  评论(0编辑  收藏  举报

导航