• 0
  • 0
分享
  • Python+selenium自动化元素定位防踩坑——软件测试圈
  • 恬恬圈 2024-07-22 16:17:39 字数 1964 阅读 307 收藏 0

  踩坑一:StaleElementReferenceException

  selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

  异常原因:

  意思是,引用的元素已过期。原因是页面刷新了,此时当然找不到之前页面的元素,就算是后退回来的页面也是不一样的。

1-1.jpg

  在编写脚本时一直报这个错,使用显示等待都不行,在一顿百度操作后才知道是元素被刷新了。

1-2.jpg

  我们发现,仅仅是刷新了一下页面,两次的element id是不同的,这就说明这是两个不同的元素,如果用之前的element,自然会报错。

  原因很明显,你用别人的身份证id去找现在的人,哪怕这两个人长的很像,他也会告诉你,对不起,你找错人啦。

  解决方法:

  有时我们无法避免,不确定什么时候元素就会被刷新。页面刷新后重新获取元素的思路不变,这时可以使用python的异常处理语句:try…except…,异常出现时重新执行,关键代码如下:

1-3.jpg

  如下图:我在实际工作当中编写脚本时使用异常try捕获异常后,页面刷新后重新获取元素,可以成功找到元素了。

1-4.jpg

  踩坑二:ElementClickInterceptedException(元素点击交互异常)

  具体报错:selenium.common.exceptions.ElementClickInterceptedException: Message: element click

  intercepted

   is not clickable at point (1421, 283). Other element would receive the click:

  E (Session info: chrome=104.0.5112.102)

  意思是,元素定位相互覆盖,元素已经找到,但是无法点击

  解决方法:

  方法一:使用强制等待,但是每次都有类似的元素无法点击使用强制等待的话会延长脚本执行时间。

  time.sleep()

  前言:之前便遇到过很多次该问题的报错,就没有管它,但是随着越来越多的元素报该错,每次使用强制等待会大大延长脚本的执行时间,于是便网上找各种方法解决该问题,最终发现是自己使用显示等待的方法错了。

  如下是显示等待的用法和区别。

  方法二:显性等待

  element_to_be_clickable--元素是否可点击。

  vibility of element_ located--元素是否可见。

  presence_of_element_located--元素是否存在。

  如上:三种等待方法,最开始我一直使用的是presence_of_element_located,判断元素是否存在,最终还是报错,提示元素元素点击拦截异常。

  element_to_be_clickable--等待元素出现可以点击,便可以元素定位成功。

  需要先导包:

  from selenium.webdriver.support import expected_conditions as EC
  from selenium.webdriver.support.ui import WebDriverWait
  element = WebDriverWait(self.browser, 5).until(
      EC.element_to_be_clickable((By.XPATH, "//input[@placeholder='请输入会员手机号']")))
  element.clcik()

1-5.jpg

  方法三:使用JS点击

  然而有时即使已经显式等待了,却仍然会报错: ElementClickInterceptedException,这多少有点奇怪,为什么 webdriver 有时就是无法点击,我不知道,也许这和他首先执行的一些验证检查有关,反正就在这一刻,它不给你点。

  代码如下:

  element = self.browser.find_element(By.XPATH, "(//span[@class='el-checkbox__inner'])[4]")
  self.browser.execute_script("arguments[0].click();", element)

1-6.jpg

  这是通过 JavaScript 完成的点击,js可以避开一些校验


作者:一颗卷心菜QAQ    

来源:http://www.51testing.com/html/09/n-7796809.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 数据库事务事务是什么是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合。事务的四大特性原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。隔离性:一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。持续性:也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就是永久性的。接下来的其它操作或故障不应该对其执行结果有任...
            12 12 1442
            分享
          • ThreadLocal是Java中的一个类,全路径:java.lang.ThreadLocal,用于在多线程环境下存储线程本地变量。在多线程应用程序中,不同线程之间共享数据可能会引发线程安全问题。ThreadLocal通过为每个线程创建独立的变量副本,保证了线程间数据的隔离性,从而有效地解决了这一问题。线程之间的数据访问操作互不影响,提高了多线程应用程序的性能和可靠性。ThreadLocal通常与线程池、异步任务和Web应用程序等场景结合使用,使得在多线程编程时更加方便和安全。虽然ThreadLocal有这么多好处,但在之前的实际使用中用的并不多,只有在性能测试中的随机数性能问题探索和随机方法...
            0 0 915
            分享
          •   近期的一项研究表明,OpenAI 最新的聊天机器人 GPT-4o 能够提供道德方面的解释和建议,且质量优于“公认的”道德专家所提供的建议。  据 The Decoder 当地时间周六报道,美国北卡罗莱纳大学教堂山分校和艾伦 AI 研究所的研究人员进行了两项研究,将 GPT 模型与人类的道德推理能力进行比较,以探讨大语言模型是否可被视为“道德专家”。  汇总研究内容如下:  研究一  501 名美国成年人对比了 GPT-3.5-turbo 模型和其他人类参与者的道德解释。结果表明,人们认为 GPT 的解释比人类参与者的解释更符合道德、更值得信赖、更周到。  评估者也认为人工智能的评估比其他人...
            0 0 288
            分享
          • 最新一期TW的技术雷达上出现了一款端到端的开源测试神器Cypress,号称是不懂代码的测试人员、业务人员都可以使用,同时还不依赖于已经是端到端测试扛把子的Selenium,CC先生很好奇,以下是开箱试用报告: 1. 安装cypress https://www.cypress.io/ cypress官网下载,Windows下的安装包大概有233M,下载耗费时间依赖于你的网速咯。 也可以直接到github的cypress项目下获取 : https://github.com/cypress-io/cypress Windows下解压后点击cypress的安装文件,一路默认,直到出现以下画面:1)打开...
            0 0 1598
            分享
          • 简介有些 post 的请求参数是 json 格式的,这个前面发送post 请求里面提到过,需要导入 json模块处理。现在企业公司一般常见的接口因为json数据容易处理,所以绝大多数返回数据也是 json 格式的,我们在做判断时候,往往只需要提取其中几个关键的参数就行,这时候我们就需要 json 来解析返回的数据了。首先来说一下笔者为何要单独写这么一篇,原因是:python 里面 bool 值是 True 和 False,json 里面 bool 值是 true和 false,并且区分大小写,这就尴尬了,明明都是 bool 值。在python里面写的代码,传到json里,不用说肯定识别不了,所...
            0 1 2294
            分享
      • 51testing软件测试圈微信