IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Web自动化测试学习笔记 -> 正文阅读

[开发测试]Web自动化测试学习笔记

软件测试基础

一.软件测试基本原则

1.测试显示软件存在缺陷

测试只能证明软件中存在缺陷,但并不能证明软件中不存在缺陷。软件测试是为了降低存在缺陷的可能性,即使没找到缺陷,也不能证明软件是完美的。

2.穷尽测试是不可能的

软件规模越来越大,复杂度越来越高,想做到完全性的测试是不可能的。在测试阶段,测试人员可以根据风险和优先级来进行集中和高强度的测试,从而保证软件的质量。

3.测试尽早介入

保证软件质量,降低风险和成本。测试人员一般在需求阶段就开始介入,使缺陷在需求和设计阶段就被发现,缺陷发现越早,修复成本越小

4.缺陷集群性

缺陷集群性表明小部分模块包含大部分缺陷。软件测试中存在Pareto原则:80%的缺陷发现在20%的模块中。一个功能模块发现的缺陷越高,存在未发现缺陷的概率也越高。

5.杀虫剂悖论

反复使用相同的杀虫剂会导致害虫对杀虫剂产生免疫而无法杀死害虫。软件测试也一样。如果一直使用相同的测试方法或手段,可能无法发现新的bug。

为了解决这个问题,测试用例应当定期修订和评审,增加新的或不同的测试用例帮助发现更多的缺陷。

测试人员不能一直依赖于现有的测试技术,而要不断的提升测试方法以提高测试效率。

6.测试活动依赖于测试内容

根据业务的不同,软件测试内部也分为不同的行业,比如游戏行业、电商行业、金融行业。不同的行业,测试活动的开展都有所不同,比如测试技术、测试工具的选择,测试流程都不尽相同,所以软件测试的活动开展依赖于所测试的内容。

7.“没有错误就是好”谬论

有可能99%没有bug的软件也是不能使用的。如果对错误的需求进行了彻底的测试,这种情况就发生了。软件测试不仅是找出缺陷,同时也需要确认软件是否满足需求。如果开发出来的产品不满足用户的需求,即便找到和修复了缺陷也作用不大。

二.软件测试流程

1、需求分析
目的:让产品、开发、测试、设计对需求理解达成—致,减少开发过程中由于理解不一致产生的 bug,同时尽早发现需求设计中存在的问题,尽早修改,降低修复成本产品经理收集需求,召集开发、测试、设计参与需求评审会议。

需求包括:产品文档、产品原型

注意:参与评审会议前,先熟悉需求
2、编写测试计划和测试方案
目的:定义测试的范围、测试的方法、所需的资源、进度等,明确需要测试的产品项,需要覆盖的功能特性,需要执行的测试任务,每项任务的负责人,识别相关的风险。

计划和方案由测试负责人或者测试经理输出,同时需要跟开发负责人沟通确定时间。

计划和方案确定好之后需要发邮件通知相关人员

3、编写测试用例
定义︰测试用例是测试过程中很重要的一类文档,它是测试工作的核心、是一组在测试时输入输出的标准、是软件需求的具体对照。测试用例能在很大的程度上反应一个测试人员的能力。

测试用例的编写和设计也是有对应的设计方法。

测试用例的要素:用例编号、用例名称、测试背景、前置条件、优先级、重要级、测试数据、测试步骤、预期结果、实际结果

4、测试用例评审
自的:针对所编写的用例进行查漏补缺参与人员:开发、产品、测试

5、接口测试(可选)
编写完用例后.开发没有转测试, 可以针对开发的后台服务器进行接口测试。

6、执行测试用例
准备工作:执行用例之前需要搭建测试环境。

通过手工或自动化执行测试用例.如果测试结果与用例的预期结果不符.那么就认为是BUG,也就是缺陷,需要将BUG通过缺陷管理工具记录下来方便管理跟踪。

自动化执行的用例是针对
7、提交测试报告
目的:在于总结测试阶段的测试过程及测试结果分析,描述系统是否达到需求并依此作为是否上线的依据。

测试报告内容:测试环境、测试模块、测试用例数、发现的BUG数、已解决BUG数、遗留BUG数、遗留风险、测试结论。

测试报告要以邮件的形式通知相关人员,包括开发、测试、项目经理、运维。

8、产品上线
产品上线之后需要做一些基本功能的验证,如果有问题,确认问题的影响以及修改问题的时间,如果一些界面元素的,问题不是很大,能够马上修改好的话就立马修改,如果问题影响大,那么会回退版本。

三.自动化测试能解决什么问题

1.解决-回归测试

2.解决-压力测试

3.解决-兼容性测试

4.提高测试效率,保证产品质量

回归测试:项目在发新版本之后对项目之前的功能进行验证

压力测试:可以理解多用户同时去操作软件,统计软件服务器处理多用户请求的能力

兼容性测试:不同浏览器(IE、Firefox、Chrome)等等

四.自动化测试的优点和误区

优点
1.较少的时间内运行更多的测试用例;

2.自动化脚本可重复运行;

3.减少人为的错误;

4.克服手工测试的局限性;

误区
1.自动化测试可以完全替代手工测试;

2.自动化测试一定比手工测试厉害;

3.自动化测试可以发掘更多的BUG;

4.自动化测试适用于所有功能;

五.哪些项目适合做自动化测试

1.需求变动不频繁

2.项目周期长

3.项目需要回归测试

六.自动化测试的分类

自动化测试分类:

  • Web自动化测试(本阶段学习的内容)

  • 移动自动化测试

  • 接口自动化测试

  • 单元测试-自动化测试

  • 桌面的自动化测试

  • 安全自动化测试

  • 嵌入式设备的自动化测试

七.主流的Web自动化测试工具

1.QTP

QTP是一个商业化的功能测试工具,收费,支持web,桌面自动化测试。

2.Selenium
selenium是一个开源的web自动化测试工具,免费,主要做功能测试。

3.Robot framework
Robot Framework是一个基于Python可扩展地关键字驱动的测试自动化框架。

八.web自动化环境搭建

