python+selenium学习随记

一、大概流程

在这里插入图片描述

二、unittest入口(keyword_case.py)

unittest、ddt(数据驱动)、BeautifulReport(测试报告)、HTMLTestRunner(测试报告)
在这里插入图片描述
代码:

#keyword_case.py文件
```python
#conding=utf-8
from selenium import webdriver;
#引入unittest框架
import unittest;
import os
import HTMLTestRunner
import time
from case.bussiness import Bussiness;
from ddt import ddt,data,unpack
from BeautifulReport import BeautifulReport as bf
from util.excel_utie import ReadExcel
read_excel=ReadExcel();
get_data=read_excel.get_data();
print(get_data);
@ddt
class FirstCase(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox();
        self.driver.get('http://www.5itest.cn/register');
        self.bussiness = Bussiness(self.driver);
    @classmethod
    def setUpClass(self):
        print("所有用例执行前执行一次");
        pass
    @data(*get_data)
    # @data(
    #     ['user_email','user_nameuser_nameuser_name','user_pass','text_code'],
    #     ['user_email2', 'user_nameuser_nameuser_name2', 'user_pass', 'text_code'],
    #     ['user_email3', 'user_nameuser_nameuser_name3', 'user_pass', 'text_code']
    # )
    @unpack
    def test_01(self,user_email,user_name,user_pass,text_code):
        self.bussiness.emai_check(user_email,user_name,user_pass,text_code);
        errmessage=self.bussiness.get_allerrr();
        result=self.bussiness.get_element('user_email');
        if(result!=None):
            print("注册失败");
            print(",".join(errmessage));
        else:
            print("注册成本");
    def tearDown(self):
        time.sleep(2);
        # 报错保存图片
        # 从错误信息中获取名称和错误信息
        for method_name, error in self._outcome.errors:
            if error:
                case_name = self._testMethodName
                print("失败打印图片");
                print(time.strftime("%Y%m%d%H%M%S"));
                file_path = os.path.join(os.getcwd() + "/report/" + case_name + time.strftime("%Y%m%d%H%M%S") + ".png");
                self.driver.save_screenshot(file_path);
        self.driver.close();
    @classmethod
    def tearDownClass(cls):
        print("所有用例执行后执行");
if __name__ == '__main__':
    # print("这里这里这里")
    # unittest.main();
    #第一种测试报告模式
    # filename=os.path.join(os.getcwd()+"/report/"+"htmlreport2.html");
    # print(str(filename))
    # print("这里这里这里")
    # fp=open(filename,'wb')
    # # suite = unittest.TestSuite();
    # # suite.addTest(FirstCase('test_01'));
    # suite=unittest.TestLoader().loadTestsFromTestCase(FirstCase);
    # runner=HTMLTestRunner.HTMLTestRunner(stream=fp, title='练习测试报告');
    # runner.run(suite)
    # fp.close();
    # 第一种测试报告模式
    #第二种测试报告模式
    now = time.strftime("%Y-%m-%d %H%M%S", time.localtime(time.time()))
    localpath = os.getcwd()
    print('本文件目录位置:' + localpath)
    filepath = os.path.join(localpath, 'Report')
    print('报告存放路径    :' + filepath)
    # 按函数加载testxxx测试用例
    filename = now + '.html'
    suite=unittest.TestLoader().loadTestsFromTestCase(FirstCase);
    runner=bf(suite);
    runner.report(description="这个描述参数是必填的",filename=filename)
    # fp.close();
    # 第二种测试报告模式

遇到的比较大的问题,使用unittest过程中main没有运行,如下操作:
在这里插入图片描述
确定后,main即可运行

二、数据驱动

xlrd、xlutils、python对excel表格操作(获取单元格数据、写入数据等)

#excel_utie.py文件
#coding=utf-8
import xlrd#读取
import xlwt#写入

from xlutils.copy import copy
class ReadExcel():
    def __init__(self,filename=r'G:\0804\apache-jmeter-5.1.1\test\PycharmProjects\pythonProject\util\test2.xls',index=0):
        self.wb = xlrd.open_workbook(filename);
        self.table=self.wb.sheet_by_index(index);#获取第几个表格
        self.t_ncol = self.table.ncols; #获取行数,列数
        self.t_nrow = self.table.nrows;
        print(self.t_nrow);
        self.filename=filename;
    def get_values(self,c,r):
        result=self.table.cell(c,r).value;#获取第二行第二列值(从0开始)
        return result;
    #获取表格所有数据
    def get_data(self):
        result=[];
        for i in range(self.t_nrow):
            col=self.table.row_values(i);
            result.append(col);
        return result;

    #写入文件
    def worte_file(self,row,col,value):
        read_value=self.wb;
        print(self.wb);
        write_data=copy(read_value);
        write_data.get_sheet(0).write(row,col,value);
        write_data.save(self.filename);
# if __name__ == '__main__':
#         aread=ReadExcel();
#         result=aread.get_data();
#         print(result);


注意点:excel文件路径可改为动态传入
在这里插入图片描述

三、对元素进行操作(输入框输入值,点击按钮等)

#business.py文件
from case.handle import Handle;
class Bussiness():
    def __init__(self,driver):
        self.handle=Handle(driver);
    #找元素
    def get_element(self,key):
        return self.handle.element_find(key);
    #测试邮箱
    def check_email(self,key,value):
        #输入数据
        self.handle.input_value(key,value);
    def emai_check(self,user_email,user_name,user_pass,text_code):
        self.check_email('user_email',user_email);
        self.check_email('user_name',user_name);
        self.check_email('user_pass',user_pass);
        self.check_email('text_code',text_code);
        self.handle.su_button('register-btn');
    def get_readresult(self,key):
        return self.handle.get_text(key);
    #获取所有注册输入框错误时信息
    def get_allerrr(self):
        result =self.get_readresult('register_email-error');
        resultname = self.get_readresult('register_nickname-error');
        resultpass = self.get_readresult('register_password-error');
        resultcde = self.get_readresult('captcha_code-error');
        aresult=[result,resultname,resultpass,resultcde];
        return aresult;


四、对元素进行操作(handle.py)

#coding=utf-8;
from util.find_element import Find_element
from selenium import webdriver
import os
from datetime import *
from PIL import Image
import time
#对元素进行操作
class Handle():
    def __init__(self,driver):
        self.driver=driver;
    #找到元素
    def element_find(self,key):
        # print(self.driver,"...",self.key);
        findT=Find_element(self.driver,key);
        findA=findT.get_value();
        return findA;
        # print(findA);
    #输入值
    def input_value(self,key,value):
        Element=self.element_find(key);
        Element.send_keys(value);
    #元素按钮
    def su_button(self,key):
        Element=self.element_find(key);
        Element.click();
    #获取浏览器标题
    def get_title(self):
        return self.driver.title;
    #获取元素内容
    def get_text(self,key):
        Element=self.element_find(key);
        try:
            return Element.get_attribute('textContent');
        except:
            return key+"信息输入正确";
    #提取验证码
    def get_code(self):
        shot_name = datetime.now().strftime("%Y%m%d%H%M%S")
        shot_name = os.path.join(os.getcwd(),shot_name + '.png');
        images = self.driver.save_screenshot(shot_name);
        code_element=self.element_find('getcode_num');
        left=code_element.location['x'];
        top= code_element.location['y'];
        right=code_element.size['width']+left;
        height=code_element.size['height']+top;
        image=Image.open(shot_name);
        img=image.crop((left,top,right,height));
        img.save(shot_name);
        print(shot_name);

# if __name__ == '__main__':
#     driver=webdriver.Firefox();
#     driver.get('http://www.5itest.cn/register');
#     handle=Handle(driver);
#     handle.get_code();
#     handle.input_value('user_name');
#     handle.su_button('register-btn');
#     handle.get_title();
#     handle.get_text('register_email-error');

五、根据元素名称查找元素

#find_element.py文件
#coding=utf-8
from selenium import webdriver
from util.read import  readElement
#根据元素查找元素
class Find_element():
    def __init__(self,driver,key):
        self.driver=driver;
        self.key=key;
    #从配置文件中查找
    def get_value(self):
        readE=readElement();
        result=readE.read_value(self.key);
        # print("这里");
        # print(result);
        if(result!=None):
            typer=result[0];
            try:
                typevalue=result[1];
                # print(typevalue);
                if typer=='id':
                    return self.driver.find_element_by_id(typevalue);
                elif typer=='class':
                    return self.driver.find_element_by_class_name(typevalue);
                elif typer=='tag_name':
                    return self.driver.find_element_by_tag_name(typevalue);
                elif typer=='xpath':
                    return self.driver.find_element_by_Xpath(typevalue);
                else:
                    return self.driver.find_element_by_css_selector(typevalue);
            except:
                return None;
        else:
            return None;
# if __name__ == '__main__':
#     driver=webdriver.Firefox();
#     driver.get('http://www.5itest.cn/register');
#     find_element=Find_element(driver,'user_name');
#     a=find_element.get_value();
#     print(a);

六、从配置文件中读取元素

configparser

#ready.py文件
import configparser
#/读取配置文件内容
class readElement():
    def __init__(self,filename=None,node=None):
        if filename==None:
            self.filename=r'G:\0804\apache-jmeter-5.1.1\test\PycharmProjects\pythonProject\util\localElement.ini';
        if node==None:
            self.node='UserElement';
        else:
            self.node=node;
        self.cf=self.readT();
    #读取文件
    def readT(self):
        cf=configparser.ConfigParser();
        cf.read(self.filename);
        return cf;
    #读取内容
    def read_value(self,key):
        try:
            result=self.cf.get(self.node,key);
            return result.split(">");
        except:
            return None;
# if __name__ == '__main__':
#     ReadElement=readElement();
#     print(ReadElement.read_value('user_name'));

七、配置文件.ini

#localElement.ini文件
[UserElement]
user_email=id>register_email
user_name=id>register_nickname
user_pass=id>register_password
text_code=id>captcha_code
register-btn=id>register-btn
register_email-error=id>register_email-error
user-dropdown-profile__nickname=class>user-dropdown-profile__nickname
register_nickname-error=id>register_nickname-error
register_password-error=id>register_password-error
captcha_code-error=id>captcha_code-error
getcode_num=id>getcode_num
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值