这些错误都没遇到过,还敢说你做过自动化测试?!

news2024/11/27 6:19:03

在执行冒烟测试、回归测试或多浏览器兼容性测试时,利用web自动化测试可以显著节省人力成本,因此web自动化测试的价值非常大。然而,任何从事过web自动化测试的人都会有这样的体会:写自动化代码相对简单,但维护的成本却非常高。一日页面代码频繁变动,测试代码就必须随之调整。此外,web自动化测试通常给人的感觉是:稳定性不足,执行成功率较低,而且有时耗时较长(尤其是在元素等待处理上仅使用sleep方法时,代码执行效率会大幅下降)。

图片

在执行冒烟测试、回归测试或多浏览器兼容性测试时,利用web自动化测试可以显著节省人力成本,因此web自动化测试的价值非常大。然而,任何从事过web自动化测试的人都会有这样的体会:写自动化代码相对简单,但维护的成本却非常高。一日页面代码频繁变动,测试代码就必须随之调整。此外,web自动化测试通常给人的感觉是:稳定性不足,执行成功率较低,而且有时耗时较长(尤其是在元素等待处理上仅使用sleep方法时,代码执行效率会大幅下降)。因此,如何设计好自动化代码,采用合适的设计思想和结构显得尤为重要,比如使用页面对象模式(PO)和数据驱动测试(DDT)等方法。当然,本文的重点不在测试代码或测试框架的设计编写上,而是讨论在处理元素定位时常见的错误及其解决方案。毫无疑问,元素定位是Web自动化测试中最大的难点之一。接下来,我将列举一些常见的元素定位错误,包括相关的场景、示例、分析方法和解决方案。让我们一起来看看哪些问题你在工作中遇到过。

1. ElementNotFoundException

场景:

当你尝试在一个页面中定位一个元素时,页面中的该元素还没有加载或定位器不正确,就会出现ElementNotFoundException

例子:

你在页面加载时立刻尝试点击一个按钮,但该按钮可能在页面完全加载后才会显示。

分析方法:

  • 检查定位器:确保使用的定位器(如CSS选择器、XPath)是正确的,没有拼写错误,且能够唯一标识元素。

  • 检查页面加载状态:如果页面加载缓慢,可能是元素还没有加载出来,导致定位失败。

解决方案:

  • 使用显式等待(Explicit Wait)

from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(    EC.presence_of_element_located((By.ID, "element_id")))element.click()

  • 检查并调整定位器:使用浏览器的开发者工具(F12)检查元素的XPath或CSS选择器,确保其唯一性。

2. StaleElementReferenceException

场景:

当你定位一个元素后,页面的DOM发生了变化(如元素被重新加载、删除或更新),你再试图与该元素交互时,就会触发StaleElementReferenceException

例子:

你定位了一个按钮,并试图点击它,但在点击之前,页面重新加载了该按钮,导致引用失效。

分析方法:

  • 检查DOM变化:通过调试观察元素在操作前后是否发生了变化,或者页面是否有重新加载、动态更新等操作。

  • 检查元素的刷新:有时,页面刷新或动态内容加载可能会导致元素变得“陈旧”。

解决方案:

  • 重新定位元素

try:    element = driver.find_element(By.ID, "element_id")    element.click()except StaleElementReferenceException:    element = driver.find_element(By.ID, "element_id")    element.click()

  • 使用显式等待:确保页面加载完毕后再操作元素,或者在捕获到此异常时,等待元素稳定后再重新操作。

3. TimeoutException

场景

当等待某个条件或元素出现的时间超过了指定的超时时间,TimeoutException就会发生。

例子:

你正在等待一个加载指示器消失,表示页面加载完成,但由于网络问题或服务端响应延迟,加载时间超出了等待的时间。

分析方法:

  • 检查网络或服务器状态:确认是否是因为网络问题或服务器响应延迟导致页面加载超时。

  • 检查超时时间:超时时间设置是否合理,是否符合实际的页面加载需求。

解决方案:

  • 增加等待时间

WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "element_id")))

  • 优化等待条件:如果等待的是一个非必要的元素,考虑优化等待条件或减少对该元素的依赖。

4. ElementClickInterceptedException

场景:

当你尝试点击一个元素时,发现它被另一个元素(如广告弹窗、遮罩层)挡住了,这时会发生ElementClickInterceptedException

例子:

你在尝试点击登录按钮,但登录按钮被一个广告弹窗部分遮挡,导致点击被拦截。