所需要的工具:

  • python

  • pycharm编辑器

  • 基于python的selenium模块

  • 浏览器驱动

  • 浏览器

九.selenium安装、卸载查看命令

1.selenium安装命令: pip install selenium

2.selenium卸载命令: pip uninstall selenium

3.selenium查看命令: pip show selenium

十.Web自动化测试步骤

1.安装浏览器驱动

  • 查看谷歌浏览器版本号
  • http://npm.taobao.org/mirrors/chromedriver/在这个链接下下载对应版本的驱动
  • 解压驱动压缩包后放在Python文件的目录下

2.书写python代码

import time
# 1.导入selenium工具包
from selenium import webdriver  # webdriver代表的是浏览器驱动对象
# 2.实例化浏览器对象
driver = webdriver.Chrome()  # 实例化edge浏览器
# webdriver.Chrome() 实例化谷歌浏览器
# 3.打开测试网站
driver.get("http://www.baidu.com")
# 4.等待三秒(代替业务操作)
time.sleep(3)
# 5.退出浏览器,释放资源
driver.quit()

十一.Selenium-API操作

1.元素定位

目标:掌握id、name、class_name、tag_name、link_text、partial_link_text定位方法的使用

  • 元素:由标签头和标签尾以及标签之间的内容所这在一起的部分,称为一个元素

  • 元素定位:通过元素的信息(属性)或者元素的层级结构来定位元素的

2.浏览器开发者工具

作用:快速定位元素,查看元素信息

  • 打开方式:
    • 进入浏览器点击F12,选择“elements”页签
    • 在web页面上,右击元素选择检查,也可打开浏览器开发者elements的页签

3.Selenium定位元素的七种方式

  • id:通过元素的id属性值来定位元素的

    • 前提条件:元素必须有id的值
    • id定位方法:
    element = driver.find_element_by_id(id)		# id代表id属性值,driver代表浏览器对象
    
    • 实例(打开SSPU的OA办公界面并自动填入账号密码)
    # 1.使用id定位,输入用户名:20181112937
    # 2.使用id定位,输入密码:*********
    # 3.3秒后关闭浏览器窗口
    import time
    
    # 导包
    from selenium import  webdriver
    # 实例化浏览器
    driver = webdriver.Chrome()
    # 打开测试网站
    driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")
    # 使用id定位,输入用户名:20181112937
    driver.find_element_by_id("username").send_keys("20181112937")
    # 2.使用id定位,输入密码:*********
    driver.find_element_by_id("password").send_keys("***********")
    # 等待三秒,退出
    time.sleep(3)
    driver.quit()
    
  • name:通过元素的name属性来定义元素

    • 前提条件:元素必须要有name属性(name元素的属性值可以重复)
    • name定义方法:
    element = driver.find_element_by_name(name) # name表示name属性值,driver表示浏览器驱动对象
    
    • 实例(打开SSPU的OA界面并自动填入账号密码)
    # 1.使用name定位,输入用户名:20181112937
    # 2.使用name定位,输入密码:*********
    # 3.3秒后关闭浏览器窗口
    import time
    
    # 导包
    from selenium import webdriver
    # 实例化浏览器
    driver = webdriver.Chrome()
    # 打开测试网站
    driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")
    # 使用name定位,输入用户名:20181112937
    driver.find_element_by_name("username").send_keys("20181112937")
    # 2.使用name定位,输入密码:*********
    driver.find_element_by_name("password").send_keys("*********")
    # 等待三秒,退出
    time.sleep(3)
    driver.quit()
    
  • class_name:通过class的属性值来进行元素定位。class只使用其中一个进行元素定位

    • 元素定位方法:
    element = driver.find_element_by_class_name(class) #class表示class属性中的一个值
    
    • 实例
    # 1.使用class_name定位,输入用户名:20181112937
    # 2.使用class_name定位,输入密码:*********
    # 3.3秒后关闭浏览器窗口
    import time
    # 导包
    from selenium import webdriver
    # 实例化浏览器
    driver = webdriver.Chrome()
    # 打开测试网站
    driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")
    # 使用class_name定位,输入用户名:20181112937
    driver.find_element_by_class_name("login-username").send_keys("20181112937")
    # 2.使用class_name定位,输入密码:*********
    driver.find_element_by_class_name("login-password").send_keys("*********")
    # 等待三秒,退出
    time.sleep(3)
    driver.quit()
    
  • tag_name:通过标签名称来进行元素定位

    • 问题:在同一个html页面中,相同标签的元素会有多个,如果有多个相同元素,默认选中第一个。(不建议使用)
    • 定位方法:
element = driver.find_element_by_tag_name(tag_name)		#tag_name表示标签名称
  • 实例:
# 1.使用tag_name定位,输入用户名:20181112937
# 2.3秒后关闭浏览器窗口
import time
# 导包
from selenium import webdriver
# 实例化浏览器
driver = webdriver.Chrome()
# 打开测试网站
driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")
# 使用tag_name定位,输入用户名:20181112937
driver.find_element_by_tag_name("input").send_keys("20181112937")
# 等待三秒,退出
time.sleep(3)
driver.quit()
  • **link_text:用来定位超链接(a标签)元素 **

    • 说明:通过a标签元素的全部文本内容进行元素定位
    • 元素定位的方法:
    element = driver.find_element_by_link_text(link_text)	#link_text表示链接标签中间的内容
    
    • 实例:
    # 1.使用link_text定位忘记密码并点击
    # 2.3秒后关闭浏览器窗口import time
    # 导包from selenium import webdrive
    r# 实例化浏览器
    driver = webdriver.Chrome()
    # 打开测试网站
    driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")
    # 使用link_text定位忘记密码并点击
    driver.find_element_by_link_text("忘记密码?").click()
    # 等待三秒,退出t
    ime.sleep(3)
    driver.quit()
    
  • partial_link_text:用来定位超链接(a标签)

    • 说明:通过超链接的局部文本内容进行元素定位
    • 元素定位方法:
    element = driver.find_element_by_partial_link_text(partial_link_text)	#partial_link_text表示超链接标签中的局部内容
    
    • 实例:
