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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   测试团队作为产品研发团队重要的一环,承担着产品研发质量保证的工作。一款产品质量的好坏,测试团队起着很重要的作用。  作为测试团队的管理者、负责人,所有工作的开展,都需要从自身团队的价值出发,为整个团队找到最佳的价值输出点。  今天,我们就从这个点出发,探讨测试团队的管理工作。  一般情况下,测试团队工作的服务对象,主要包括两个:一个是产品的最终用户,另一个是产品的研发团队,我们分开来说。  最终用户  产品的最终用户,最直观地感受着一款产品质量,测试团队测试的好坏与否,产品的最终用户最有发言权。  因此,如何让产品的最终用户的体验,来证明测试团队的价值,是测试团队最重要的工作之一。  从这...
            0 0 1464
            分享
          • 读者提问:我们公司的项目一个功能打一个版本分支,按理来说开发改问题的时候我们可以测其他功能的,但是开发又说不行。这样比较耽误测试时间,影响项目正常上线,不知道这是什么原因是造成的呢 ?阿常回答:建议增加一套开发环境通常每个开发会有自己的功能特性分支,然后有一个主分支是对应生产环境,另一个分支对应测试环境。猜测你们是缺少开发环境的,所以开发验功能只能在测试环境操作,这就耽误了测试人员验证其他功能。阿常碎碎念:以上问答始发于 2022/3/24 「软件测试圈」,来源于小布丁向阿常的提问
            0 0 1383
            分享
          •   最近和字节跳动的一个老朋友闲聊,感触颇深,据他说公司近期招聘的测试工程师,大多数候选人都有一个“通病”:在工作2-3年的时候遇到瓶颈,而且是一道很难跨越的坎。为什么会遇到这种情况?因为大部分测试工程师在工作了一段时间后,都可以完成最初的基本知识储备和基础技能积累,技术水平差距不大,通常集中在用例设计、测试执行的掌握程度上。  但如果一个测试工程师只局限于功能测试,只停留在手工点点点,一直沉浸于基础测试技能的熟练度,周而复始他当然会遇到技术瓶颈。很多人会认为这是一道很难过的坎,却不知,迈过去了,便是海阔天空,你会进入到一个更高的阶段,你会在这个区间继续成长为高端测试人才。迈不过去的人,就可能...
            0 0 347
            分享
          •   情景说明  小S是一名工作多年的软件测试工程师,工作中,对待他人的诉求能积极响应,也有一定的技术功底,但个人影响力需要提升:实际工作中默默地做了很多工作,也产出了不少工具,但他人感知不多,也缺少在各种场合进行推广和运营。  辅导过程  小Z:在多个场合,大家提及了你的个人影响力需要提升,今天聊一聊你在这方面的卡点是什么,看看需要我提供什么帮助?  小S:这是老毛病了。  小Z:怎么理解?  小S:知道自己有这个问题,是自己没有主动地寻求变化,让影响力持续提升。  小Z:那你知道影响力小和大这两者的差别吗?  小S:知道;有的事儿也会去提升影响力,但确实大多数事儿,没有产生好的影响效果。  ...
            0 0 533
            分享
          •   对于软件测试行业的伙伴来说,性能测试是一项十分重要的非功能性测试。那么,性能测试的操作流程又是怎样的呢?下面,我和大家分享下自己的经验吧。  性能测试首先要做的是性能需求分析,最好是选择用户操作最频繁的功能并且难度系数不是很高的操作来做性能测试,比如:登陆,搜索等。接着就是来确定性能指标,比如:  事务通过率为100%,90%的事务响应时间不超过5秒,并发用户为1000人,CPU和内存的使用率为70%以下。这些参数指标是需要结合实际的生产环境而制定的。  需求分析做完后,就要开始制定性能测试计划,从而明确具体测试时间,通常在功能稳定后进行。要视具体的情况来选择第几轮回归测试后进行...
            0 0 907
            分享
      • 51testing软件测试圈微信