自动化测试博客网页

发布于:2024-10-16 ⋅ 阅读:(123) ⋅ 点赞:(0)

编写自动化测试用例

        根据博客网页的基本功能分析并编写测试用例。

根据测试用例编写自动化测试脚本

        新建项目

        查看相应的库是否包含 settings->python:[项目]

        分析封装自动化测试文件整体框架。

Utils

       存放测试时需要的前提和公共部分 比如:浏览器驱动对象、屏幕截图,这里用Edge的驱动来对网站进行测试。

创建驱动

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from webdriver_manager.microsoft import EdgeChromiumDriverManager


class Driver:
    #类成员driver
    driver=""
    def __init__(self):
        #创建edge配置给driver,这里用基础默认的即可
        options = webdriver.EdgeOptions()
        #service:表示要选择的浏览器服务,这里用edge的,所以传参用Edge的驱动
        self.driver=webdriver.Edge(service = Service(EdgeChromiumDriverManager().install()),options=options)
        self.driver.implicitly_wait(2)

        由于我们想要实现:所有的其他测试文件里,都只用一个驱动对象来测试,而不创建多个驱动对象(节约空间,方便管理),所以就考虑使用单例模式。

        单例模式特点:只有一个对象。所以我们可以创建一个全局变量,后面在其他测试文件中只使用这个全局变量。由于我们会在不同的测试页面进行截图观察,所以需要将屏幕截图的配置在公共区域配置好。

#用上面的Driver类对象创建一个全局变量,让所有的测试都只用这一个驱动对象
BLogDriver=Driver()

  创建屏幕截图方法

        对于图片文件,我们再开一个文件夹用于存放图片images,里面再通过每天的日期来分类图片,每个图片的名字为时间+调用截图的方法名。

        创建images文件夹

        创建文件夹名称为:当日时间,年-月-日(如果文件夹已经存在,则不创建)

        创建截图图片名称:调用方法-年-月-日-具体时间

        整体代码如下:

#屏幕截图方法
    def getScreenShoot(self):
        #文件夹名程:年-月-日
        dirname = datetime.datetime.now().strftime("%Y-%m-%d")
        #判断是否存在该文件夹,没有则新建文件夹
        if not os.path.exists("../images/"+dirname):
            os.mkdir("../images/"+dirname)
        #文件名称:调用方法+年-月-日-时间
        #sys._getframe().f_back.f_code.co_name  获取调用方法名
        filename=sys._getframe().f_back.f_code.co_name+datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
        self.driver.save_screenshot("../images/"+dirname+"/"+filename)

        注意:在我们输入错误密码或者错误账号等情况时,会出现弹框,在弹框被点击消失前,上述代码是不能实现截图的。

BlogLoginText 博客登录界面测试

初始化driver和url

from common.Utils import BLogDriver

#初始化URL和driver
class BlogLogin:
    url=""
    driver=""
    def __init__(self):
        self.url=" http://8.137.19.140:9090/blog_list.html"
        self.driver=BLogDriver.driver
        self.driver.get(self.url)

成功登录

        输入正确的账号和密码,点击登入。登入后通过用户名是否存在来判断是否成功登录。需要先清除账号和密码输入框。

        判断网页界面是否有用户名时,有时候会因为程序运行过快,网页未加载完毕,从而导致搜索不到元素,所以加强制等待。测试后发现可以成功运行。

        强制等待太浪费时间,修改为显示等待

        显示等待需要包含头文件

        显示等待代码 :

        整体代码为:

#成功登入
    def LoginSuccess(self):
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")
        self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
        #如果成功登录,则可以找到用户名,不会报错。这里因为程序运行太快,会因为找不到元素而报错
        # time.sleep(2)
        # self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
        #改为显示等待来找元素(要包含库),使用visibility_of_element_located要多加一个括号
        WebDriverWait(self.driver,3).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"body > div.container > div.left > div > h3")))
        #登录成功后返回,继续测试登录失败

失败登录

        测试失败登录之前,需要将前面成功登录返回,然后清空输入框内容

        因为连续、多次send_keys会在输入框拼接内容,而不是覆盖,所以也需要先clear清除输入框内容。

测试正确账号错误密码

#正确的账号,错误密码
    def LoginLoss_1(self):
        #先清空输入框内容,再重新输入
        self.driver.implicitly_wait(2)
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")
        self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("12345")
        self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
        #判断密码错误弹窗是否出现,需要先等待一下,让网页加载
        time.sleep(0.5)
        alert=self.driver.switch_to.alert   #获取弹窗
        text=alert.text
        assert text == "密码错误"
        alert.accept()

