【软件测试】使用selenium工具对Web聊天室项目进行UI自动化测试

简介: 在用户注册页面,用户输入用户名,密码,昵称,图像文件(可以不上传)即可完成注册,但是如果昵称或者用户名被注册过了,就会显示账号或昵称已经存在

用户注册功能

在用户注册页面,用户输入用户名,密码,昵称,图像文件(可以不上传)即可完成注册,但是如果昵称或者用户名被注册过了,就会显示账号或昵称已经存在


使用数据驱动DDT让测试数据来驱动测试用例代码执行,使用测试套件把注册成功和注册失败的测试用例组织到一起进行一个整体的测试,对注册失败的测试用例进行错误捕捉并保存异常截图,最后通过HTMLTestRunner生成HTML测试报告


注册成功

注册成功的测试用例

[
  {
    "username": "12345",
    "password": "12345",
    "nickname": "孙悟空",
    "head": "D:\\photo\\18.jpg"
  },
  {
    "username": "23456",
    "password": "23456",
    "nickname": "猪八戒",
    "head": ""
  },
  {
    "username": "34567",
    "password": "34567",
    "nickname": "唐三藏",
    "head": "D:\\photo\\18.jpg"
  },
  {
    "username": "45678",
    "password": "45678",
    "nickname": "沙和尚",
    "head": "D:\\photo\\16.jpg"
  },
  {
    "username": "abcde",
    "password": "abcde",
    "nickname": "黑旋风",
    "head": "D:\\photo\\18.jpg"
  },
  {
    "username": "bcdef",
    "password": "bcdef",
    "nickname": "豹子头",
    "head": ""
  },
  {
    "username": "cdefg",
    "password": "cdefg",
    "nickname": "行者",
    "head": "D:\\photo\\18.jpg"
  }
]


注册成功的自动化测试脚本

from selenium import webdriver
import time
import unittest
from ddt@ddt
class RegisterTestOk(unittest.TestCase):
    # 测试固件
    def setUp(self):
        # 获取谷歌浏览器驱动
        self.driver = webdriver.Chrome()
        # Web聊天室链接
        self.url = "http://82.157.7.147:8080/chatroom/"
        # 浏览器最大化
        self.driver.maximize_window()
        time.sleep(3)
    def tearDown(self):
        # 关闭浏览器,清除缓存
        self.driver.quit()
    # 测试用例
    @file_data('./registerOkData.json') 
    def test_RegisterOk(self, username, password, nickname, head):
        driver = self.driver
        url = self.url
        driver.get(url)
        # 点击注册
        driver.find_element_by_link_text("注册").click()
        # 智能等待
        driver.implicitly_wait(3) 
        # 输入注册信息
        driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[3]/input').send_keys(nickname)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').send_keys(head)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[6]/input').click()
        time.sleep(3)
        # 注册成功,关闭登陆成功弹窗
        driver.switch_to.alert.accept()
        time.sleep(3)
    if __name__ == '__main__':
        unittest.main() import ddt, unpack, data, file_data


注册失败

注册失败的测试用例

[
  {
    "username": "12345",
    "password": "12345",
    "nickname": "孙孙孙",
    "head": "D:\\photo\\18.jpg"
  },
  {
    "username": "22222",
    "password": "23456",
    "nickname": "猪八戒",
    "head": "D:\\photo\\16.jpg"
  },
  {
    "username": "34567",
    "password": "34567",
    "nickname": "唐唐唐",
    "head": "D:\\photo\\18.jpg"
  },
  {
    "username": "45678",
    "password": "45678",
    "nickname": "沙沙沙",
    "head": ""
  },
  {
    "username": "ccccc",
    "password": "abcde",
    "nickname": "黑旋风",
    "head": "D:\\photo\\18.jpg"
  },
  {
    "username": "bcdef",
    "password": "bcdef",
    "nickname": "豹子子",
    "head": ""
  },
  {
    "username": "eeeee",
    "password": "cdefg",
    "nickname": "行者",
    "head": "D:\\photo\\16.jpg"
  }
]


注册失败的自动化脚本

