当前位置: 首页 > news >正文

自动化测试常用函数

自动化测试常用函数

  • 前言
    • 1. 元素的定位
      • 1.1 cssSelector
      • 1.2 xpath
        • 1.2.1 获取 HTML 页面所有的节点
        • 1.2.2 获取 HTML 页面指定的节点
        • 1.2.3 获取一个节点中的直接子节点
        • 1.2.4 获取一个节点的父节点
        • 1.2.5 实现节点属性的匹配
        • 1.2.6 使用指定索引的方式获取对应的节点内容
    • 2. 操作测试对象
      • 2.1 点击/提交对象
      • 2.2 模拟按键输入
      • 2.3 清除文本内容
      • 2.4 获取文本信息
      • 2.5 获取当前页面标题
      • 2.6 获取当前页面 URL
    • 3. 窗口
      • 3.1 切换窗口
      • 3.2 窗口设置大小
      • 3.3 屏幕截图
      • 3.4 关闭窗口
    • 4. 弹窗
      • 4.1 警告弹窗 + 确认弹窗
      • 4.2 提示弹窗
    • 5. 等待
      • 5.1 强制等待
      • 5.2 隐式等待
      • 5.3 显式等待
    • 6. 浏览器导航
    • 7. 文件上传
    • 8. 浏览器参数设置


前言

本节主要以代码实操为主
代码地址:https://gitee.com/hu_yuchen/code/tree/master/python-autoTest/aotoTest-01


1. 元素的定位

Web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。

常见的元素定位方式非常多,如 idclassnametagnamexpathcssSelector常用的主要由 cssSelectorxpath

1.1 cssSelector

选择器的功能:选中页面中指定的标签元素。

选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过 id 选择器和子类选择器来进行定位。

  • 定位百度首页的“百度热搜”元素,可以使用通过 id 选择器和子类选择器进行定位:

  • 在这里插入图片描述

    • “搜索输入框元素”#kw
    • “百度一下按钮”#su

1.2 xpath

XML路径语言,不仅可以在 XML 文件中查找信息,还可以在 HTML 中选取节点。

XPath 使用路径表达式来选择 XML 文档中的节点

1.2.1 获取 HTML 页面所有的节点
  • //*
1.2.2 获取 HTML 页面指定的节点
  • //[指定节点]
    • //ul:获取 HTML 页面所有的 ul 节点
    • //input:获取 HTML 页面所有的 input 节点
1.2.3 获取一个节点中的直接子节点
  • /
    • //span/input
1.2.4 获取一个节点的父节点
  • ..
    • //input/..:获取 input 节点的父节点
1.2.5 实现节点属性的匹配
  • [@...]
    • //*[@id='kw']:匹配 HTML 页面中 id 属性为 kw 的节点
1.2.6 使用指定索引的方式获取对应的节点内容

注意:XPath 的索引是从 1 开始的。

  • 百度首页通过://div/ul/li[3] 定位到第三个百度热搜标签

更便捷的生成 selector/xpath 的方式:右键选择复制“Copy selector/xpath”。

案例:如果想要匹配到百度首页指定的新闻文本或者节点集,直接使用 #hotsearch-contentwrapper > li 能够满足吗?

问题:既然可以手动复制 selector/xpath 的方式,为什么还要了解语法?

  • 手动复制的 selector/xpath 表达式并不一定满足上面的唯一性要求,有时候也需要手动的进行修改表达式。

案例:百度首页(需要登录百度账号)右侧的热搜,复制 li 标签下的 a 标签,复制好的 selector 为:#title-content,xpath 为://*[@id="title-content"],大家可以手动操作一下,手动复制的表达式是否唯一呢?

2. 操作测试对象

获取到了页面的元素之后,接下来就是要对元素进行操作了。常见的操作有点击、提交、输入、清除、获取文本。

2.1 点击/提交对象

  • click()
    driver.find_element(By.CSS_SELECTOR, "#su").click();
    

2.2 模拟按键输入

  • send_keys("")
    driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴");
    

2.3 清除文本内容

输入文本后又想换一个新的关键词,这里就需要用到 clear()

driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴");
time.sleep(1);
driver.find_element(By.CSS_SELECTOR, "#kw").clear();
time.sleep(1);
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("古力娜扎");

2.4 获取文本信息

如果判断获取到的元素对应的文本是否符合预期呢?获取元素对应的文本并打印一下。

  • 获取文本信息:text
    text = driver.find_element(By.XPATH, '//*[@id="hotsearch-contentwrapper"]/li[1]/a/span[2]').text;
    print(f"text:{text}");
    

问题:是否可以通过 text 获取到“百度一下按钮”上的文字“百度一下”呢?尝试一下。

注意:文本和属性值不要混淆了。获取属性值需要使用方法 get_attribute("属性名称")

2.5 获取当前页面标题

  • title
    title = driver.title;
    

2.6 获取当前页面 URL

  • current_url
    url = driver.current_url;
    

3. 窗口

打开一个新页面之后获取到的 titleURL 仍然还是前一个页面的?

当我们手工测试的时候,我们可以通过眼睛来判断当前的窗口是什么,但对于程序来说它是不知道当前最新的窗口应该是哪一个。对于程序来说它怎么来识别每一个窗口呢?每个浏览器窗口都有一个**唯一的属性句柄(handle)**来表示,我们就可以通过句柄来切换。

3.1 切换窗口

  1. 获取当前页面句柄:
    driver.current_window_handle;
    
  2. 获取所有页面句柄:
    driver.window_handles;
    
  3. 切换当前句柄为最新页面:
    curWindow = driver.current_window_handle;
    allWindows = driver.window_handles;
    for (window in allWindows) {if (window != curWindow) {driver.switch_to.window(window);}
    }
    

注意:执行了 driver.close() 之前需要切换到未被关闭的窗口。

3.2 窗口设置大小

  1. 窗口的大小设置:
    // 窗口最大化
    driver.maximize_window();
    // 窗口最小化
    driver.minimize_window();
    // 窗口全屏
    driver.fullscreen_window();
    // 手动设置窗口大小
    driver.set_window_size(1024, 768);
    

3.3 屏幕截图

我们的自动化脚本一般部署在机器上自动的去运行,如果出现了报错,我们是不知道的,可以通过抓拍来记录当时的错误场景。

driver.save_screenshot('../images/image.png');

代码演示

  • 简单版本
    driver.save_screenshot('../images/image.png');
    
  • 高阶版本
    filename = "autotest-" + datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S') + '.png';
    driver.save_screenshot('../images/' + filename);
    

3.4 关闭窗口

driver.close();

注意:窗口关闭后 driver 要重新定义。

4. 弹窗

弹窗是在页面是找不到任何元素的,这种情况怎么处理?使用 Selenium 提供的 Alert 接口。

4.1 警告弹窗 + 确认弹窗

在这里插入图片描述

alert = driver.switchTo().alert();
// 确认
alert.accept();
// 取消
alert.dismiss();

4.2 提示弹窗

在这里插入图片描述

alert = driver.switchTo().alert();
alert.send_keys("hello");
alert.accept();
alert.dismiss();

5. 等待

通常代码执行的速度比页面渲染的速度要快,如果避免因为渲染过慢出现的自动化误报的问题呢?可以使用 Selenium 中提供的三种等待方法:

5.1 强制等待

  • time.sleep()
    • 优点:使用简单,调试的时候比较有效。
    • 缺点:影响运行效率,浪费大量的时间。

5.2 隐式等待

隐式等待是一种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执行,直到超时没找到元素才会报错。

  • implicitly_wait() 参数:秒
    // 隐式等待 5 秒
    driver.implicitly_wait(5);
    

隐式等待作用域是整个脚本的所有元素。即只要 driver 对象没有被释放掉(driver.quit()),隐式等待就一直生效。

  • 优点:智能等待,作用于全局。

5.3 显式等待

显式等待也是一种智能等待,在指定超时时间范围内只要满足操作
的条件就会继续执行后续代码。

WebDriverWait(driver, sec).until(functions);

functions:涉及到 selenium.support.ui.ExpectedConditions 包下的 ExpectedConditions 类。

ExpectedConditions下涉及到的方法:
https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html

示例