分析方法:

  • 检查页面布局:使用浏览器开发者工具查看元素是否被其他元素遮挡。

  • 检查页面动态加载:某些元素如广告弹窗、模态窗口可能会在页面加载后才出现。

解决方案:

  • 使用显式等待,确保在遮挡元素消失后再进行点击:

WebDriverWait(driver, 10).until(EC.invisibility_of_element((By.ID, "overlay_id")))element = driver.find_element(By.ID, "login_button")element.click()

  • 使用JavaScript点击:如果无法避免遮挡,可以尝试直接使用JavaScript执行点击操作:

element = driver.find_element(By.ID, "login_button")driver.execute_script("arguments[0].click();", element)

5. NoSuchElementException

场景:

NoSuchElementException通常在尝试定位一个不存在的元素时发生。可能是因为定位器错误或元素尚未加载。

例子:

你尝试定位一个输入框,但页面上根本没有这个元素,或者页面加载不完全。

分析方法:

  • 检查定位器:确保定位器正确无误,能够唯一地标识目标元素。

  • 检查元素是否确实存在:使用浏览器开发者工具查看DOM结构,确认元素是否存在。

解决方案:

  • 使用显式等待,等待元素出现后再进行操作:

element = WebDriverWait(driver, 10).until(    EC.presence_of_element_located((By.ID, "element_id")))

  • 检查代码逻辑:确保在正确的页面或上下文中执行了查找操作,避免逻辑错误。

6. InvalidElementStateException

场景:

InvalidElementStateException发生在你尝试对一个处于无效状态的元素执行操作时,例如在只读的输入框中输入文本。

例子:

你试图在一个禁用的文本框中输入内容,或对一个未激活的下拉菜单进行选择。

分析方法:

  • 检查元素属性:查看元素的属性(如readonlydisabled)是否设置为不可编辑。

  • 检查页面逻辑:确保元素在正确的状态下被操作。

解决方案:

  • 检查并调整操作顺序:确保在元素可操作时才执行操作,或者在必要时通过JavaScript移除元素的只读属性。

driver.execute_script("arguments[0].removeAttribute('readonly')", element)element.send_keys("new value")

7. NoAlertPresentException

场景:

在你尝试处理一个alert对话框时,发现该alert并不存在,系统就会抛出NoAlertPresentException

例子:

你预期操作会触发一个alert,但由于前置条件未满足或逻辑错误,alert未弹出。

分析方法:

  • 检查操作逻辑:确保前置条件正确,alert的触发逻辑准确。

  • 检查浏览器行为:有时不同的浏览器或版本对alert的处理可能不一致。

解决方案:

  • 使用显式等待等待alert出现:

WebDriverWait(driver, 10).until(EC.alert_is_present())alert = driver.switch_to.alertalert.accept()

  • 添加异常处理:在捕获异常时进行适当的处理,如记录日志或执行回退操作。

8. NoSuchWindowException

场景:

在尝试切换到一个不存在或已关闭的窗口时,会触发NoSuchWindowException

例子:

你在操作多窗口应用时,关闭了一个窗口,然后尝试切换到该窗口。

分析方法:

  • 检查窗口句柄:在操作窗口之前,确保窗口句柄仍然有效。

  • 检查页面流:确认页面的多窗口逻辑没有问题。

解决方案:

  • 重新获取窗口句柄

windows = driver.window_handlesdriver.switch_to.window(windows[-1])  # 切换到最新打开的窗口

  • 检查窗口存在:在切换之前检查目标窗口是否仍然存在。

9. UnhandledAlertException

场景:

当页面上突然弹出一个未处理的alert对话框,导致测试操作被中断时,会抛出UnhandledAlertException

例子:

你正在填写一个表单,结果因为一个自动保存的功能弹出了alert,导致测试被中断。

分析方法:

  • 检查alert的触发条件:理解alert的触发机制,确保在适当的时间处理它。

  • 检查页面状态:alert是否是由于操作错误或特殊页面状态触发。

解决方案:

  • 提前处理alert

try:    alert = driver.switch_to.alert    alert.accept()except NoAlertPresentException:    pass

  • 在测试逻辑中增加alert处理机制:确保在关键操作前检查并处理任何可能的alert。

10. InvalidSelectorException

场景:

InvalidSelectorException通常发生在你使用的CSS选择器或XPath表达式存在语法错误,或表达式不符合选择器规范时。

例子:

你编写了一个复杂的XPath表达式来定位元素,但其中包含了不支持的函数或语法错误,例如使用了不正确的轴语法。