from selenium import webdriver
import time
import unittest
import os
from ddt import ddt, unpack, data, file_data
@ddt
class RegisterTestFalse(unittest.TestCase):
    # 测试固件
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.url = "http://82.157.7.147:8080/chatroom/"
        self.driver.maximize_window()
        time.sleep(3)
    def tearDown(self):
        self.driver.quit()
    # 保存异常截图
    def saveScreenAsPhoto(self, driver, file_name):
        if not os.path.exists("./image"):
            os.makedirs("./image")
        now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
        driver.get_screenshot_as_file("./image/"+now+"-"+file_name)
        time.sleep(2)
    # 测试用例
    @file_data('./registerFalseData.json')
    def test_RegisterFalse(self, username, password, nickname, head):
        driver = self.driver
        url = self.url
        driver.get(url)
        driver.find_element_by_link_text("注册").click()
        driver.implicitly_wait(3)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[3]/input').send_keys(nickname)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').send_keys(head)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[6]/input').click()
        time.sleep(3)
        errorMessage = driver.find_element_by_xpath('//*[@id="app"]/form/div[5]').text
        # 异常捕捉并保存错误截图
        try:
            self.assertFalse(errorMessage, msg="账号或密码已经存在")
        except:
            self.saveScreenAsPhoto(driver, 'false.png')
        time.sleep(3)
    if __name__ == '__main__':
        unittest.main()


测试套件

使用测试套件组织测试用例一起执行,并生成HTML测试报告

import HTMLTestRunner
import os
import sys
import time
import unittest
from register_test import register_ok
from register_test import register_false
def createSuite():
    suit1 = unittest.TestLoader().loadTestsFromTestCase(register_ok.RegisterTestOk)
    suit2 = unittest.TestLoader().loadTestsFromTestCase(register_false.RegisterTestFalse)
    suit = unittest.TestSuite([suit1, suit2])
    return suit
if __name__ == '__main__':
    curpath = sys.path[0]
    if not os.path.exists(curpath + '/registerReport'):
        os.makedirs(curpath + '/registerReport')
    now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
    fileName = curpath + '/registerReport/' + now + 'registerReport.html'
    with open(fileName, 'wb') as fp:
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告", description=u"用例执行情况", verbosity=2)
        suit = createSuite()
        runner.run(suit)


HTML测试报告

因为对异常进行捕捉,并保存错误截图,所以注册失败的测试用例也是测试成功的

微信图片_20221030180729.png

异常截图

微信图片_20221030180747.png


用户登陆注册功能

在用户登陆页面,用户输入用户名,密码即可完成登陆,但是如果输入的用户名无效就会提示账号不存在,如果用户名正确但是密码输入错误就会提示密码错误


使用数据驱动DDT让测试数据来驱动测试用例代码执行,使用测试套件把登陆成功和登陆失败的测试用例组织到一起进行一个整体的测试,对登陆失败的测试用例进行错误捕捉并保存异常截图,最后通过HTMLTestRunner生成HTML测试报告


登陆成功

登陆成功测试用例

[
  {
    "username": "abc",
    "password": "123"
  },
  {
    "username": "12345",
    "password": "12345"
  },
  {
    "username": "23456",
    "password": "23456"
  },
  {
    "username": "34567",
    "password": "34567"
  },
  {
    "username": "abcde",
    "password": "abcde"
  }
]


登陆成功自动化测试脚本

from selenium import webdriver
import time
import unittest
from ddt import ddt, unpack, data, file_data
@ddt
class LoginTestOk(unittest.TestCase):
    def setUp(self):
        # 获取谷歌浏览器驱动
        self.driver = webdriver.Chrome()
        # Web聊天室链接
        self.url = "http://82.157.7.147:8080/chatroom/"
        # 浏览器最大化
        self.driver.maximize_window()
        time.sleep(3)
    def tearDown(self):
        # 关闭浏览器,清除缓存
        self.driver.quit()
    @file_data('./loginOkData.json')
    def test_LoginOk(self, username, password):
        driver = self.driver
        url = self.url
        driver.get(url)
        time.sleep(3)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').click()
        time.sleep(3)
        driver.switch_to.alert.accept()
        time.sleep(3)
    if __name__ == '__main__':
        unittest.main()


账号不存在,登陆失败

账号不存在,登陆失败的测试用例

[
  {
    "username": "aaa",
    "password": "123"
  },
  {
    "username": "bbbbb",
    "password": "12345"
  },
  {
    "username": "65436",
    "password": "23456"
  },
  {
    "username": "daa32",
    "password": "34567"
  },
  {
    "username": "dd225",
    "password": "abcde"
  }
]


账号不存在,登陆失败的自动化测试脚本

