python+selenium自动化测试


前言

一、selenium简介

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、selenium环境搭建

在这里插入图片描述

pip3 install selenium -i https://pypi.douban.com/simple/
文件安装(放置)位置:可以把这个文件理解成一个脚本入口。就是把下的 chromedriver 文件复制到相应的位置。

两个位置:

1...\python\Scripts复制一份到安装Python的文件夹中的Scripts文件夹中;

2.如果是Pycharm,复制一份到..\python\sitepackages\selenium\webdriver\chrome文件中。

写一个简单的例子
seleniumDemo.py

# _*_ coding : utf-8 _*_
# @Time : 2023/4/5 7:46 PM
# @Author : yanhh
# @File : seleniumDemo
# @Project : pydemo1
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

自动化测试环境搭建

1、selenium4定位的新特性locate_with

在这里插入图片描述

2、三种等待

显示等待:不常用
在这里插入图片描述
隐士等待:用于加载页面后

# 3、传入对应url地址
driver.get("http://demo.liumatest.cn/#/login")
# 隐士等待,直到页面出来之后,就过,元素一直没出来就等;只要元素出来立刻加载,没出来等5秒,一般用于获取地址的后面,等待页面加载完
driver.implicitly_wait(5)

强制等待:

# 强制等待:不管出没出来,就强制等待
time.sleep(5)

3、断言流程

assertObject = driver.find_element(By.CSS_SELECTOR, '#app > section > aside > div > ul > div > span')
if assertObject and assertObject.text == '流马测试平台':
    print("测试通过")
else:
    print("测试不通过")

4、业务流程

frame标签需要切换
在这里插入图片描述
有的需要键盘输入,应用场景是选择日期后,回车后弹框消失,进入下一输入框
在这里插入图片描述
显示等待,等待10秒,直到找到一个元素(场景应用:一般是定位弹框中显示的字)
在这里插入图片描述

5、参数化

在这里插入图片描述
在这里插入图片描述
另一例子代码

# _*_ coding : utf-8 _*_
# @Time : 2023/4/5 10:51 PM
# @Author : yanhh
# @File : test_case_04
# @Project : pydemo1
from selenium import webdriver
import time

from selenium.webdriver.common.by import By

# 2、通过driver打开对应的浏览器
driver = webdriver.Chrome()
# 3、传入对应url地址
driver.get("http://demo.liumatest.cn/#/login")
# 隐士等待,直到页面出来之后,就过,元素一直没出来就等;只要元素出来立刻加载,没出来等5秒,一般用于获取地址的后面,等待页面加载完
driver.implicitly_wait(5)
username, password = 'admin', '123456'
driver.find_element(By.ID, 'username').send_keys(username)
driver.find_element(By.ID, 'password').send_keys(password)
driver.find_element(By.ID, 'login').click()
# 强制等待:不管出没出来,就强制等待
time.sleep(2)
print("#############################测试用例1###############################################")
params = {
    "id": "10240"
}
driver.find_element(By.XPATH, '//*[@id="app"]/section/aside/div/ul/div/img').click()
time.sleep(1)
driver.find_element(By.XPATH, '//*[@id="app"]/section/aside/div/ul/li[3]/div/span').click()
time.sleep(1)
driver.find_element(By.XPATH, '//*[@id="app"]/section/aside/div/ul/li[3]/ul/li/ul/li[4]/span').click()
time.sleep(1)
driver.find_element(By.XPATH, '//*[@id="app"]/section/section/main/div/form/div[1]/div/div/input').click()
driver.find_element(By.XPATH, '//*[@id="app"]/section/section/main/div/form/div[1]/div/div/input').send_keys(
    params['id'])
time.sleep(1)
driver.find_element(By.XPATH, '//*[@id="app"]/section/section/main/div/form/div[3]/div/button[1]/span').click()
time.sleep(2)
driver.quit()

6、流程封装

# _*_ coding : utf-8 _*_
# @Time : 2023/4/5 10:51 PM
# @Author : yanhh
# @File : test_case_04
# @Project : pydemo1
from selenium import webdriver
import time

from selenium.webdriver.common.by import By

