用户端web自动化测试1

Web自动化的价值和体系

1、什么时候可以做UI自动化测试

  • 业务流程不频繁改动
  • UI 元素不频繁改动
  • 需要频繁回归的场景
  • 核心场景等

2、 Web自动化测试相关技术

  • Selenium:支持多语言,行业内最火最主流
  • Pytest/JUnit5:最好用最全面的单元测试框架
  • Allure:测试报告

** Selenium**
简介

  • 用于web浏览器测试的工具
  • 支持的浏览器包括IE,Firefox,Safari,Chrome,Edge等
  • 使用简单,可使用Java,Python等多种语言编写用例脚本
  • 主要由三个工具构成:WebDriver、IDE、Grid

*Selenium环境配置步骤

  1. 准备好Python/Java环境
  2. 准备好selenium依赖
  3. driver的下载与配置(Mac与Windows不同)
  4. 在代码中import对应的依赖

自动化测试用例结构分析

  • 用例标题
  • 前提条件
  • 用例步骤
  • 预期结果
  • 实际结果

** web 浏览器控制**

  • get方法打开浏览器*
from selenium import webdriver
import time

def window_start():
    # 实例化chromedriver
    driver = webdriver.Chrome()
    # 打开网站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    window_start()
  • refresh方法刷新页面
from selenium import webdriver
import time

def window_refresh():
    # 实例化chromedriver
    driver = webdriver.Chrome()
    # 打开网站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)
    # 刷新网页
    driver.refresh()
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    window_refresh()
  • 用back方法回退到上一个界面
from selenium import webdriver
import time
from selenium.webdriver.common.by import By

def window_back():
    # 实例化chromedriver
    driver = webdriver.Chrome()
    # 打开网站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)
    driver.find_element(By.XPATH,"//*[@id='ember35']").click()
    # 等待一秒
    time.sleep(1)
    # 返回上一个界面
    driver.back()
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    window_back()
  • maximize_window方法使窗口最大化
def max_window():
    # 实例化chromedriver
    driver = webdriver.Chrome()
    # 打开网站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)
    # 屏幕最大化
    driver.maximize_window()
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    max_window()
  • minimize_window方法使窗口最小化
from selenium import webdriver
import time

def min_window():
    # 实例化chromedriver
    driver = webdriver.Chrome()
    # 打开网站
    driver.get('http://www.ceshiren.com')
    # 等待一秒
    time.sleep(1)
    # 屏幕最小化
    driver.minimize_window()
    # 等待一秒
    time.sleep(1)

if __name__ == '__main__':
    min_window()

常见控件定位方法

class name class 属性对应的值
css selector(重点)css 表达式
id(重点) id 属性对应的值
name(重点) name 属性对应的值
link text 查找其可见文本与搜索值匹配的锚元素
partial link text 查找其可见文本包含搜索值的锚元素。如果多个元素匹配,则只会选择第一个元素。
tag name 标签名称
xpath(重点) xpath表达式

selenium 常用定位方式

#格式: 
driver.find_element_by_定位方式(定位元素)
driver.find_element(By.定位方式, 定位元素)

强制等待与隐式等待
1、强制等待

  • 强制等待,线程休眠一定时间
  • time.sleep(3)
from selenium import webdriver
from selenium.webdriver.common.by import By

def wait_sleep():
    """
    如果直接执行,不添加任何等待,可能会报错
    """
    driver = webdriver.Chrome()
    driver.get("https://vip.ceshiren.com/")
    # 添加等待,让页面渲染完成
    time.sleep(3)
    driver.find_element(By.XPATH, "//*[text()='个人中心']")

if __name__ == '__main__':
    wait_sleep()

2、隐式等待

  • 原理:设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
#设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
driver.implicitly_wait(3)

隐式等待无法解决的问题

  • 元素可以找到,使用点击等操作,出现报错
  • 原因:
    • 页面元素加载是异步加载过程,通常html会先加载完成,js、css其后
    • 元素存在与否是由HTML决定,元素的交互是由css或者js决定
    • 隐式等待只关注元素能不能找到,不关注元素能否点击或者进行其他的交互
  • 解决方案:使用显式等待

常见控件交互方法

点击,输入,清空

  • 点击百度搜索框
  • 输入”霍格沃兹测试开发”
  • 清空搜索框中信息
# 点击百度搜索框
driver.find_element(By.ID,"kw").click()
# 输入"霍格沃兹测试开发"
driver.find_element(By.ID,"kw").send_keys("霍格沃兹测试开发")
# 清空搜索框中信息
driver.find_element(By.ID,"kw").clear()

自动化测试定位策略

选择定位器通用原则

  1. 与研发约定的属性优先(class属性: [name='locate'])
  2. 身份属性 id,name(web 定位)
  3. 复杂场景使用组合定位:
  • xpath,css
  • 属性动态变化(id,text)
  • 重复元素属性(id,text,class)
  • 父子定位(子定位父)
  1. js定位

Web 弹框定位

  • 场景
    • web 页面 alert 弹框
  • 解决:
    • web 需要使用 driver.switchTo().alert() 处理

下拉框/日期控件定位

  • 场景:
    • <input>标签组合的下拉框无法定位
    • <input>标签组合的日期控件无法定位
  • 解决:
    • 面对这些元素,我们可以引入 JS 注入技术来解决问题。

文件上传定位

  • 场景:
    • input 标签文件上传
  • 解决:
    • input 标签直接使用 send_keys()方法