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

在执行冒烟测试、回归测试或多浏览器兼容性测试时,利用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表达式,确保其正确性。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值