# 2、通过driver打开对应的浏览器
driver = webdriver.Chrome()
# 3、传入对应url地址
driver.get("http://demo.liumatest.cn/#/login")
# 隐士等待,直到页面出来之后,就过,元素一直没出来就等;只要元素出来立刻加载,没出来等5秒,一般用于获取地址的后面,等待页面加载完
driver.implicitly_wait(5)
username, password = 'admin', '123456'
driver.find_element(By.ID, 'username').send_keys(username)
driver.find_element(By.ID, 'password').send_keys(password)
driver.find_element(By.ID, 'login').click()
# 强制等待:不管出没出来,就强制等待
time.sleep(2)
print("#############################测试用例1###############################################")


# 入口封装用例中心
def gotoPage():
    # 点击图标
    driver.find_element(By.XPATH, '//*[@id="app"]/section/aside/div/ul/div/img').click()
    time.sleep(1)
    # 点击用例中心
    driver.find_element(By.XPATH, '//*[@id="app"]/section/aside/div/ul/li[3]/div/span').click()
    time.sleep(1)
    # 点击用例管理
    driver.find_element(By.XPATH, '//*[@id="app"]/section/aside/div/ul/li[3]/ul/li/ul/li[4]/span').click()
    time.sleep(1)


def todoSelect():
    # 点击输入框
    driver.find_element(By.XPATH, '//*[@id="app"]/section/section/main/div/form/div[1]/div/div/input').click()
    # 输入编码id
    driver.find_element(By.XPATH, '//*[@id="app"]/section/section/main/div/form/div[1]/div/div/input').send_keys(
        params['id'])
    time.sleep(1)
    # 点击搜索
    driver.find_element(By.XPATH, '//*[@id="app"]/section/section/main/div/form/div[3]/div/button[1]/span').click()
    time.sleep(2)


def assertObjct():
    element = driver.find_element(By.XPATH,
                                  '//*[@id="app"]/section/section/main/div/div[2]/div[1]/div[3]/table/tbody/tr/td[2]/div/button/span/a')
    assertText = element.text
    if assertText == '验证登录模块':
        print('测试通过')
    else:
        print('测试失败')


# 1、正常登录
params = {
    "id": "10240"
}
# 2、打开菜单
gotoPage()
# 3、查询操作
todoSelect()
# 4、断言封装
assertObjct()
# 5、刷新
driver.refresh()

# 6、关闭
driver.quit()

新版本api去除警告
在这里插入图片描述

7、用例优化

1)控件参数 单选按钮radio

定义了一个列表
在这里插入图片描述
1、type_list.index() 返回的是索引号,赋值给%d(这里代表数字变量)
2、params[‘type’]是根据json数据取的值
在这里插入图片描述

2)日期控件 当前日期格式化

在这里插入图片描述

8、整合unittest

# _*_ coding : utf-8 _*_
# @Time : 2023/4/6 12:59 PM
# @Author : yanhh
# @File : test_case_06
# @Project : pydemo1
import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By