分析方法:

  • 检查选择器语法:使用浏览器开发者工具验证选择器的正确性,确保CSS选择器或XPath表达式符合规范。

  • 简化表达式:尝试简化选择器,分步检查表达式的每个部分,确保语法正确。

解决方案:

  • 修正选择器语法

# 例如,使用更标准的XPath语法element = driver.find_element(By.XPATH, "//div[@class='example-class']")

  • 使用开发者工具调试:在浏览器的开发者工具中,测试选择器并确保它能够正确定位到元素。

11. ScriptTimeoutException

场景:

ScriptTimeoutException发生在执行JavaScript代码时,脚本执行时间超过了设定的超时时间。

例子:

你通过WebDriver执行了一段复杂的JavaScript代码,例如解析大量数据或操作DOM,结果脚本执行时间过长,导致超时。

分析方法:

  • 检查脚本复杂度:确认JavaScript代码是否过于复杂或处理的数据量太大。

  • 检查网络性能:某些情况下,脚本执行可能受到网络延迟或服务器响应时间的影响。

解决方案:

  • 增加脚本超时时间

driver.set_script_timeout(30)  # 设置脚本执行超时时间为30秒driver.execute_async_script("your_js_code();")

  • 优化JavaScript代码:尽量减少不必要的操作或数据处理,确保脚本能够在合理时间内完成。

12. SessionNotFoundException

场景:

当WebDriver会话已经结束或丢失时,尝试继续操作会抛出SessionNotFoundException

例子:

你在执行测试时,WebDriver会话意外中断(例如浏览器崩溃或关闭),但你仍尝试与浏览器进行交互。

分析方法:

  • 检查会话状态:在操作之前检查WebDriver的会话状态,确保会话仍然有效。

  • 查看日志:检查测试日志,确定会话丢失的原因,如浏览器崩溃、网络问题等。

解决方案:

  • 重新启动会话:捕获异常后,重新启动WebDriver会话并继续测试。

try:    driver.find_element(By.ID, "element_id").click()except SessionNotFoundException:    driver = webdriver.Chrome()    driver.get("http://example.com")

  • 处理会话结束:在测试逻辑中,检测到会话结束时,进行适当的处理,如重启测试或记录日志。

13. NoSuchFrameException

场景:

NoSuchFrameException通常发生在尝试切换到一个不存在的iframe时,可能是因为iframe的ID错误或iframe尚未加载。

例子:

你尝试切换到一个嵌入在页面中的iframe,但使用了错误的ID,或者iframe尚未加载完成。

分析方法:

  • 检查iframe ID或名称:使用浏览器开发者工具检查iframe的ID或名称,确保使用了正确的值。

  • 确保iframe已加载:在切换到iframe之前,确认iframe已经完全加载。

解决方案:

  • 使用显式等待,等待iframe出现

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "iframe_id")))

  • 检查并修正ID或名称:确保切换的目标iframe确实存在且ID或名称正确。

14. InvalidCookieDomainException

场景:

当你尝试为一个与当前页面域名不匹配的域设置cookie时,会抛出InvalidCookieDomainException

例子:

你在操作一个子域(如sub.example.com)的页面时,尝试为主域(如example.com)设置cookie。

分析方法:

  • 检查cookie的域属性:确认cookie的域名属性与当前页面一致。

  • 检查页面URL:确保页面的URL符合预期,并且cookie设置与页面域名匹配。

解决方案:

  • 设置正确的域名

cookie = {'name': 'mycookie', 'value': 'cookievalue', 'domain': 'sub.example.com'}driver.add_cookie(cookie)

  • 使用适当的页面或域:在正确的页面或域下执行cookie设置操作,确保一致性。

15. UnableToSetCookieException

场景:

UnableToSetCookieException发生在尝试设置cookie时,由于某些安全策略或cookie属性设置不正确,导致操作失败。

例子:

你尝试为页面设置一个HttpOnly属性的cookie,但由于安全策略限制,操作被拒绝。

分析方法:

  • 检查cookie属性:确保cookie的属性设置正确,如HttpOnlySecure等属性是否符合页面的要求。

  • 检查浏览器设置:某些浏览器可能有特殊的安全设置,限制cookie的设置或访问。

解决方案:

  • 修正cookie属性

cookie = {'name': 'mycookie', 'value': 'cookievalue', 'path': '/', 'secure': False}driver.add_cookie(cookie)

  • 调整浏览器设置:根据需要调整浏览器的安全设置,允许设置特定的cookie。

16. ConnectionResetException

场景:

ConnectionResetException通常发生在与WebDriver或服务器的连接意外断开时。可能由于网络问题、服务器问题或浏览器崩溃导致。