# 1.使用link_text定位忘记密码并点击
# 2.3秒后关闭浏览器窗口
import time
# 导包
from selenium import webdriver
# 实例化浏览器
driver = webdriver.Chrome()
# 打开测试网站
driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")
# 使用link_text定位忘记密码并点击
driver.find_element_by_link_text("忘记密码?").click()
# 等待三秒,退出
time.sleep(3)
driver.quit()
  • 定位一组元素:

    • 定位方法:
    element = driver.find_elements_by_xxx()
    
    • 定位一组元素的返回值不是元素对象,而是一个列表(相当于数组)
    • 返回的列表下标是从0开始的

    实例:

# 1.定位一组元素
# 2.定位指定位置的标签并输入指定内容
# 3.3秒后关闭浏览器窗口
import time
# 导包
from selenium import webdriver
# 实例化浏览器
driver = webdriver.Chrome()
# 打开测试网站
driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")
# 定位一组元素
# 定位指定位置的标签并输入指定内容
elements = driver.find_elements_by_tag_name("input")
# 打印elements
print(type(elements))
elements[0].send_keys("20181112937")
elements[1].send_keys("*********")
# 等待三秒,退出
time.sleep(5)
driver.quit()
  • XPath:

    • 使用XPath和CSS定位元素的原因:通过元素本身的信息无法精准定位到想要定位的元素时,可以通过xpath/css的层级结构进行定位
    • XPath定位方法一:路径定位
    element = driver.find_element_by_xpath(xpath)#路径定位(绝对路径、相对路径)#1.绝对路径:从/html根节点开始使用/来分隔元素层级#如:/html/body/div/fieldset/p[1]/input#绝对路径对页面结构比较严格,不建议使用#---------------------------------------------------------#2.相对路径:匹配任意层级的元素,不限制元素的位置#相对路径以//开始#格式://input或者//*#tips:路径定位可以使用下标
    
    • 实例:
    # 1.通过XPath定位输入框并输入指定内容# 2.3秒后关闭浏览器窗口import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开测试网站driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")# 通过XPath定位输入框并输入指定内容# 绝对路径的方式定位元素driver.find_element_by_xpath("/html/body/div/div/div/div/form/div/input").send_keys("20181112937")# 相对路径定位元素driver.find_element_by_xpath("//input").send_keys("20181112937")# 等待三秒,退出time.sleep(3)driver.quit()
    
    • XPath定位方法二:利用元素属性定位
    element = driver.find_element_by_xpath(xpath)#格式://标签[@属性='值’]
    
    • 实例:
    # 1.通过XPath定位输入框并输入指定内容# 2.3秒后关闭浏览器窗口import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开测试网站driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")# 通过XPath定位输入框并输入指定内容# 通过元素属性定位元素driver.find_element_by_xpath("//input[@name='password']").send_keys("20181112937")# 等待三秒,退出time.sleep(3)driver.quit()
    
    • XPath定位方法三:属性与逻辑结合
    element = driver.find_element_by_xpath(xpath)#格式://标签[@属性='值’ and @属性='值' ...]
    
    • 实例:
    # 1.通过XPath定位输入框并输入指定内容# 2.3秒后关闭浏览器窗口import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开测试网站driver.get("https://id.sspu.edu.cn/cas/login?service=https%3A%2F%2Foa.sspu.edu.cn%2Fsso%2Flogin.jsp%3FtargetUrl%3D%7Bbase64%7DaHR0cHM6Ly9vYS5zc3B1LmVkdS5jbi93dWkvbWFpbi5qc3A%3D")# 通过XPath定位输入框并输入指定内容# 通过属性与逻辑结合的方式driver.find_element_by_xpath("//input[@name='password' and @placeholder='请输入您的密码']").send_keys("20181112937")# 等待三秒,退出time.sleep(3)driver.quit()
    
    • XPath-延伸
    element = driver.find_element_by_xpath(xpath)# //*[text()="xxx"]								文本内容是xxx的元素# //*[contains(@attribute,"xxx")]				属性中含有xxx的元素# //*[starts-with(@attribute,"xxx")]			属性以xxx开头的元素
    
    • 实例:
    # 1.通过XPath定位输入框并输入指定内容# 2.3秒后关闭浏览器窗口import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开测试网站driver.get("http://www.sspu.edu.cn")# 通过XPath定位输入框并输入指定内容# //*[text()="xxx"]	    文本内容是xxx的元素driver.find_element_by_xpath("//*[text()='师资队伍']").click()# //*[contains(@attribute,"xxx")]	属性中含有xxx的元素# //*[starts-with(@attribute,"xxx")]    属性以xxx开头的元素# 等待三秒,退出time.sleep(3)driver.quit()
    
  • CSS:

    • tips:在selenium中推荐使用CSS定位,他比XPath更快
    • CSS定位方法:
    element = driver.find_element_by_css_selector(css_selector)		#css_selector表示css选择器的表达式
    
    • CSS常用的选择器:
      • id选择器:通过id属性选择元素
        • 表达式:#id id表示id属性值
      • class选择器:通过class属性选择元素
        • 表达式:.class class表示class属性值
        • 注意:只需要输入class中的一个值即可
      • 元素选择器:通过标签名称(tag_name)选择元素
        • 表达式:tag_name (不建议使用)
      • 元素属性选择器:通过元素属性选择元素
        • 表达式:[attribute=‘value’] attribute表示属性名称,value表示属性值
      • 层级选择器:
        • 父子层级 表达式:element1>element2 表示element2为element1的直接子元素
        • 隔代层级 表达式:element1 element2 表示element2是element1下面的子元素,也称为后代元素
    • 实例:
    import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 使用css元素定位# id选择器driver.find_element_by_css_selector("#username").send_keys("12345678900")# 属性选择器driver.find_element_by_css_selector("[name=password]").send_keys("123456")# 层级选择器driver.find_element_by_css_selector("div input[id='username']").send_keys("12345678900")# 元素选择器driver.find_element_by_css_selector(".regbtn").click()# 等待三秒,退出time.sleep(3)driver.quit()
    

