这些坑都没有踩过,还敢说你做过自动化测试?

news2024/11/26 2:30:39

在执行冒烟测试、回归测试或多浏览器兼容性测试时,利用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 By
from selenium.webdriver.support.ui import WebDriverWait
from 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.alert
alert.accept()
  • 添加异常处理:在捕获异常时进行适当的处理,如记录日志或执行回退操作。

 

8. NoSuchWindowException

场景:

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

例子:

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

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

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

解决方案:

  • 重新获取窗口句柄

windows = driver.window_handles
driver.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表达式,确保其正确性。

 

 

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

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

相关文章

除了 EcoVadis 审核,企业还需要应对哪些可持续发展方面的挑战?

除了 EcoVadis 审核,企业在可持续发展方面还可能面临以下挑战: 对 ESG 的认识和理解不足:企业的领导者和各层级员工可能对 ESG(环境、社会治理)的内涵、要求和重要性缺乏清晰认知,这会影响企业在日常运营中…

Redis的基本数据结构整理以及实战运用案例

目录 一、背景介绍 二、Redis数据结构介绍 1、String(字符串) (1)缓存不常变化的信息,如用户信息、地址信息、配置信息等 (2)分布式锁的使用 (3)原子递增递减,可以做一些简单的…

重启人生计划-拒绝内耗

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…

算法——动态规划:完全背包问题

文章目录 一、问题描述二、解决方案1. DP 状态的设计2. 状态转移方程3. 算法复杂度4. 举例5. 实现6. 滚动数组实现 三、总结 一、问题描述 问题的抽象:给定 n n n 种物品和一个背包,第 i i i 种物品的体积为 c i c_i ci​,价值为 w i w_…

Python项目——轻松实现动态网页爬虫|附详细源码

动态网页爬虫是专门设计用来爬取动态网页内容的自动化程序或工具。与静态网页爬虫不同,动态网页的内容不是预先存储在服务器上的HTML文件,而是根据用户的请求、交互、时间、数据库状态或其他外部因素动态生成的。这些动态内容通常通过JavaScript、AJAX&a…

2024年3个超好用的思维导图软件推荐

专业又经典的思维导图模板,全部拿去,可以直接套用的喔 1、TreeMind树图 推荐指数:☆☆☆☆☆ 点击直达官网>>https://shutu.cn/ TreeMind树图是一个在线思维导图工具,提供65万份思维导图模板,涵盖了各种使用场…

Java二十三种设计模式-观察者模式(15/23)

观察者模式:实现对象间的松耦合通知机制 引言 在当今的软件开发领域,设计模式已成为创建可维护、可扩展和可重用代码的基石。在众多设计模式中,观察者模式以其独特的能力,实现对象间的松耦合通信而脱颖而出。本文将深入探讨观察…

信息安全等级保护:全面解读与实践指南

一、什么是等级保护? 1.1 概念 信息安全等级保护是依据我国《信息安全等级保护管理办法》,对各类信息系统基于重要程度和保密需求进行分级,并制定相应技术与管理措施,以保障信息系统的安全性、完整性和可用性。等级保护共分五级…

【开源 Mac 工具推荐之 4】Awesome-macOS:全能的宝藏工具库

简介 Awesome-macOS 是一个开源项目,属于 GitHub 的热门项目“Awesome”的体系,旨在为 macOS 用户提供一个集合了各种优秀的 macOS 应用程序、插件、脚本和工具的精选列表。该项目由开源社区共同维护,通过不断收集和整理优秀的macOS资源&…

小白安装---Ubuntu教程!!!

1、首先将映像源放入到一个不被删除的地方。 2、打开vmware,创建一个虚拟机 3、 按照顺序点击 4、选择映像源 选择22版的映像 5、设置主机名称和密码 6、设置虚拟机名称和位置 7、 设置磁盘大小 8、选择配置,使用推荐的就行(这个可以随时修改…

二级制安装LAMP

一、安装Apache 1.1解压 tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar xf httpd-2.4.29.tar.bz2 mv apr-1.6.2 httpd-2.4.29/srclib/apr mv apr-util-1.6.0 httpd-2.4.29/srclib/apr-util1.2安装相关工具 yum -y install \ gcc \ #C语言的编译器 gcc-c+…

HarmonyOS应用一之登录页面案例

目录: 1、代码示例2、代码分析3、注解分析 1、代码示例 实现效果: /** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance w…

【数据结构】六、图:6.图的最短路径(BFS 算法、迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

3.最短路径 文章目录 3.最短路径3.1 BFS 算法3.2 迪杰斯特拉(Dijkstra)算法3.3 弗洛伊德(Floyd)算法总结 在网图和非网图中,最短路径的含义是不同的。 由于非网图它没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径。…

JAVA—集合框架

集合 大小可变 是存储数据的容器,本文是在学习过ArrayList集合后对于集合进行一个比较系统的学习,只要是对于Collection类和Map类的学习和案例实践。需要对于Stream流再进行加深学习和理解,功能比较强大和简洁。 目录 1.集合体系结构 &…

流程图语法Mermaid教程

在使用Markdown来编写博客的过程中,尤其是需要更醒目的逻辑说明时,就需要使用流程图。 既然CSDN官方推荐Mermaid作为流程图语法,那我也针对Mermaid来做一期教程。 在学习之前,先总结一下流程图的需求: 节点设置方向设…

好看的超清4K视频素材去哪里找?下载素材资源网站分享

在当前高清与4K视频素材盛行的时代,创作出色的视频内容离不开优质的超清4K视频素材。以下是一些宝藏网站,它们提供了丰富的4K视频素材,可以使您的视频创作更加引人注目。 蛙学网 蛙学网是获取高质量4K视频素材的首选之地。该网站详细标注了视…

lvs、集群

1.集群和分布式 当多个用户当用户访问一个服务器时,服务器server1可能就会崩,假如这时候我们新加一个服务器server2来缓解server1的压力,那么就需要一个调度器lvs来分配,所以现在就是用户的访问就需要通过调度器之后到达服务器&a…

期望薪资3k,面试官笑了但没说话

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

Linux系统编程(8)进程进阶

一、进程的执行 子进程被创建好后,就需要去执行它所该执行的功能,根据子进程需要做的事,将其分为两类: 1.子进程所做的事与父进程差不多,两者功能几乎一样 //子承父业 2.子进程所做的事和父进程做的事完全不同&…

随手记录第十四话 -- 在 Spring Boot 3.2.3 中使用 springdoc-openapi-starter-webmvc-ui

项目升级到JDK21后,SpringBoot版本也到了3.2.3,之前的Swagger-ui不在支持了,找了其他的一直忘记记录了,这里记录一下。 快捷目录 1.引言2.添加依赖3.配置类4.Java代码实现5.启动应用6.总结 1.引言 随着 Spring Boot 版本的更新&a…