自动化测试登录后的功能

简介: 在自动化测试的时候,往往许多功能需要登录以后才可以进行操作的,在这里我介绍一种方法,在登录以后将Cookies信息存入本地文件,在测试登录以后操作的时候再从本地文件把信息调出来存入Cookies

在自动化测试的时候,往往许多功能需要登录以后才可以进行操作的,在这里我介绍一种方法,在登录以后将Cookies信息存入本地文件,在测试登录以后操作的时候再从本地文件把信息调出来存入Cookies。

由于在初始化后需要把Cookies信息存入本地文件,建立方法save_cookies(self)

#保存cookies和local storage - 
使用上下文管理器处理文件
def save_cookies(self):
# cookies.pkl存储Cookies信息
    cookies = self.driver.get_cookies()
    with open("cookies.pkl", "wb") as f:
        pickle.dump(cookies, f)
        script = "return JSON.stringify(window.localStorage);"
        # localstorage.pkl存储本地存储库信息
        localStorage = self.excute_js_script(script)
    with open("localstorage.pkl", "wb") as f:
        pickle.dump(localStorage, f)

在测试类中获取本地文件把信息调出来存入Cookies,建立普通方法

# 恢复Cookies和Local Storage
    def load_cookies(self):
         try:
            with open("cookies.pkl", "rb") as f:
                cookies = pickle.load(f)
                for cookie in cookies:
                    self.driver.add_cookie(cookie) 
            with open("localstorage.pkl", "rb") as f:
                localstorage_str = pickle.load(f)
                script = f"""
                (function(storage){
   {
   
                    try {
   {
   
                        const entries = JSON.parse(storage);
                        for (const [key, value] of Object.entries(entries)) {
   {
   
                            window.localStorage.setItem(key, value);
                        }}
                    }} catch(e) {
   {
   
                        console.error('LocalStorage恢复失败:', e);
                    }}
                }})({
   repr(localstorage_str)});
                """
                self.excute_js_script(script)
            # 刷新页面使状态生效
            self.driver.refresh()
         except Exception as e:
            print(f"状态恢复失败: {str(e)}")
            #获取失败,获得截屏页面
            self.driver.save_screenshot("state_restore_failed.png")

接下来我们定义两个公共方法

# 判断元素是否存在,若存在赋给某个变量
def judgeElement(self,way,tag):
    # 添加显式等待确保页面元素加载完成
    wait = WebDriverWait(self.driver, 1)
    return wait.until(EC.element_to_be_clickable((way, tag)))

函数def judgeElement(self,way,tag): 判断元素是否存在,若存在赋给某个变量。Way为By.NAME、By.ID等;tag为NAME、ID等名称。若存在,赋给某个变量

#执行JavaScipt语句
    def excute_js_script(self,script):
        self.driver.execute_script(script)

函数def excute_js_script(self, script):执行指定的script语句,如果script为多行,通过’’’…’’’分割。

接下来建立类初始化方法

def setUp(self):
        #这里使用chrome测试,需要指定chromedriver.exe路径
        driverPath = "C:\\Lib\\chromedriver.exe"
        service = Service(executable_path=driverPath)
        options = webdriver.ChromeOptions()
        # 添加用户数据目录以保持会话
        options.add_argument("user-data-dir=C:\\Lib\\ChromeProfile")
        self.driver = webdriver.Chrome(service=service, options=options)
        self.driver.get("http://127.0.0.1:8000")
        #检查cookies.pkl是否存在
        if not os.path.isfile("cookies.pkl"):
            try:
                # 处理可能的登录表单
                element_username = self.judgeElement(By.ID, "id_username")
                element_password = self.judgeElement(By.ID, "id_password")             
                # 尝试多种提交按钮定位方式
                try:
                    element_submit = self.judgeElement(By.NAME, "form-signin")
                except:
                    try:
                        element_submit = self.judgeElement(By.CSS_SELECTOR, "button[type='submit']")
                    except:
                        element_submit = self.judgeElement(By.XPATH, "//button[contains(.,'登录') or contains(.,'Sign in')]")                        
                # 执行登录
                element_username.clear()
                element_username.send_keys("cindy")
                element_password.clear()
                element_password.send_keys("123456")
                element_submit.click()
            except Exception as e:
                print(f"登录可能已完成或失败: {str(e)}")
                self.driver.save_screenshot("login_error.png")
            # 验证登录是否成功
            try:
                wait.until(EC.title_contains("电子商务系统"))
                if self.driver.title != "电子商务系统":
                    self.fail("标题不正确,实际为: " + self.driver.title)
                #登录成功后存储cookies信息
                self.save_cookies()
            except:
                self.driver.save_screenshot("title_verification_failed.png")
                raise