测试错误账号正确密码

    #错误的账号,正确密码
    def LoginLoss_2(self):
        #先清空输入框内容,再重新输入
        self.driver.implicitly_wait(2)
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsa")
        self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
        #判断用户名不存在弹窗是否出现,需要先等待一下,让网页加载
        time.sleep(0.5)
        alert=self.driver.switch_to.alert   #获取弹窗
        text=alert.text
        assert text == "用户不存在"
        alert.accept()

测试不输入密码

    #正确账号,不输入密码
    def LoginLoss_3(self):
        #先清空输入框内容,再重新输入
        time.sleep(0.5)
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")
        self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
        #判断用户名不存在弹窗是否出现,需要先等待一下,让网页加载
        time.sleep(1)
        alert=self.driver.switch_to.alert   #获取弹窗
        text=alert.text
        assert text == "账号或密码不能为空"
        alert.accept()
        BLogDriver.getScreenShoot()

 BlogLIstTest 博客首页测试

        在博客首页中,只去查找元素是否存在,这里需要添加隐式等待,要不然程序运行过快会导致查找不到元素而误报。

from selenium.webdriver.common.by import By

from common.Utils import BLogDriver

class BlogList:
    url=""
    driver=""
    def __init__(self):
        self.url="http://8.137.19.140:9090/blog_list.html"
        self.driver= BLogDriver.driver
        self.driver.get(self.url)
    #成功登录后测试博客主页
    def BlogListTestSuc(self):
        self.driver.implicitly_wait(2)  #添加隐式等待
        #查找博客标题
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")
        #查找博客时间
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.date")
        #查找博客大纲
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.desc")
        #查找博客查看按钮
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a")
        #查找个人信息(用户名)
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
        BLogDriver.getScreenShoot()

后续的测试都在RunTest中进行测试

BlogDetailTest 博客详情页测试

from selenium.webdriver.common.by import By

from common.Utils import BLogDriver

class BlogDetail:
    url=""
    driver=""
    def __init__(self):
        self.url="http://8.137.19.140:9090/blog_detail.html?blogId=3998"
        self.driver=BLogDriver.driver
        self.driver.get(self.url)
    #测试博客详情页
    def DetailTestSuc(self):
        self.driver.implicitly_wait(2)
        #查找标题
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.title")
        #查找时间
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.date")
        #查找大纲
        self.driver.find_element(By.CSS_SELECTOR,"#h2-u5728u8FD9u91CCu5199u4E0Bu4E00u7BC7u535Au5BA2")
        #查找具体内容
        self.driver.find_element(By.CSS_SELECTOR,"#detail > p")
        #查找具体用户名
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
        BLogDriver.getScreenShoot()

BlogEditTest 博客编辑页测试

        在博客编辑页面,内容部分是由一个markdown文本编辑器插件实现的,我们无法在自动化测试时去添加/修改内容。但是菜单栏是可点击的,我们可以尝试在自动化测试时去点击,但有可能菜单栏的元素无法被定位。

        成功发布博客:输入标题,点击菜单栏按钮,然后点击发布。

from selenium.webdriver.common.by import By

from common.Utils import BLogDriver


class BlogEdit:
    url=""
    driver=""
    def __init__(self):
        self.url="http://8.137.19.140:9090/blog_edit.html"
        self.driver=BLogDriver.driver
        self.driver.get(self.url)
    def EditTestSuc(self):
        self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("博客自动化测试")
        self.driver.find_element(By.CSS_SELECTOR,"#editor > div.editormd-toolbar > div > ul > li:nth-child(21) > a").click()
        BLogDriver.getScreenShoot()
        self.driver.find_element(By.CSS_SELECTOR,"#submit").click()

RunTest

from common.Utils import BLogDriver
from test import BLogLoginTest
from test import BlogListTest
from test import BlogDetailTest
from test import BlogEditTest


if __name__ == "__main__":
    #测试登录界面
    BLogLoginTest.BlogLogin().LoginLoss_1()
    BLogLoginTest.BlogLogin().LoginLoss_2()
    BLogLoginTest.BlogLogin().LoginLoss_3()
    BLogLoginTest.BlogLogin().LoginSuccess()
    #测试博客首页
    BlogListTest.BlogList().BlogListTestSuc()
    #测试博客详情页
    BlogDetailTest.BlogDetail().DetailTestSuc()
    #测试博客编辑页面
    BlogEditTest.BlogEdit().EditTestSuc()
    BLogDriver.driver.quit()