十二.元素常用操作

  • click() 单击元素
  • send_keys() 模拟输入
  • clear() 清除文本

十三.浏览器操作

  1. maximize_window() :最大化浏览器窗口 --> 模拟浏览器最大化按钮

  2. set_window_size(width, height):设置浏览器窗口大小 --> 设置浏览器宽、高(像素点),相当于通过浏览器边框改变浏览器宽高

  3. set_window_position(x, y) :设置浏览器窗口位置 --> 设置浏览器位置

  4. back():后退 --> 模拟浏览器后退按钮

  5. forward() :前进 --> 模拟浏览器前进按钮

  6. refresh(): 刷新 --> 模拟浏览器F5刷新

  7. close():关闭当前窗口 --> 模拟点击浏览器关闭按钮

  8. quit():关闭浏览器驱动对象 --> 关闭所有程序启动的窗口

  9. title:获取页面title

  10. current_url:获取当前页面URL

import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 最大化浏览器driver.maximize_window()time.sleep(4)# 调整宽高driver.set_window_size(500,600)time.sleep(4)# 设置窗口位置driver.set_window_position(300,300)time.sleep(4)# 刷新浏览器driver.find_element_by_css_selector("#username").send_keys("12345678900")driver.refresh()time.sleep(3)# 回退按钮driver.find_element_by_link_text("常见问题").click()time.sleep(3)driver.back()time.sleep(3)# 前进按钮driver.forward()# 等待三秒,退出time.sleep(3)driver.close()
import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 最大化浏览器driver.maximize_window()# 获取浏览器标题print(driver.title)# 获取浏览器窗口URL地址print(driver.current_url)driver.forward()# 等待三秒,退出time.sleep(3)driver.close()

十四.获取元素信息

  • 获取元素的目的:用来判断操作结果

  • 获取元素的常用方法:

    • size:返回元素大小

      • 指元素的宽高。主要用于判断图片元素是否符合预期的结果
    • text:获取元素文本

      • 工作中最常用
    • get_attribute(“xxx”):获取属性值,传递的参数为元素的属性名

      • xxx表示的是属性名称
      import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 最大化浏览器窗口driver.maximize_window()# 获取用户名输入框大小print(driver.find_element_by_css_selector("#username").size)# 获取页面上超链接的文本内容print(driver.find_element_by_link_text("常见问题").text)# 获取页面上一个超链接的地址print(driver.find_element_by_link_text("常见问题").get_attribute("href"))# 等待几秒time.sleep(2)driver.quit()
      
    • is_displayed():判断元素是否可见

      • 元素状态不可见的情况下不可对元素进行操作
    • is_enabled():判断元素是否可用

    • is_selected():判断元素是否选中,用来检查复选框或单选按钮是否被选中

十五.鼠标操作

  • 鼠标操作步骤
  1. 实例化鼠标对象
action = ActionChains(driver)		#driver表示浏览器对象
  1. 调用鼠标方法
action.context_click(element)		#element表示元素对象
  1. 执行鼠标事件
action.perform()					#如果没有调用此方法,鼠标事件效果看不到 
  • 鼠标右击操作

    • 注意:右击出来的菜单必须是html自定义的,否则无法操作
    import time# 导包from selenium import webdriverfrom selenium.webdriver import ActionChains# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 最大化浏览器窗口driver.maximize_window()# 找到用户名输入框ele = driver.find_element_by_css_selector("#username")# 针对用户名输入框进行右击操作# 实例化鼠标对象action = ActionChains(driver)action.context_click(ele) #调用鼠标右击事件的方法action.perform() #执行鼠标右击事件# 等待几秒time.sleep(2)driver.quit()
    
  • 鼠标双击操作

    action.double_click(element)	#element为元素对象
    

    实例:

    import time# 导包from selenium import webdriverfrom selenium.webdriver import ActionChains# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 最大化浏览器窗口driver.maximize_window()# 找到用户名输入框ele = driver.find_element_by_css_selector("#username")ele.send_keys("12345678900")time.sleep(3)# 针对用户名输入框进行右击操作# 实例化鼠标对象action = ActionChains(driver)action.double_click(ele)    # 双击鼠标事件action.perform()            # 执行鼠标事件# 等待几秒time.sleep(3)driver.quit()
    
  • 鼠标悬停操作

    action.move_to_element(element)		#element表示要移动到的元素对象
    

    实例

    # 导包import timefrom selenium import webdriverfrom selenium.webdriver import ActionChains# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 最大化浏览器driver.maximize_window()time.sleep(5)# 找到指定元素ele = driver.find_element_by_css_selector(".regbtn")# 实例化鼠标对象action = ActionChains(driver)# 悬停在找到的元素上action.move_to_element(ele)# 执行鼠标操作action.perform()# 等待三秒time.sleep(3)# 退出driver.quit()
    
  • 鼠标拖动操作

    • 应用场景:主要应用于一些游戏场景中/验证码操作
    action.drag_and_drop(element1,element2)		#表示把element1拖动到element2中去-------------------------------------------------------------------------------------------------------------------#单个元素拖动action.drag_and_drop_by_offset(element,x,y)		#x,y表示横向和纵向的移动距离
    

    实例:

    # 导包import timefrom selenium import webdriverfrom selenium.webdriver import ActionChains# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器driver.get("https://www.zhangxinxu.com/study/201102/html5-drag-and-drop.html")# 最大化浏览器driver.maximize_window()# 查找指定元素element1 = driver.find_element_by_xpath("//*[text()='列表1']")element2 = driver.find_element_by_css_selector(".dustbin")# 实例化鼠标action = ActionChains(driver)# 执行拖动操作action.drag_and_drop(element1, element2)action.perform()# 等待五秒后退出time.sleep(5)driver.quit()
    