定义查找的测试方法

def test_search(self):
        #获取Cookies信息
        self.load_cookies()
        self.driver.get("http://127.0.0.1:8000/goods_view/")
        try:
            # 执行搜索
            search_input = self.judgeElement(By.NAME,"good")
            search_input.clear()
            search_input.send_keys("茶")
            submit_button =self.judgeElement(By.XPATH,"//*[@id='navbar']/form/button")
            submit_button.click()
            elements = self.driver.find_elements(By.LINK_TEXT, "放入")
            self.assertTrue(len(elements)> 0, "没有查询到")
        except Exception as e:
            print(f"搜索失败: {str(e)}")
            self.driver.save_screenshot("search_failed.png")
            raise

再加个测试方法,测试放入购物车

def test_put_into_char(self):
    self.load_cookies()
    self.driver.get("http://127.0.0.1:8000/goods_view/")
    try:
          input_link = self.judgeElement(By.LINK_TEXT,"放入")
          input_link.click()
          elements = self.driver.find_elements(By.XPATH,'//font[@color="#FF0000" and text()="1"]')
          self.assertIsNotNone(elements)
    except Exception as e:
          print(f"放入失败: {str(e)}")
          self.driver.save_screenshot("put_into_char_failed.png")
          raise

最后是结束方法

def tearDown(self):
  self.driver.quit()
if __name__ == "__main__": 
  unittest.main()
目录
相关文章
|
2月前
|
JSON 测试技术 API
Apipost与Apifox测试功能对决,谁更适合开发者?
在API开发中,调试工具的选择至关重要。本文对比了国产工具Apipost与Apifox的功能差异,涵盖调试能力、环境管理、团队协作、文档生成、自动化测试等方面。Apifox在细节处理、协作支持及生态集成上表现更优,适合复杂项目与团队开发;而Apipost则适合基础调试需求。通过全面评估,开发者可依据项目特点选择合适工具,提升开发效率与质量。
Apipost与Apifox测试功能对决,谁更适合开发者?
|
2月前
|
人工智能 测试技术 项目管理
测试不再碎片化:AI智能体平台「项目资料套件」功能上线!
在实际项目中,需求文档分散、整理费时、测试遗漏等问题常困扰测试工作。霍格沃兹推出AI智能体测试平台全新功能——项目资料套件,可将多个关联文档打包管理,并一键生成测试用例,提升测试完整性与效率。支持套件创建、文档关联、编辑删除及用例生成,适用于复杂项目、版本迭代等场景,助力实现智能化测试协作,让测试更高效、更专业。
|
2月前
|
存储 人工智能 测试技术
用AI提升测试效率:智能体平台的「需求文档管理」功能上线啦!
霍格沃兹测试开发学社推出AI智能体测试平台,全新「需求文档管理」功能助力高效测试准备。集中管理需求文档,支持多种上传方式,智能生成测试用例,提升测试效率与准确性,助力迈向智能化测试新时代。
|
2月前
|
人工智能 自然语言处理 前端开发
深度解析Playwright MCP:功能、优势与挑战,AI如何提升测试效率与覆盖率
Playwright MCP通过AI与浏览器交互,实现自然语言驱动的自动化测试。它降低门槛、提升效率,助力测试工程师聚焦高价值工作,是探索性测试与快速验证的新利器。
|
4月前
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
9月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
421 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
10月前
|
前端开发 JavaScript 测试技术
使用ChatGPT生成登录产品代码的测试用例和测试脚本
使用ChatGPT生成登录产品代码的测试用例和测试脚本
243 35
|
10月前
|
JavaScript 前端开发 Java
使用ChatGPT生成关于登录产品代码的单元测试代码
使用ChatGPT生成关于登录产品代码的单元测试代码
144 16
|
10月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
5月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
858 23

热门文章

最新文章