• 0
  • 0
分享
  • 元素定位成功,但点击失败?3个方法帮你解决!——软件测试圈
  • 曼倩诙谐 2023-12-07 11:33:33 字数 2624 阅读 815 收藏 0

  随着前台开发技术的不断升级,在使用Python+Selenium进行自动化测试时,也会遇到各种各样的问题,其中最常见的一种就是元素能定位到,但是无法点击或者点击失败,那么这篇文章就来讲述一下如果遇到元素定位成功但是点击失败的情况该如何解决。

  Selenium中,最常用的元素点击方法是element.click(),根据以往的自动化的测试经验来说,此方法适用于绝大多数的点击操作,那么如果遇到点击失败的情况,我们应该怎么解决呢?

  方法1:设置等待时间。

  最常见的元素点击失败的情况,造成的原因最多的就是元素未加载完成。

  举个例子,点击产品进入产品详情,再点击加入购物车按钮,代码如下:

  self.driver.find_element(By.NAME,"product").click()--点击产品名称进入产品详情
  self.driver.find_element(By.NAME,"add-to-cart").click()--点击“加入购物车”按钮执行脚本时,提示没有这个元素

1.png

  原因是点击产品名称后,服务器需要有一个反应时间,才能将详情页的所有元素都加载出来,这里点击产品后就立即点击加入购物车,这时候“加入购物车”按钮还没有加载出来,所以会提示找不到元素。

  解决方法:

  1、使用sleep(),设置强制等待时间,强制等待多少秒之后再执行点击操作。此方法比较死板,不管元素是否加载出来,都会等固定的时间,可能会出现等待了固定时间后元素还是未加载出来的情况,也有可能会出现未到固定的时间元素已经加载完成但是还继续等待的情况。

  2、使用隐式等待driver.implicitly_wait(time),此方式设置一个最大等待时间,会一直等待元素出现再点击,如果元素出现,就不再等待了。此方式较sleep()来说比较灵活,但是会出现元素已经出现但是是不可点击的情况,如果遇到这种情况,点击也会报错,隐式等待只能解决部分问题。

  3、使用显式等待。使用显式等待,既不会造成等待时间的冗余,又能保证等待元素可点击了再进行下一步操作,缺点就是比较麻烦。

  方法2:模拟键盘操作。

  如果使用方法一之后,依然未解决问题,我们再试试模拟键盘操作来进行点击。举个例子,我们模拟一下登录场景,如下:

1-1.png

  代码如下:

    def login001(self):
        self.driver.get("https://xxxxxxxxxxxxxxxxx")
        time.sleep(3)
        self.driver.find_element(By.NAME,"username").send_keys("用户名")
        self.driver.find_element(By.NAME,"password").send_keys("密码")
        self.driver.find_element(By.NAME,"login").click()

  运行代码后,报错信息提示如下内容:

  selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <span>...</span> is not clickable at point (647, 497). Other element would receive the click: <div data-v-840ce3b2="" class="container">...</div>

  出现这种错误的原因有可能是在按钮上面还有其他元素遮挡,导致点击此元素时实际上是点击到了该元素上层的元素,导致点击无效,出现这种情况,我们可以尝试使用模拟键盘操作来避免点击到其他元素。

  代码如下:

  def login001(self):
          self.driver.get("https://xxxxxxxxxxxxxxxxx")
          time.sleep(3)
          self.driver.find_element(By.NAME,"username").send_keys("用户名")
          self.driver.find_element(By.NAME,"password").send_keys("密码")
  ActionChains(self.driver).send_keys(Keys.ENTER).perform()

  再次运行代码,则可登录成功。

  方法3:使用javascript进行点击。

  如果按照方法一、方法二中的方法,元素还是点击失败,如下案例:

1-2.png

  场景是:点击下拉框,从下拉框中选择搜索条件,并进行搜索。

  使用.click()方法,会提示如下错误:

1-3.png

  当想使用模拟键盘操作时发现,这种情况跟登录不一样,登录时鼠标有定位,可直接使用Keys.Enter进行操作,但是此场景鼠标没有定位,无法使用。

  那么我们可以再尝试使用javascript来解决这个问题,使用javascript执行点击操作,不会受到元素遮罩的影响,只要能定位到元素,就能执行点击操作。

  使用方法:

  color_loc=self.driver.find_element(By.CLASS_NAME,"color")
  self.driver.execute_script("arguments[0].click()",color_loc)

  使用此方法运行脚本通过

  但是这种方法有一个缺点,有一些系统错误暴露不出来,举个例子来说:

1-4.png

  假如我们要对这里进行设置,设置完成之后,再去录入关键字进行搜索,如果使用javascript进行操作,即使我们保存设置的时候,提示了错误信息,并且设置页面也没有关闭的情况下,javascript依旧可以对下面的页面进行操作,而不是提示出错误来。但是如果其他点击方法无法正常工作的情况下,也只能通过这种方式进行点击。

  以上是我在日常的工作中总结的几点经验,希望对大家能有所帮助。


作者:CICI    

来源:http://www.51testing.com/html/08/n-7798708.html

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 在构建软件系统时,测试是软件开发工作流程的必不可少的部分之一。作为软件开发人员,都希望编写的程序按预期工作。程序没有BUG,测试可以协助这个目标的达成。本文将讨论一种称为单元测试的测试方法。什么是单元测试?应该如何实施?单测优点和局限性是什么?什么是单元测试单元测试的目标是隔离程序的每个部分并显示各个部分按预期工作。单元测试是由软件开发人员编写和运行的自动化测试,以确保应用程序的一部分(称为单元)按预期工作。单元是可以在系统中逻辑隔离的最小代码段。这可以是单个函数、方法、过程、模块、类或对象。通常,一个单元有几个输入和一个输出。单元测试由软件开发人员在应用程序的开发(编码阶段)期间完成。只有各...
            0 0 511
            分享
          • 写在前面今天算是在北京最安安稳稳的一个周末,从周五开始陆陆续续和不同的朋友吃了饭,想起来之前落下的文章还没写。等到项目忙起来的话,没有时间来总结,自然又要忘记,姑且先下笔乱诌个提纲出来。从4月中旬下定决心换工作,到6月末如愿入职阿里,这场社招面试持续了三波。由于我下一站毫无商量余地的选择北京,从第一次裸面,到痛定思痛准备之后的第二波,再到坚定不移的第三波,自己简直身心俱疲。不过真的是感觉收获满满,无论是测试相关的测试方法和测试理论,还是认识测试开发的能力要求,都有了一定的积累和努力方向。所以这篇日志大概有以下内容:总结互联网测试/测试开发常见面试内容对测试/测试开发的理解未来的学习规划对有志于...
            2 4 2994
            分享
          • 接上文,下面继续介绍Jmeter的测试元件。1.定时器         默认, JMeter线程发送出的每个请求是不间断的。我们建议你通过添加一个可用的定时器到你的线程组里来指定延迟时间。如果你不添加延时,JMeter可能在较短的时间内发送大量的请求致使你的服务器瘫痪。         定时器将导致JMeter在线程组里,在每个请求间,延迟一定时间。     &nbs...
            0 0 622
            分享
          •   当前,我国金融体系内交易量持续增长,业务场景日趋复杂。系统交易量的增加,临时产生的集中业务需求,都会使服务器面临考验,因此,需要对系统进行性能测试。在金融系统中,报文处理是必不可少的。各大金融机构间通过报文的交换进行信息流的传递,从而最终实现资金的跨机构流转。在对金融系统的性能测试中,自然也少不了与报文打交道,而性能测试往往伴随着大量数据准备。那么,如何高效地生成大量报文呢?  试想这样一种场景:某金融机构需在特定时间内进行一波资金划转,该业务是新增交易,且交易数量较大,需要准备大量报文对服务器进行性能测试。数据的准备有很多方法,其中Python由于易上手且兼具灵活性而逐渐受到测试工程师们...
            0 0 945
            分享
          • 安装插件JunitGeneratorfile-setting-plugins下载Junit的相关jar包链接https://github.com/junit-team/junit4/wiki/Download-and-Install分别点击上面两个链接,然后选择下面第一项jar。(第二项是帮助文档,第三项是Maven配置文件,第四项是源码,有需要可下载。)将下载的jar包添加到项目File -> Project Structure->Modules-> Dependencies找到刚刚的下载目录,添加jar包添加完成后,需要有以下俩包:实例建立和src文件夹同目录的test文...
            0 0 1107
            分享
      • 51testing软件测试圈微信