十六.键盘操作

  • 键盘操作的步骤:

    1. 导包:

      from selenium.webdriver.common.key import Keys
      
    2. 使用封装好的键值进行操作

  • 常用的键盘操作:

    1. send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
    2. send_keys(Keys.SPACE) 空格键(Space)
    3. send_keys(Keys.TAB) 制表键(Tab)
    4. send_keys(Keys.ESCAPE) 回退键(Esc)
    5. send_keys(Keys.ENTER) 回车键(Enter)
    6. send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
    7. send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
  • 实例:

    import time# 导包from selenium import webdriver# 实例化浏览器from selenium.webdriver.common.keys import Keysdriver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 最大化浏览器窗口driver.maximize_window()# 找到用户名输入框ele = driver.find_element_by_css_selector("#username")ele.send_keys("139111111119")time.sleep(2)# 删除末尾的9ele.send_keys(Keys.BACK_SPACE)time.sleep(2)# 全选用户名ele.send_keys(Keys.CONTROL, 'a')time.sleep(2)# 复制用户名ele.send_keys(Keys.CONTROL, 'c')# 粘贴到推荐人框ele2 = driver.find_element_by_css_selector("[name=invite]")ele2.send_keys(Keys.CONTROL, 'v')# 等待几秒time.sleep(3)driver.quit()
    

十七.元素等待

  • 影响页面加载时间的因素

    • 电脑配置(CPU,内存等)
    • 网速
    • 后台服务器(配置低,高并发的情况…)
  • 元素等待的类型:

    • 隐式等待:定位元素时,会先等待整个页面加载完成,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常NoSuchElementException 。隐式等待只需要设置一次,对后面元素的定位方法都有效

      • 实现方法:

        driver.implicitly_wait(timeout)		#timeout为等待的最大时长,单位:秒#说明:隐式等待是全局设置,只需设置一次就会作用于所有元素
        
      • 案例:

        import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 最大化浏览器窗口driver.maximize_window()# 设置隐式等待driver.implicitly_wait(10)# 找到用户名输入框ele = driver.find_element_by_css_selector("#username")ele.send_keys("13911111111")# 等待几秒time.sleep(3)driver.quit()
        
    • 显式等待:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该元素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出超时异常 TimeoutException,显式等待不需要等待整个页面的加载,而且只是针对单个元素有效

      • 实现方法:

        #需要导包from selenium.webdriver.support.wait import WebDriverWait、#driver:浏览器驱动对象;timeout:超时时长;poll_frequency:检测间隔时间WebDriverWait(driver, timeout, poll_frequency=0.5)	#调用方法#method:函数名称,该函数用来实现对元素的定位#一般使用匿名函数来实现:lambda x: x.find_element_by_id("xxx")until(method)	#直到...时#综上可用一行代码表示:element = WebDriverWait(driver,10,1).until(lambda x: x.find_element_by_id("xxx"))
        
      • 案例:

        import time# 导包from selenium import webdriver# 实例化浏览器from selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/user/reg.html")# 最大化浏览器窗口driver.maximize_window()# 设置显式等待element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_css_selector("#username"))# 找到用户名输入框element.send_keys("13911111111")# 等待几秒time.sleep(3)driver.quit()
        
    • 强制等待:强制等待就是暂停代码的执行

      • 应用场景:
        1. 要等待的元素不需要去进行定位操作,但是该元素跟要操作的元素有业务的关联,一定要等待该元素加载完成后,才能对操作的元素操作成功
        2. 当需要获取的元素的文本信息是通过后台接口获取并渲染到元素中,此时需要加强制等待才能准确拿到对应的文本内容

十八.下拉框、弹出框、滚动条操作

  • Select类操作步骤:

    1. 导包
    from selenium.webdriver.support.select import Select 
    
    1. 实例化Select类
    select = Select(element)	#select标签对应的元素
    
    1. 调用方法
    select.select_by_index(index)			#根剧索引来定位select.select_by_value(value)			#根据option属性value来定位select.select_by_visible_text(text)		   #根据option显示的文本内容定位	
    
  • 下拉框实例:

    import time# 导包from selenium import webdriver# 实例化浏览器from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.select import Selectdriver = webdriver.Chrome()# 打开浏览器网址driver.get("file:///C:/Users/msi/Desktop/study/VsCode/%E8%BD%AF%E6%B5%8B/select.html")# 最大化浏览器窗口driver.maximize_window()# 定位下来选择框元素ele = driver.find_element(By.ID, "selectA")select = Select(ele)# 1.使用索引选择‘广州’select.select_by_index(1)time.sleep(2)# 2.使用value选择‘上海’select.select_by_value("shanghai")time.sleep(2)# 3.使用选项文本内容选择‘北京’select.select_by_visible_text("北京")time.sleep(2)# 等待几秒driver.quit()
    
  • 弹出框

    操作步骤:

    #1.获取弹出框对象alert = driver.switch_to.alert#2.调用alert.text				#返回alert/confirm/prompt中的文字信息alert.accept()			#接受对话框选项alert.dismiss()			#取消对话框选项
    

十九.窗口切换

  • 窗口切换:

    • 原因:新打开的浏览器窗口如果不做窗口切换,无法对新打开的窗口进行相关操作

    • selenium中通过窗口句柄实现窗口切换的

    • 实现方法:

      1. 获取当前窗口句柄
      driver.current_window_handle
      
      1. 获取所有窗口句柄
      driver.window_handles		#返回一个列表
      
      1. 切换窗口句柄
      driver.switch_to.window(handle)		#handle:表示窗口句柄
      
    • 实例:

    import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器网址driver.get("http://tpshop-test.itheima.net/Home/Index/index.html")# 最大化浏览器窗口driver.maximize_window()# 定位下来选择框元素driver.find_element_by_link_text("抢购").click()# 保存当前窗口句柄# current_window = driver.current_window_handle# 获取所有窗口句柄windows = driver.window_handles# 切换窗口driver.switch_to.window(windows[-1])time.sleep(5)# 等待几秒driver.quit()
    

二十.frame切换

  • **说明:**在selenium中封装了如何切换frame框架的方法

    方法:

    driver.switch_to.frame(frame_reference)			#切换到指定的frame的方法driver.switch_to.default_content()				 #恢复默认页面的方法
    