class LoginTestCase(unittest.TestCase):
    # 打开浏览器
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.get('http://demo.liumatest.cn/#/login')

    # 关闭浏览器
    def tearDown(self) -> None:
        self.driver.close()

    # 元素定位及传参
    def do_input(self, username=None, password=None):
        if username:
            self.driver.find_element(By.ID, 'username').send_keys(username)
        if password:
            self.driver.find_element(By.ID, 'password').send_keys(password)

    ###################################登录场景测试用例###############################################################
    # 用例1、用户名、密码正确
    def test_1_normal(self):
        username, password = 'admin', '123456'
        self.do_input(username=username, password=password)
        self.driver.find_element(By.ID, 'login').click()
        page_title = self.driver.title
        self.assertEqual(page_title, '流马测试平台')
        time.sleep(2)

    # 用例2、用户名错误、密码正确
    def test_2_no_bad_user(self):
        username, password = 'admin2', '123456'
        self.do_input(username=username, password=password)
        self.driver.find_element(By.ID, 'login').click()
        time.sleep(2)
        # 拿到弹出框,文案显示
        remsg = self.driver.find_element(By.XPATH, "/html/body/div[@role='alert']/p").text
        self.assertEqual('登录失败 用户不存在', remsg)
        time.sleep(2)

    # 用例3、用户名正确、密码错误
    def test_3_no_bad_password(self):
        username, password = 'admin', '1234567'
        self.do_input(username=username, password=password)
        self.driver.find_element(By.ID, 'login').click()
        time.sleep(2)
        # 拿到弹出框,文案显示
        remsg = self.driver.find_element(By.XPATH, "/html/body/div[@role='alert']/p").text
        self.assertEqual('登录失败 账户密码校验失败', remsg)
        time.sleep(2)

    # 用例4、不输入用户名
    def test_4_not_user(self):
        username, password = '', '1234567'
        self.do_input(username=username, password=password)
        self.driver.find_element(By.ID, 'login').click()
        time.sleep(2)
        # 拿到弹出框,文案显示
        remsg = self.driver.find_element(By.XPATH, "//*[@id='app']/div/form/div[1]/div/div[2]").text
        self.assertEqual('账号不能为空', remsg)
        time.sleep(2)

    # 用例5、不输入密码
    def test_5_not_password(self):
        username, password = 'admin', ''
        self.do_input(username=username, password=password)
        self.driver.find_element(By.ID, 'login').click()
        time.sleep(2)
        # 拿到弹出框,文案显示
        remsg = self.driver.find_element(By.XPATH, "//*[@id='app']/div/form/div[2]/div/div[2]").text
        self.assertEqual('密码不能为空', remsg)
        time.sleep(2)


if __name__ == '__main__':
    unittest.main(verbosity=2)

清理数据
在这里插入图片描述

import pymysql

在这里插入图片描述
连接数据库,并查询最大序号
最新加载中
在这里插入图片描述
最后加载
清理测试数据
在这里插入图片描述

9、beautiful报告生成

# _*_ coding : utf-8 _*_
# @Time : 2023/4/6 11:00 PM
# @Author : yanhh
# @File : main1
# @Project : pydemo1
from test_case_06 import LoginTestCase
import unittest
import os
from BeautifulReport import BeautifulReport
#多个用例
testcase = [LoginTestCase('test_1_normal'),LoginTestCase('test_2_no_bad_user')]

loader = unittest.TestLoader()
alltests = unittest.TestSuite()
alltests.addTests(testcase)

br = BeautifulReport(alltests)
br.report(description='测试报告', filename='bReport.html', report_dir=os.getcwd())

结果
在这里插入图片描述

10、devOps持续集成、持续交付、持续部署

在这里插入图片描述
create job
在这里插入图片描述
freestyle
1)、 project->genernal-描述 自动化测试

2)、源码管理
a、无: 在本地
b、管理:git地址及密码

3)、构建
mac选择: excute shell

cd /Users/yingyan/PycharmProjects/pydemo1
python main1.py

4)、点击保存

jenkins需要安装python插件
1、manage jenkins ->manage plugins->可选插件(python)->install with start
2、built schudule
在这里插入图片描述
定时运行
构建触发器->jenkins cron 格式
在这里插入图片描述
Jenkins定时构建采用cron语法。

demo举例:

# 每1分钟
*/1 * * * *
# 每5分钟
H/5 * * * *
# 每30分钟
H/30 * * * *
# 每1小时
H */1 * * *
# 每2小时
H */2 * * *
# 每天早上8点
0 8 * * *
# 每天中午11点30
30 11 * * *
# 每天中午12点
0 12 * * *
# 每天下午18点30
30 18 * * *
# 每天晚上11点45
45 23 * * *
# 每天晚上12点(凌晨0点)
0 0 * * *
 

在Jenkins job配置中填写cron语法后,点击Apply按钮来测试语法是否正确。

也可以到 https://crontab.guru 网站来测试。

常见cron语法例子:

https://crontab.guru/examples.html

邮件通知
manage jenkins->configure System->邮件通知
1、smtp服务器
在这里插入图片描述
密码设置
1、qq设置->开启服务->发送短信->得到授权码->写到jenkins的密码中
在这里插入图片描述
2、勾选ssl协议
3、通过发送测试邮件配置->test configuration
4、应用->保存

构建后操作
jenkins->右键项目中选择配置->构建后操作选择email- notification
在这里插入图片描述

高级->默认触发器 default Triger
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值