例子:

在测试过程中,由于网络连接不稳定或服务器重启,导致与WebDriver的连接中断,抛出此异常。

分析方法:

  • 检查网络状态:确认网络连接是否稳定,是否存在断网或延迟的情况。

  • 检查服务器状态:确保服务器正常运行,没有发生重启或崩溃。

解决方案:

  • 重试机制:在捕获到此异常时,尝试重连或重启测试操作。

try:    driver.get("http://example.com")except ConnectionResetException:    driver.quit()    driver = webdriver.Chrome()    driver.get("http://example.com")

  • 网络优化:优化网络设置,确保测试环境的网络连接稳定。

17. UnhandledAlertException

场景:

当页面上突然弹出一个未处理的alert对话框,导致测试操作被中断时,会抛出UnhandledAlertException

例子:

你正在填写一个表单,结果因为一个自动保存的功能弹出了alert,导致测试被中断。

分析方法:

  • 检查alert的触发条件:理解alert的触发机制,确保在适当的时间处理它。

  • 检查页面状态:alert是否是由于操作错误或特殊页面状态触发。

解决方案:

  • 提前处理alert

try:    alert = driver.switch_to.alert    alert.accept()except NoAlertPresentException:    pass

  • 在测试逻辑中增加alert处理机制:确保在关键操作前检查并处理任何可能的alert。

18. XPathLookupError

场景:

XPathLookupError发生在使用无效的XPath表达式进行元素定位时,例如语法错误或路径不正确。

例子:

你编写了一个复杂的XPath表达式,但其中包含了不支持的函数或语法错误,如未关闭的括号。

分析方法:

  • 检查XPath语法:使用浏览器开发者工具验证XPath表达式,确保语法正确。

  • 简化XPath表达式:逐步拆解复杂的XPath表达式,检查每个部分的正确性。

解决方案:

  • 修正XPath表达式

element = driver.find_element(By.XPATH, "//div[@class='example-class']")

  • 使用浏览器开发者工具调试:在开发者工具中测试和调试XPath表达式,确保其正确性。

 

这是我整理的《2024最新Python自动化测试全套教程》,以及配套的接口文档/项目实战【网盘资源】,需要的朋友可以下方视频的置顶评论获取。肯定会给你带来帮助和方向。

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依服务器上云部署

准备条件: 安装好mysql和redis并配置好密码。 1.安装JDK,我这里使用的是1.8 wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11…

40 - asctime()函数

文章目录 1 函数原型2 参数3 返回值4 示例4.1 示例14.2 示例2 1 函数原型 asctime():时间类型转换,函数原型如下: char* asctime (const struct tm * timeptr);ctime()库描述如下: Convert tm structure to string 1. Interpre…

MySQL4 多表查询 内连接