二十一.窗口截图

  • **说明:**在selenium中,提供了截图方法,只需调用即可
  • 方法:
driver.get_screenshot_as_file(imgpath)		#imgpath:图片保存路径
  • 注意:图片文件后缀名为.png格式

二十二.验证码

  • **说明:**一种随机生成的信息(数字,字母,汉字,图片等…)为了防止恶意的请求行为,增加应用的安全性
  • 验证码的处理方式:
    1. 去掉验证码:测试环境下采用
    2. 设置万能验证码:生产环境和测试环境下采用
    3. 验证码识别技术:通过python-tesseract来识别图片类验证码:识别率很难达到100%
    4. 记录cookie:通过记录cookie来进行跳过登录

二十三.cookie

  • cookie的应用场景:

    • 实现会话跟踪,记录用户登陆状态
    • 实现记住密码和自动登录功能
    • 用户未登录状态下,记录购物车中的商品
  • Selenium操作cookie:

    1. 获取指定cookie:
    get_cookie(name)		#name:为cookie的名称
    
    1. 获取本网站所有本地cookies:
    geget_cookies()
    
    1. 添加cookie:
    add_cookie(cookie_dict)		#cookie_dict:一个字典对象,必选的键包括:"name"and"value"
    
  • cookie实现跳过登录:

    import time# 导包from selenium import webdriver# 实例化浏览器driver = webdriver.Chrome()# 打开浏览器网址driver.get("https://www.baidu.com/")# 手动获取百度cookie信息cookie_dict = {    "name":"BDUSS",    "value":"xxxxxx"}# 最大化浏览器窗口driver.maximize_window()# 添加cookiedriver.add_cookie(cookie_dict)# 刷新浏览器driver.refresh()time.sleep(10)# 等待几秒driver.quit()
    

二十四.UnitTest框架

  • 概念:Unit Test是python自带的单元测试框架,用来做单元测试

  • 使用UnitTest的好处:

    1. 能组织多个用例去执行
    2. 提供丰富的断言方法
    3. 能够生成测试报告
  • UnitTest核心要素:

    • TestCase:测试用例

      • 定义测试类:需要继承unittest.TestCase

      • 定义测试方法:方法名称必须以test开头

      • TestCase运行:

        1. 在pycharm中右击,点击“unittest for 方法名/类名”

        2. 在测试用力文件后添加以下代码,通过python代码执行

          if __name__ == '__main__':    unittest.main()
          
    • TestSuite:多条测试用例集合在一起,就是一个TestSuite

      • 实例化测试套件:

        suite = unittest.TestSuite()
        
      • 在suite中添加测试用例(方法一):

        # 添加测试用例方法一suite.addTest(TestAdd("test_add_01"))
        
      • 在suite中添加测试用例(方法二):

        # 添加测试用例方法二suite.addTest(unittest.makeSuite(TestAdd))
        
    • TextTestRunner:用来执行测试用例和测试套件的

      • 实例化TestRunner:

        runner = unittest.TextTestRunner()
        
      • 执行:

        runner.run(suite)
        
    • TestLoader:

      • 实例化:

        suite = unittest.TestLoader().discover(test_dir, pattern="xxxx*.py")#test_dir:表示测试文件所在的目录#xxx*.py:匹配条件是以xxx开头的py文件
        
      • **tips:**TestLoader加载用例会自动将测试用例存放到测试套件中

    • Fixture:

      • 方法级别Fixture:

        初始化操作:

         # 定义一个方法级别的初始化操作    def setUp(self):        	pass
        

        销毁操作:

         # 定义一个方法级别的销毁操作    def tearDown(self):        pass
        
      • 类级别Fixture:

        初始化操作:

        @classmethoddef setUpClass(cls)	pass
        

        销毁操作:

        @classmethoddef tearDownClass(cls)	pass
        
      • 模块级别Fixture:

        初始化操作:

        def setUpModule()
        

        销毁:

        def tearDownModule()
        

二十五.断言

  • 概念:让程序代替人为判断测试程序执行结果是否符合预期结果的过程

  • UnitTest断言方法:

    序号断言方法断言描述
    1assertTrue(expr, msg=None)验证expr是true,如果为false则fail
    2assertFalse(expr, msg=None)验证expr是false,如果为true则fail
    3assertEqual(expected, actual, msg=None)验证expected==actual,不等则fail
    4assertNotEqual(first, second, msg=None)验证first!=second,相等则fail
    5assertIsNone(obj, msg=None)验证obj是None,不是则fail
    6assertIsNotNone(obj, msg=None)验证obj不是None,是则fail
    7assertIn(member, container, msg=None)验证是否member in container
    8assertNotIn(member, container, msg=None)验证是否member not in container
  • 实例:

    import unittestdef add(x, y):    return x+y# 定义测试类class TestAdd(unittest.TestCase):    # 定义测试方法    def test_add_01(self):        result = add(1, 1)        print(result)        # 断言预期结果是否为true 只要结果不为0、None、False,那么就是真(True)        self.assertTrue(result)        # 断言预期结果是否为false        self.assertFalse(result)    def test_add_02(self):        result = add(1, 2)        print(result)        # 断言预期结果是否相等        self.assertEqual(result, 3)        # 断言预期结果不相等        self.assertNotEqual(result,3)    def test_add_03(self):        result = add(2, 4)        print(result)        # 断言预期结果为空        self.assertIsNone(result)        # 断言预期结果不为空        self.assertIsNotNone(result)    def test_add_04(self):        result = add(4, 4)        print(result)        # 断言预期结果包含result        self.assertIn(str(result), '8')        # 断言预期结果是否不包含result        self.assertNotIn(str(result), '4')
    

