一、自动化测试用例

二、代码实现

1.公用文件Utils.py

import datetime
import os
import sys
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

class Driver:
    driver = ""
    def __init__(self):
        options = webdriver.ChromeOptions()
        self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)
        self.driver.implicitly_wait(2)

    def getScreenShot(self):
        # 文件时间
        dirname = datetime.datetime.now().strftime("%Y-%m-%d")
        #如果文件夹不存在就创建文件夹
        if not os.path.exists("../images/"+dirname):
            os.makedirs("../images/"+dirname)
        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)
Survey = Driver()

2.登陆页面测试

import time

from selenium.webdriver.common.by import By

from Common.Utils import Survey
class SurveyLogin:
    url = ""
    driver = None
    def __init__(self):
        self.url = "http://49.235.61.184:8080"
        self.driver = Survey.driver
        self.driver.get(self.url)
    #正确的账号和密码:成功登录
    def LoginSucTest(self):
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zmz")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div")

        Survey.getScreenShot()
        self.driver.back()
        time.sleep(3)
    #错误的账号和错误的密码:登陆失败
    def LoginEEFailTest(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("error")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()

        actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
        Survey.getScreenShot()
        assert actual == "错误的用户名和密码"
    #正确的账号和错误的密码:登录失败
    def LoginREFailTest(self):
        #清理输入框中的内容
        time.sleep(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("zmz")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")

        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()

        actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
        Survey.getScreenShot()
        assert actual == "错误的用户名和密码"

Login = SurveyLogin()

3.注册

import os
import time

from selenium.webdriver.common.by import By

from Common.Utils import Survey

class SurveyRegister:
    url=""
    driver=""
    counter_file="counter.txt"
    def __init__(self):
        self.url = "http://49.235.61.184:8080"
        self.driver = Survey.driver
        self.driver.get(self.url)
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div:nth-child(4) > a").click()
        self.counter = self._load_counter()

    def _load_counter(self):
        if os.path.exists(self.counter_file):
            with open(self.counter_file, "r") as f:
                return int(f.read().strip())
        else:
            return 1

    def _save_counter(self):
        with open(self.counter_file, "w") as f:
            f.write(str(self.counter))
    # 输入未注册过的账号和符合要求的密码:注册成功
    def RegisterSucTest(self):
        # 确保每次的用户名都不一样
        username = f"zmz{self.counter}"
        time.sleep(1)
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zmz")
        time.sleep(1)
        self.driver.find_element(By.CSS_SELECTOR, '#username').send_keys(username)
        time.sleep(1)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        time.sleep(1)
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")
        time.sleep(1)
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()

        #对刚才的账号进行登录
        time.sleep(1)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(username)
        time.sleep(1)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
        time.sleep(2)
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-panel-exam > div > div > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr > td > div > div.ant-empty-description")
        Survey.getScreenShot()

        self.counter += 1
        self._save_counter()

    # 用已经注册过的账号注册
    def RegisterErrByRegstered(self):
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zmz")
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zmz")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()

        actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div.ant-alert.ant-alert-error > div > div").text
        assert actual == "账号已存在"

    # 确认密码与密码不一致点击注册
    def RegisterErrByrePassworddiff(self):
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zmz")
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zmz")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("1234567")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()

        actual = self.driver.find_element(By.CSS_SELECTOR, "#rePassword_help > div").text
        assert actual == "两次密码不一致!"

4.首页

from selenium.webdriver.common.by import By

from Common.Utils import Survey
class SurveyHome:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://49.235.61.184:8080"
        self.driver = Survey.driver
        self.driver.get(self.url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zmz")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
    #测试首页信息
    def HomeInfoTest(self):
        #姓名
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span:nth-child(2)")
        #头像
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost.ant-page-header-compact > div.ant-page-header-content > div > div > div > div > div > div.avatar___3ZBop > span > img")
        #首页
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost.ant-page-header-compact > div.ant-page-header-heading > div > span")
        #提示词
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost.ant-page-header-compact > div.ant-page-header-content > div > div > div > div > div > div.content___1eLtZ > div.contentTitle___Yu-cR")
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-1-tab-exam")
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-1-tab-surveyHistory")
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-1-tab-survey")
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-1-tab-examHistory")

    def HomeCreateTest(self):
        self.driver.find_element(By.CSS_SELECTOR, '#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(1)')
        self.driver.back()
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)")

5.编辑页

from selenium.webdriver.common.by import By

from Common.Utils import Survey
class SurveyHome:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://49.235.61.184:8080"
        self.driver = Survey.driver
        self.driver.get(self.url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zmz")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
    #测试首页信息
    def HomeInfoTest(self):
        #姓名
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span:nth-child(2)")
        #头像
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost.ant-page-header-compact > div.ant-page-header-content > div > div > div > div > div > div.avatar___3ZBop > span > img")
        #首页
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost.ant-page-header-compact > div.ant-page-header-heading > div > span")
        #提示词
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost.ant-page-header-compact > div.ant-page-header-content > div > div > div > div > div > div.content___1eLtZ > div.contentTitle___Yu-cR")
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-1-tab-exam")
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-1-tab-surveyHistory")
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-1-tab-survey")
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-1-tab-examHistory")

    def HomeCreateTest(self):
        self.driver.find_element(By.CSS_SELECTOR, '#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(1)')
        self.driver.back()
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)")

6.详情页

from selenium.webdriver.common.by import By

from Common.Utils import Survey


class SurveyDetail:
    url = ""
    driver = ""

    def __init__(self):
        self.url = "http://49.235.61.184:8080"
        self.driver = Survey.driver
        self.driver.get(self.url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zmz")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li.ant-menu-item.ant-menu-item-selected.ant-menu-item-only-child.ant-pro-base-menu-menu-item > span > div > span.ant-pro-base-menu-item-text.ant-pro-base-menu-item-text-has-icon").click()
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-list.ant-list-split.ant-list-grid.survey-home-content > div > div > div > div > div > div > div > div > div > div.card-header > span.survey-title").click()


    def get_current_survey_status(self):
        text = self.driver.find_element(By.XPATH, "/ html / body / div[4] / div / div / div / div / div / span[2]").text
        if text == "问卷已开启":
            return "开启"
        elif text == "问卷已停止":
            return "停止"
        else:
            Exception(f"未知状态: '{text}'")
    #开启问卷回答问卷提交问卷
    def DetailSucTest(self):
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()
        tmp = self.get_current_survey_status()
        if tmp != "开启":
            self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()

        #打开问卷
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(1) > span.ant-input-group-wrapper.ant-input-search.ant-input-search-with-button.open-target > span > span > button > span").click()
        # 转到新的窗口
        curHandle = self.driver.current_window_handle#当前页面
        allHandle = self.driver.window_handles
        for handle in allHandle:
            if handle != curHandle:
                self.driver.switch_to_window(handle)#切换到问卷窗口
        #回答问卷
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div > div > div.survey-antd-body > div:nth-child(1) > section > div.survey-antd-body-question-body > div > div > div > div:nth-child(1) > label > span.ant-radio > input").click()
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div > div > div.survey-antd-body > div:nth-child(2) > section > div.survey-antd-body-question-body > div > div > div > div:nth-child(3) > label > span.ant-radio > input").click()
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div > div > div.survey-antd-body > div:nth-child(3) > section > div.survey-antd-body-question-body > div > div > div > div:nth-child(3) > label > span.ant-radio > input").click()
        #提交
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div > div > div.survey-antd-footer > div.survey-antd-footer-pagination > div > button > div").click()
        #结果
        actual = self.driver.find_element(By.CSS_SELECTOR, "#result-message").text
        assert actual == "问卷到此结束,感谢您的参与!"
        self.driver.switch_to_window(curHandle)

        #开启调查问卷直接提交
    def DetailSubTest(self):
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()
        tmp = self.get_current_survey_status()
        if tmp != "开启":
            self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()
        # 打开问卷
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(1) > span.ant-input-group-wrapper.ant-input-search.ant-input-search-with-button.open-target > span > span > button > span").click()
        # 转到新的窗口
        curHandle = self.driver.current_window_handle  # 当前页面
        allHandle = self.driver.window_handles
        for handle in allHandle:
            if handle != curHandle:
                self.driver.switch_to.window(handle)  # 切换到问卷窗口
        # 提交
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div > div > div.survey-antd-footer > div.survey-antd-footer-pagination > div > button > div").click()
        actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div > div > div.survey-antd-body > div.ant-form-item-has-error > section > div.survey-antd-body-question-head > span > h2 > span.question-tag.error.animated > span").text
        assert actual == "这道题未回答"

    #关闭问卷访问链接
    def DetailCloseTest(self):
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()
        tmp = self.get_current_survey_status()
        if tmp != "停止":
            self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(1) > span.ant-input-group-wrapper.ant-input-search.ant-input-search-with-button.open-target > span > span > button > span").click()
        curHandle = self.driver.current_window_handle
        allHandle = self.driver.window_handles
        for handle in allHandle:
            if handle != curHandle:
                self.driver.switch_to_window(handle)
        actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div > div > h2").text
        assert actual == "问卷已暂停回收"
        self.driver.switch_to.window(curHandle)


更多推荐