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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 什么是自动化测试?自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。为什么做自动化测试?1)对个人来说随着时代科技的进步,越来越多的工作偏向于了自动化,软件测试当然也不例外。从发展的趋势来说,只有不断的提升自己,面对各种变化,才可以追上科技的进步。手动测试虽然是基础,但是企业不会在乎你的过程。只有高效率的工作才会让企业觉得你更有价值。自动化测试是软件测试的主流,也是软件测试的高薪专场!2...
            0 0 1568
            分享
          •   下面10个Python初学者常犯的错误,并不是真正的代码错误,代码照样可以运行,但是不够Pythonic,因为Python有自己的语言哲学,在代码的处理上有传统语言无法比拟的简洁性和便捷性。  1.  真值比较  初学者经常在if语句中使用==比较符来判断表达式是否为真值。  这是一种冗余的写法,其实你可以直接对变量进行检查。  2 . 字符串连接  很多初学者教程中,他们会告诉你字符串连接直接使用+操作符。  一种更优雅的写法是使用f-string方式,将变量放置在{} 中,该方法能让代码清晰易读,因为你不需要针对非字符串变量做强制转换了。  3. open()、close()...
            0 0 877
            分享
          • 今天主要谈谈职场感悟,在职场跟在家或者与朋友亲人相处还是很不一样的,在职场上,可能会有各色各样的人,大家在一起共事是为了完成一个共同的目标。可能私下里有人的行为让你很看不惯或者很不理解,但是做好自己的事情,与同事配合好才是最重要的,减少对他人的评判。测试岗位的门槛可能相对较低,于是从事这个工作的人也就是五花八门的,并且每个人性格都大相径庭,那我身边遇到的人和事来展开说说:我们公司来了两个00后测试实习生,打扮的很新潮,对于他们的一些举动我还是很不能融入的,比如吃饭的时候特别喜欢拿鬼畜的视频下饭,我就觉得挺魔怔的。再比如,他们追星,是那种很多中年人不理解养成式的追星,或者开盲盒。我虽然能理解,但...
            5 5 6622
            分享
          • 读者提问:什么是测试左移,什么是测试右移 ?阿常回答:一、测试左移测试左移就是在测试阶段到来之前,尽可能的抓紧开发前(需求分析)和开发中的时间做测试,提前发现问题,防微杜渐,避免积重难返。在需求源头就要控制伪需求,在代码设计阶段就要控制劣质代码。二、测试右移测试左移是往测试之前的开发阶段移,测试右移是往发布之后移,也就是产品上线了之后也可以进行一些测试活动。当然在生产环境直接做测试是不推荐的,但可以在生产环境做监控,监控显示性能和可用率,一旦发现任何问题,尽快反应,在用户发现之前,把问题解决了。关于左移和右移企业常见的做法,可参考@IDO老徐写的这篇文章如果能把功能测试涉及的这些都搞...
            0 0 1921
            分享
          •   前言  现今的互联网产品越来越注重可靠性,尤其是在生产环境中使用的系统,对高可用性都有一定的要求。而作为产品的提供方,在交付产品之前,也会对高可用进行验收测试。近期跟进过两个产品曾有高可用测试的需求,在此简单的总结分享下。  在介绍产品之前,先简单的介绍下高可用和高可用测试:  高可用:指的是系统如何保证比较高的服务可用率。在系统的某个部分因为各种原因而失效时,能保证系统整体的服务正常运行。  高可用测试:通过模拟系统出现异常的情况,验证系统是否能正常提供服务(或降级提供服务),并验证系统在异常恢复后,能否恢复至异常出现之前的运行状态。  产品A:云计算PAAS层组件  产品A为云计算的P...
            0 0 1666
            分享
      • 51testing软件测试圈微信