二十六.参数化

  • 安装化扩展插件

    pip install parameterized
    
  • 使用方式:

    #导包from parameterized import parameterized#试用装饰器进行参数化@parameterized.expand#方法一:@parameterized.expand([(1, 1, 2), (2, 2, 4), (3, 3, 6)])def test_add(self, x, y, expect):    pass#方法二:data = [(1, 1, 2), (2, 2, 4), (3, 3, 6)]@parameterized.expand(data)def test_add(self, x, y, expect):    pass#方法三:def build_data():    return [(1, 1, 2), (2, 2, 4), (3, 3, 6)]@parameterized.expand(build_data)def test_add(self, x, y, expect):    pass
    
  • 实例:

    import unittestfrom parameterized import parameterizeddef add(x, y):    return x + y# 方法三:创建获取测试用例的方法def build_data():    return [(1, 1, 2), (2, 2, 4), (3, 3, 6)]class TestAdd(unittest.TestCase):    # 方法一:    @parameterized.expand([(1, 1, 2), (2, 2, 4), (3, 3, 6)])    def test_add_01(self, x, y, expect):        result = add(x, y)        self.assertEqual(result, expect)    # 方法二    data =  [(1, 1, 2), (2, 2, 4), (3, 3, 6)]    @parameterized.expand(data)    def test_add_02(self,x , y, expect ):        result = add(x, y)        self.assertEqual(result, expect)    # 方法三    @parameterized.expand(build_data())    def test_add_03(self, x, y, expect):        result = add(x, y)        self.assertEqual(result, expect)
    

二十七.跳过

  • 使用方法:

    #直接将测试函数标记为跳过@unittest.skip('代码未完成')#根据条件判断测试函数是否跳过@unitetst.skipIf(condition, reson)
    
  • 实例:

    import unittestdef add(x, y):    return x + yversion = 20# @unittest.skip('模块删除')class TestAdd(unittest.TestCase):    @unittest.skip('该用例无效')    def test_add_01(self):        result = add(1, 2)        print(result)    def test_add_02(self):        result = add(2, 4)        print(result)    @unittest.skipIf(version >= 20, '版本更新')    def test_add_03(self):        result = add(4, 4)        print(result)
    

二十八.生成HTML测试报告

  • 说明:执行完测试用例后,以HTML网页的方式将执行结果生成报告

  • 生成测试报告的方式:

    1. Export Test Result(UnitTest自带)

    2. HTMLTestRunner(第三方模板)

      • 安装:打开这个网址tungwaiyip.info/software/HTMLTestRunner_0_8_2/HTMLTestRunner.py右击浏览器另存为到桌面,将HTMLTestRunner.py文件复制到D:\Python\Lib\site-packages目录下即可

      • 导入HTMLTestRunner、unittest包

        import unittestimport HTMLTestRunner
        
      • 生成测试套件

        suite = unittest.TestSuite()suite.addTest(TestLogin("test_login"))suite = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
        
      • 设置报告生成路径和文件名

        file_name = "./report/report.html"
        
      • 打开报告

        with open(file_name, 'wb') as f:
        
      • 实例化HTMLTestRunner对象:

        runner = HTMLTestRunner( stream = f , [title] , [description] )#stream:文件流,打开写入报告的名称及写入编码格式#title:报告标题,如xxx自动化测试报告#description:为报告描述信息
        
      • 执行

        runner.run(suite)
        
      • 实例:

        # 导入HTMLTestRunner、unittest包import timeimport unittestfrom HTMLTestRunner import HTMLTestRunnerfrom UnitTest.HTMl_repo_01 import TestAdd# 生成测试套件suite = unittest.TestSuite()suite.addTest(unittest.makeSuite(TestAdd))# 设置报告生成路径和文件名file_name = "report/report{}.html".format(time.strftime("%Y%m%d%H%M%S"))# 打开测试文件with open(file_name, 'wb') as f:    # 定义HTMLTestRunner实例对象    runner = HTMLTestRunner(stream=f, title="web自动化", description="windows-chrome-v2.0")    # 执行测试用例    runner.run(suite)
        

二十九.软件测试知识点

  • 数据库:(MySQL、MS-SQL、Oracle)
    • 基础知识:增删改查,联表查询
    • 数据库优化
    • 测试过程要对数据进行校验,性能测试需要知道数据库的优化
  • Linux、其他一些系统、中间件:
    • Linux基本命令、高级命令
      • 服务器都用Linux
      • 搭建环境
    • 系统调优
      • 线程数或进程数
      • 性能测试
    • tomcat、nginx(高级工程师需要掌握)
      • 配置、调优
  • 项目流程以及测试流程,测试的相关理论:
    • 手工测试的基础
    • 流程一定要掌握(开发模型)
    • 设计用例的方法
  • python或Java
  • 自动化测试:
    • 接口自动化
    • web自动化
    • app自动化
  • 性能测试:
    • 测试服务器的并发及压力
  • 安全测试:
    • SQL注入
    • XSS跨站脚本攻击
    • 数据是否加密
    • 越权测试
    • CSRF:跨站请求伪造

三十.软件测试实战

import time
import unittest

from parameterized import parameterized
from selenium import webdriver
from selenium.webdriver.common.by import By
from util.utils import get_element