内连接 多表查询内连接 多表查询 数据准备 CREATE DATABASE db4; USE db4; -- 创建部门表 create table if not exists dept(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp(eid varchar(20) pr…

【文件IO】文件系统操作

文章目录 基本操作概述1. 文件属性2. 文件构造方法3. 文件方法1. 文件创建2. 文件删除3. 查看目录下所有的文件名4. 遍历目录5. 创建目录5. 目录重命名 基本操作概述 创建文件删除文件创建目录重命名文件判定文件存在… Java 中,提供了一个 File 类,进…

电商平台的推荐算法需要备案吗?

答案是肯定的! 政策要求: 根据我国《互联网信息服务算法推荐管理规定》(以下简称《规定》)第六条,具有舆论属性或社会动员能力的互联网信息服务,包括电商平台的推荐算法,需要进行备案。 电商平…

使用js和css 实现div旋转围绕圆分布排列

记录,以防忘记 围绕圆 import React, { useEffect } from react; import ./index.scoped.scss;const Test () > {const arr Array.from({ length: 28 }, (_, index) > index 1);useEffect(() > {const dayTotal arr.length;// 动态设置每个点的旋转角…

快速找出问题快件:批量查询与筛选技巧

在日常生活中,我们经常需要查询大量的快递信息。尤其在电商、物流等行业,快速、准确地查询和筛选快递信息至关重要。固乔快递查询助手是一款强大的工具,能帮助用户批量查询快递,并快速筛选出问题快件。下面我们将详细介绍如何使用…

opengl创建柱面和鱼眼重展uv

专业软件 先看一下专业软件 可以拉取很多的uv点 以下是使用 OpenGL 创建不规则面片并指定 UV 的一般步骤: 1 顶点数据准备 2 定义面片的顶点坐标。这些顶点构成了面片的形状。 3 为每个顶点指定对应的纹理坐标(UV)。 4 创建顶点缓冲区对象…

Springboot整合hutool验证码

在 Spring Boot 中&#xff0c;你可以将 Hutool 生成验证码的功能集成到 RESTful API 接口中。 依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.14</version> <!-- 使用最新版…

EF Core 索引器属性(Indexer property)场景及应用

EF Core 索引器属性&#xff08;Indexer property&#xff09;场景及应用 简介 EF Core 中的索引器属性&#xff08;Indexer Property&#xff09;是指通过一个特殊的属性来访问实体类中的数据&#xff0c;而不必明确声明实体属性。这种属性在一些动态或未预定义的场景中非常…

【Java算法专场】位运算(下)

目录 判定字符是否唯一 ​编辑 算法分析 算法步骤 算法代码 hash表 位运算 两整数之和 算法分析 算法步骤 算法代码 只出现一次的数字 II 算法分析 算法步骤 算法代码 只出现一次的数字 III 算法分析 算法步骤 算法代码 面试题 17.19. 消失的两个数字 算…

python 如何实现执行selenium自动化测试用例自动录屏?

做自动化测试已经好多年了&#xff0c;随着项目技术的正增长提升&#xff0c;我们也不断完善并提高自己的技术能力&#xff0c; 下面给大家分享一个 selenium 自动化执行测试用例的录屏功能。希望对大家有帮助&#xff01; 首先&#xff0c;我们为什么要执行自动化录屏功能呢…

TIOBE 8月编程排行榜出炉!Python 正在追赶 Java 的 TIOBE 指数记录

2024年8月的TIOBE编程语言排行榜出炉了&#xff01;对于开发者而言&#xff0c;这份排行榜不仅仅是编程语言的简单排序&#xff0c;更是行业趋势的风向标。而今年&#xff0c;Python的表现格外引人注目&#xff0c;它正在一步步逼近Java的TIOBE指数记录。让我们一起看看这两大编…

es的执行命令日志输出

1. 说明 最近项目对接es&#xff0c;使用的客户端为&#xff1a; <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.11.4</version></dependency>使用过程中希望能…

3-1 介绍及传感器(智能应用篇)

3-1 介绍及传感器&#xff08;智能应用篇&#xff09; 3-0 本章介绍3-1 传感器介绍 3-0 本章介绍 Arduino实际应用到生活中 科技创作给生活的乐趣与便利 前两部分内容为基础 太极创客官方网站 课程主角led Led蕴含丰富的科技知识 水立方&#xff0c;led 主机led 汽车le…

整理 酷炫 Flutter 开源UI框架 FAB

flutter_villains 灵活且易于使用的页面转换。 项目地址&#xff1a;https://github.com/Norbert515/flutter_villains 项目Demo&#xff1a;https://download.csdn.net/download/qq_36040764/89631324

前端开发攻略---一篇文章让你快速上手TypeScript

目录 1、TypeScript简介 2、为何需要TypeScript 2.1 今非昔比的JavaScript 2.2 JavaScript中的困扰 2.3 静态类型检查 3、编译TypeScript 3.1 命令行编译 3.2 自动化编译 4、类型声明 5、类型推断 6、类型总览 6.1 JavaScript中的数据类型 6.2 TypeScript中的数据类…

【模电笔记】——信号的运算和处理电路(含电压比较器)

tips&#xff1a;本章节的笔记已经打包到word文档里啦&#xff0c;建议大家下载文章顶部资源&#xff08;有时看不到是在审核中&#xff0c;等等就能下载了。手机端下载后里面的插图可能会乱&#xff0c;建议电脑下载&#xff0c;兼容性更好且易于观看&#xff09;&#xff0c;…

Python实战项目:天气数据爬取+数据可视化(完整代码)

一、选题的背景 随着人们对天气的关注逐渐增加&#xff0c;天气预报数据的获取与可视化成为了当今的热门话题&#xff0c;天气预报我们每天都会关注&#xff0c;天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…

搭建高可用OpenStack(Queen版)集群(十一)之OpenStack集成ceph服务

一、OpenStack集成ceph服务 一&#xff09;Openstack集成Ceph准备 1、OpenStack存储知识 1、OpenStack数据存储分类 Openstack环境中&#xff0c;数据存储可分为临时性存储与永久性存储。 临时性存储&#xff1a;主要由本地文件系统提供&#xff0c;并主要用于nova虚拟机的本地…