from selenium.webdriver.support import expected_conditions as EC;
wait = WebDriverWait(driver, 2);
wait.until(EC.invisibility_of_element((By.XPATH, '//*[@id="2"]/div/div/div[3]/div[1]/div[1]/div')));

ExpectedConditions 预定义方法的一些示例

方法说明
title_is(title)检查页面标题的期望值
title_contains(title)检查标题是否包含区分大小写的子字符串的期望值
visibility_of_element_located(locator, str])检查元素是否存在于页面的 DOM 上并且可见的期望值
presence_of_element_located(locator, str])用于检查元素是否存在于页面的 DOM 上的期望值
visibility_of(element)检查已知存在于页面 DOM 上的元素是否可见的期望
alert_is_present()检查是否出现弹窗
  • 优点:显式等待是智能等待,可以自定义显式等待的条件,操作灵活。
  • 缺点:写法复杂。

隐式等待和显式等待一起使用效果如何呢?

  • 测试一下:

    // 隐式等待设置为 10s,显式等待设置为 15s,那么结果会是 5+10=15s 吗?
    driver.implicitly_wait(10);
    wait = WebDriverWait(driver, 15);
    start = time.time();
    try {res = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="2"]/div/div/div[3]/div[1]/div[1]/div/div/div')));
    } catch {end = time.time();print("no such element");driver.quit();print(end - start);
    }
    

    在这里插入图片描述

  • 结果:重试多次,设置 10 秒的隐式等待和 15 秒的显式等待导致 20 秒后发生超时。

💡 小提示

  • 不要混合隐式和显式等待,可能会导致不可预测的等待时间。

6. 浏览器导航

常见操作:

  1. 打开网站
    driver.get("https://tool.lu/");
    
  2. 浏览器的前进、后退、刷新
    driver.back();
    driver.forward();
    driver.refresh();
    

案例:百度首页测试 https://tool.lu/ 标签入口。

7. 文件上传

点击文件上传的场景下会弹窗系统窗口,进行文件的选择。

Selenium 无法识别非 web 的控件,上传文件窗口为系统自带,无法识别窗口元素。

但是可以使用 sendkeys 来上传指定路径的文件,达到的效果是一样的。

driver.get("file:///D:/file/%E6%AF%94%E7%89%B9%E6%95%99%E5%8A%A1/%E6%B5%8B%E8%AF%95/selenium4html/selenium-html/upload.html");
ele = driver.find_element(By.CSS_SELECTOR, "body > div > div > input[type=file]");
ele.send_keys("D:\\file\\test.txt");

8. 浏览器参数设置

  1. 设置无头模式

    options = webdriver.ChromeOptions();
    options.add_argument("-headless");
    driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options);
    
  2. 页面加载策略

    options.page_load_strategy = '加载方式';
    

    页面加载方式主要有三种类型:

    策略说明
    normal默认值,等待所有资源下载
    eagerDOM 访问已准备就绪,但诸如图像的其他资源可能仍在加载
    none完全不会阻塞 WebDriver
    options = webdriver.ChromeOptions();
    options.page_load_strategy = 'eager';
    driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options);
    


http://www.mrgr.cn/news/98002.html

相关文章:

  • Java习题:合并两个有序数组
  • MySQL 进阶 - 2 ( 12000 字详解)
  • C语言超详细指针知识(一)
  • 【学习笔记】头文件中定义函数出现重复定义报错
  • MySQL学习笔记7【InnoDB】
  • 【数据结构】排序
  • <C#> 详细介绍.NET 依赖注入
  • AD9253 LVDS 高速ADC驱动开发
  • ViewModel vs AndroidViewModel:核心区别与使用场景详解
  • TaskFlow开发日记 #1 - 原生JS实现智能Todo组件
  • Shell 编程之条件语句
  • Windows下编译SALOME
  • AI大模型学习六:‌小米8闲置,通过Termux安装ubuntu做个随身服务器
  • UE的AI判断队伍归属的机制:IGenericTeamAgentInterface接口
  • 代码随想录第15天:(二叉树)
  • 图书管理系统(Python)
  • 嵌入式---电机分类
  • ESP32S3 链接到 WiFi
  • Java学习手册:面向对象编程核心概念
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day12