import os
import time
import unittest
from ddt import ddt, file_data
from selenium import webdriver
@ddt
class LoginTestFalseNone(unittest.TestCase):
    def setUp(self):
        # 获取谷歌浏览器驱动
        self.driver = webdriver.Chrome()
        # Web聊天室链接
        self.url = "http://82.157.7.147:8080/chatroom/"
        # 浏览器最大化
        self.driver.maximize_window()
        time.sleep(3)
    def tearDown(self):
        # 关闭浏览器,清除缓存
        self.driver.quit()
    # 保存异常截图
    def saveScreenAsPhoto(self, driver, file_name):
        if not os.path.exists("./image"):
            os.makedirs("./image")
        now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
        driver.get_screenshot_as_file("./image/" + now + "-" + file_name)
        time.sleep(2)
    @file_data('./loginFalseNone.json')
    def test_LoginOk(self, username, password):
        driver = self.driver
        url = self.url
        driver.get(url)
        time.sleep(3)
        # 输入登陆信息,点击登陆
        driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').click()
        time.sleep(3)
        errorMessage = driver.find_element_by_xpath('//*[@id="app"]/form/div[3]').text
        try:
            self.assertFalse(errorMessage, msg="账号不存在")
        except:
            self.saveScreenAsPhoto(driver, 'false-none.png')
        time.sleep(3)
    if __name__ == '__main__':
        unittest.main()


密码错误,登陆失败

密码错误,登陆失败的测试用例

[
  {
    "username": "abc",
    "password": "12345"
  },
  {
    "username": "12345",
    "password": "23456"
  },
  {
    "username": "23456",
    "password": "34567"
  },
  {
    "username": "34567",
    "password": "45678"
  },
  {
    "username": "abcde",
    "password": "abcdef"
  }
]


密码错误,登陆失败的自动化测试脚本

import os
import time
import unittest
from ddt import ddt, file_data
from selenium import webdriver
@ddt
class LoginTestFalseError(unittest.TestCase):
    def setUp(self):
        # 获取谷歌浏览器驱动
        self.driver = webdriver.Chrome()
        # Web聊天室链接
        self.url = "http://82.157.7.147:8080/chatroom/"
        # 浏览器最大化
        self.driver.maximize_window()
        time.sleep(3)
    def tearDown(self):
        # 关闭浏览器,清除缓存
        self.driver.quit()
    # 保存异常时截图
    def saveScreenAsPhoto(self, driver, file_name):
        if not os.path.exists("./image"):
            os.makedirs("./image")
        now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
        driver.get_screenshot_as_file("./image/" + now + "-" + file_name)
        time.sleep(2)
    @file_data('./loginFalseError.json')
    def test_LoginOk(self, username, password):
        driver = self.driver
        url = self.url
        driver.get(url)
        time.sleep(3)
        # 输入登陆信息,点击登陆
        driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password)
        driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').click()
        time.sleep(3)
        errorMessage = driver.find_element_by_xpath('//*[@id="app"]/form/div[3]').text
        try:
            self.assertFalse(errorMessage, msg="密码错误")
        except:
            self.saveScreenAsPhoto(driver, 'false-error.png')
        time.sleep(3)
    if __name__ == '__main__':
        unittest.main()


测试套件

使用测试套件组织测试用例一起执行,并生成HTML测试报告

from login_test import login_false_none
from login_test import login_false_error
def createSuite():
    # 登陆成功的测试脚本
    suit1 = unittest.TestLoader().loadTestsFromTestCase(login_ok.LoginTestOk)
    # 账号不存在的测试脚本
    suit2 = unittest.TestLoader().loadTestsFromTestCase(login_false_none.LoginTestFalseNone)
    # 密码错误的测试脚本
    suit3 = unittest.TestLoader().loadTestsFromTestCase(login_false_error.LoginTestFalseError)
    suit = unittest.TestSuite([suit1, suit2, suit3])
    return suit
if __name__ == '__main__':
    curpath = sys.path[0]
    if not os.path.exists(curpath + '/loginReport'):
        os.makedirs(curpath + '/loginReport')
    now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
    fileName = curpath + '/loginReport/' + now + 'loginReport.html'
    with open(fileName, 'wb') as fp:
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告", description=u"用例执行情况", verbosity=2)
        suit = createSuite()
        runner.run(suit)


HTML测试报告

因为对异常进行捕捉,并保存错误截图,所以登陆失败的测试用例也是测试成功的

微信图片_20221030181057.png

异常截图

账号不存在,捕捉保存的异常图片

微信图片_20221030180747.png


密码错误,捕捉保存的异常图片

微信图片_20221030181102.png

本次自动化测试的源码地址



