当前位置:   article > 正文

python+selenium自动化测试

python+selenium自动化测试


前言

一、selenium简介

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

在这里插入图片描述

二、selenium环境搭建

在这里插入图片描述

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

两个位置:

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

2.如果是Pycharm,复制一份到..\python\sitepackages\selenium\webdriver\chrome文件中。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

写一个简单的例子
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

自动化测试环境搭建

1、selenium4定位的新特性locate_with

在这里插入图片描述

2、三种等待

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

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

强制等待:

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

3、断言流程

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

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

新版本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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

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

import pymysql
  • 1

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

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())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结果
在这里插入图片描述

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

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

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

3)、构建
mac选择: excute shell

cd /Users/yingyan/PycharmProjects/pydemo1
python main1.py
  • 1
  • 2

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/1001115
推荐阅读
相关标签
  

闽ICP备14008679号