#定义测试类
class TestLogin(unittest.TestCase):

    case_data = [("13587654321", "12345678", "7777", "验证码错误", False ),
                 ("", "13587654321", "8888", "用户名不能为空", False),
                 ("13587654321", "", "7777", "密码不能为空", False),
                 ("13587654321", "12345678", "", "验证码不能为空", False),
                 ("13587654321", "123456789", "8888", "密码错误", False),
                 ("13587654321", "12345678", "8888", "我的账户", True)]


    # 定义类级别fixture
    @classmethod
    def setUpClass(cls):
        # 进入首页,点击登录
        cls.driver = webdriver.Chrome()
        cls.driver.get("http://tpshop-test.itheima.net/Home")
        cls.driver.maximize_window()

    # 定义方法级别fixture
    def setUp(self) -> None:
        self.driver.get("http://tpshop-test.itheima.net/Home")

    # 定义测试方法
    # # 验证码错误
    # def test_login_01(self):
    #     go_login = (By.CSS_SELECTOR, ".red")
    #     get_element(self.driver, go_login).click()
    #
    #     # 输入用户名,密码,验证码,点击登录
    #     ele_mobile = (By.ID, "username")
    #     get_element(self.driver, ele_mobile).clear()
    #     get_element(self.driver, ele_mobile).send_keys("13587654321")
    #
    #     ele_password = (By.ID, "password")
    #     get_element(self.driver, ele_password).clear()
    #     get_element(self.driver, ele_password).send_keys("12345678")
    #
    #     ele_code = (By.ID, "verify_code")
    #     get_element(self.driver, ele_code).clear()
    #     get_element(self.driver, ele_code).send_keys("7777")
    #
    #     ele_login = (By.CSS_SELECTOR, ".J-login-submit")
    #     get_element(self.driver, ele_login).click()
    #     time.sleep(2)
    #     # 判断是否登陆成功
    #     msg = get_element(self.driver, (By.CSS_SELECTOR, ".layui-layer-content")).text
    #     self.assertIn("验证码错误", msg)
    #
    # # 用户名为空
    # def test_login_02(self):
    #     go_login = (By.CSS_SELECTOR, ".red")
    #     get_element(self.driver, go_login).click()
    #     # 输入用户名,密码,验证码,点击登录
    #
    #     ele_password = (By.ID, "password")
    #     get_element(self.driver, ele_password).clear()
    #     get_element(self.driver, ele_password).send_keys("12345678")
    #
    #     ele_code = (By.ID, "verify_code")
    #     get_element(self.driver, ele_code).clear()
    #     get_element(self.driver, ele_code).send_keys("8888")
    #
    #     ele_login = (By.CSS_SELECTOR, ".J-login-submit")
    #     get_element(self.driver, ele_login).click()
    #     time.sleep(2)
    #     # 判断是否登陆成功
    #     msg = get_element(self.driver, (By.CSS_SELECTOR, ".layui-layer-content")).text
    #     self.assertIn("用户名不能为空", msg)
    #
    # # 密码为空
    # def test_login_03(self):
    #     go_login = (By.CSS_SELECTOR, ".red")
    #     get_element(self.driver, go_login).click()
    #     # 输入用户名,密码,验证码,点击登录
    #     ele_mobile = (By.ID, "username")
    #     get_element(self.driver, ele_mobile).clear()
    #     get_element(self.driver, ele_mobile).send_keys("13587654321")
    #
    #     ele_code = (By.ID, "verify_code")
    #     get_element(self.driver, ele_code).clear()
    #     get_element(self.driver, ele_code).send_keys("8888")
    #
    #     ele_login = (By.CSS_SELECTOR, ".J-login-submit")
    #     get_element(self.driver, ele_login).click()
    #     time.sleep(2)
    #     # 判断是否登陆成功
    #     msg = get_element(self.driver, (By.CSS_SELECTOR, ".layui-layer-content")).text
    #     self.assertIn("密码不能为空", msg)
    #
    # # 验证码为空
    # def test_login_04(self):
    #     go_login = (By.CSS_SELECTOR, ".red")
    #     get_element(self.driver, go_login).click()
    #     # 输入用户名,密码,验证码,点击登录
    #     ele_mobile = (By.ID, "username")
    #     get_element(self.driver, ele_mobile).clear()
    #     get_element(self.driver, ele_mobile).send_keys("13587654321")
    #
    #     ele_password = (By.ID, "password")
    #     get_element(self.driver, ele_password).clear()
    #     get_element(self.driver, ele_password).send_keys("12345678")
    #
    #     ele_login = (By.CSS_SELECTOR, ".J-login-submit")
    #     get_element(self.driver, ele_login).click()
    #     time.sleep(2)
    #     # 判断是否登陆成功
    #     msg = get_element(self.driver, (By.CSS_SELECTOR, ".layui-layer-content")).text
    #     self.assertIn("验证码不能为空", msg)
    #
    # # 密码错误
    # def test_login_05(self):
    #     go_login = (By.CSS_SELECTOR, ".red")
    #     get_element(self.driver, go_login).click()
    #     # 输入用户名,密码,验证码,点击登录
    #     ele_mobile = (By.ID, "username")
    #     get_element(self.driver, ele_mobile).clear()
    #     get_element(self.driver, ele_mobile).send_keys("13587654321")
    #
    #     ele_password = (By.ID, "password")
    #     get_element(self.driver, ele_password).clear()
    #     get_element(self.driver, ele_password).send_keys("123456789")
    #
    #     ele_code = (By.ID, "verify_code")
    #     get_element(self.driver, ele_code).clear()
    #     get_element(self.driver, ele_code).send_keys("8888")
    #
    #     ele_login = (By.CSS_SELECTOR, ".J-login-submit")
    #     get_element(self.driver, ele_login).click()
    #     time.sleep(2)
    #     # 判断是否登陆成功
    #     msg = get_element(self.driver, (By.CSS_SELECTOR, ".layui-layer-content")).text
    #     self.assertIn("密码错误", msg)

    # 登陆成功
    @parameterized.expand(case_data)
    def test_login_06(self, mobile, password, code, expect, is_success):
        go_login = (By.CSS_SELECTOR, ".red")
        get_element(self.driver, go_login).click()
        # 输入用户名,密码,验证码,点击登录
        ele_mobile = (By.ID, "username")
        get_element(self.driver, ele_mobile).clear()
        get_element(self.driver, ele_mobile).send_keys(mobile)

        ele_password = (By.ID, "password")
        get_element(self.driver, ele_password).clear()
        get_element(self.driver, ele_password).send_keys(password)

        ele_code = (By.ID, "verify_code")
        get_element(self.driver, ele_code).clear()
        get_element(self.driver, ele_code).send_keys(code)

        ele_login = (By.CSS_SELECTOR, ".J-login-submit")
        get_element(self.driver, ele_login).click()
        time.sleep(2)
        # 判断是否登陆成功
        if is_success:
            msg = self.driver.title
        else:
            msg = get_element(self.driver, (By.CSS_SELECTOR, ".layui-layer-content")).text
        self.assertIn(expect, msg)

    @classmethod
    def tearDownClass(cls):
        # 退出浏览器
        cls.driver.quit()

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:31:53  更:2021-07-15 16:33:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 17:01:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码