相关文章
|
5天前
|
前端开发 机器人 测试技术
【RF案例】Web自动化测试弹窗处理
在进行Web自动化测试时,常会遇到不同类型的弹窗,如ajax、iframe、新窗口及alert/Confirm等。这些弹窗可通过Selenium进行定位与处理。其中,ajax弹窗直接定位处理;iframe需先选中再操作;新窗口类似iframe处理;而alert/Confirm则需特殊方法应对。在Robot Framework中,需先定义并获取窗口后使用特定关键字处理。此外,还有部分div弹窗需在消失前快速定位。希望本文能帮助大家更好地处理各类弹窗。
16 6
【RF案例】Web自动化测试弹窗处理
|
1天前
|
机器学习/深度学习 算法 开发工具
Python Web开发工具
Python Web开发工具
7 3
|
7天前
|
安全 前端开发 JavaScript
Web安全-网页开发者工具
Web安全-网页开发者工具
27 7
|
19天前
|
测试技术
基于LangChain手工测试用例转Web自动化测试生成工具
该方案探索了利用大模型自动生成Web自动化测试用例的方法,替代传统的手动编写或录制方式。通过清晰定义功能测试步骤,结合LangChain的Agent和工具包,实现了从功能测试到自动化测试的转换,极大提升了效率。不仅减少了人工干预,还提高了测试用例的可维护性和实用性。
29 4
|
17天前
|
Web App开发 测试技术 API
自动化测试之美:使用Selenium和Python进行Web应用测试
【8月更文挑战第31天】在软件开发的快节奏世界中,自动化测试如同一束明灯,照亮了质量保证之路。本文将引导你通过Selenium和Python的强大组合,探索如何构建高效的Web应用测试框架。我们不仅会讨论理论,还会深入代码,从一个简单的示例开始,逐步扩展至更复杂的场景。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。让我们一同揭开自动化测试的神秘面纱,体验它的魅力所在。
|
3天前
|
jenkins 测试技术 持续交付
自动化测试的高效之路:如何利用Python进行Web应用测试
【9月更文挑战第13天】在软件开发的快节奏中,自动化测试是确保质量和效率的关键。本文将引导你了解如何使用Python语言及其强大的测试框架来提升Web应用的测试效率。我们将一起探索编写简洁而强大的测试脚本的技巧,以及如何通过持续集成(CI)实现自动化测试流程。准备好让你的测试工作飞一般的感觉!
|
26天前
|
XML JavaScript 测试技术
Web自动化测试框架(基础篇)--HTML页面元素和DOM对象
本文为Web自动化测试入门指南,介绍了HTML页面元素和DOM对象的基础知识,以及如何使用Python中的Selenium WebDriver进行元素定位、操作和等待机制,旨在帮助初学者理解Web自动化测试中的关键概念和操作技巧。
34 1
|
26天前
|
前端开发 测试技术 UED
【测试效率对比】深入分析:为何UI自动化测试的投资回报率通常低于接口自动化测试?
这篇文章深入分析了UI自动化测试与接口自动化测试的投资回报率(ROI)问题,指出UI自动化测试在某些情况下的ROI并不低,反驳了没有实施过UI自动化就轻易下结论的观点,并强调了实践的重要性和自动化测试在项目迭代中的作用。
45 1
|
17天前
|
前端开发 JavaScript 开发者
JSF与WebSockets,打造实时通信魔法!让你的Web应用秒变聊天室,用户体验飞升!
【8月更文挑战第31天】在现代Web应用开发中,实时通信对于提升用户体验至关重要。本文探讨了如何在主要面向Web应用开发的JSF(JavaServer Faces)框架中引入WebSockets支持,以实现客户端与服务器之间的全双工通信。通过具体示例展示了在JSF应用中实现WebSockets的基本步骤:添加依赖、创建服务器端点以及在前端页面中嵌入JavaScript客户端代码。尽管这一过程中可能会遇到一些挑战,如复杂代码编写和额外配置需求,但借助AWS等云服务平台,开发者仍能高效地完成部署和管理工作,从而增强Web应用的实时通信能力。
22 0
|
17天前
|
开发者 前端开发 Apache
Apache Wicket Ajax揭秘:轻松几步,让你的Web应用告别“呆板”,焕发新生!
【8月更文挑战第31天】随着互联网技术的发展,Web应用的交互性成为评价网站成功的关键指标。Apache Wicket作为一款卓越的Java Web框架,不仅具备强大的组件化开发能力,还内置了对Ajax技术的支持,使开发者能轻松提升Web应用的交互体验。通过简单的代码示例展示了如何在不刷新页面的情况下异步更新页面元素,极大提升了用户体验。Wicket提供了多种Ajax组件和行为,如AjaxFallbackLink、AjaxButton等,满足不同场景需求,并支持自定义Ajax行为,帮助开发者实现复杂交互效果。合理运用Wicket的Ajax功能,可显著增强网站竞争力。
26 0

热门文章

最新文章