• 1
  • 1
分享
  • 一文掌握:5大自动化测试难题及高效解决方案——软件测试圈
  • 饼干 2024-06-06 13:50:46 字数 3587 阅读 529 收藏 1

  各位小伙伴肯定会发现现在的测试岗招聘中或多或少要求会自动化测试技能了,伴随着整个测试行业的内卷,也要求所有从事测试的小伙伴掌握基本的自动化测试技能。但是很多人在刚开始学自动化测试时,会经常遇到一些棘手的问题,甚至抓耳挠腮也难解决,严重影响了学习进度,今天我就和大伙分享一下常见的问题及解决方案,希望能够对你掌握自动化测试有所帮助。

  一、元素定位像是玄学,时而准确时而报错,怎么精准定位呢?

  相信很多小伙伴对于几种元素定位方法应该都了然于胸了,如:ID定位,name定位,class定位,tag定位,XPath定位,CSS定位,Link定位,Partial link定位。像我就比较喜欢用CSS定位,感觉简洁美观,只有在ID定位可用,或者CSS定位不好用时才用其它定位方式。说到这肯定有小伙伴会说,XPath才是王道,对,此法确实能解决很多无法定位的情况,但是此刻我正想说如果此法也无济于事,那是什么原因导致的,又该如何是好呢?

  出现XPath定位不到元素的情况,原因有多种,我们要从多方面排查。可能有服务器的问题,有动态ID问题,有特殊字符和转义问题,有iframe问题,有页面操作逻辑问题,最最可能的是你自己写错了路径。

  1)什么是服务器问题呢,就是你写的路径是对的,但是代码请求后端服务器返回元素是有时间等待的,如果等待超过一定的时间,你的代码没有获取到对应的元素是会报错的,但是有时候网络特别好,又能抓到该元素,这就导致了时而能捕获,时而又失败的情况出现。如果是这种情况,只需要在代码中加入等待时间即可,如等待10秒就可以加上implicitly_wait(10)。

  2)什么是动态ID问题呢,就是元素的属性是动态生成的,特别是ID或Class属性,XPath 定位可能会受到影响,考这种情况可以虑使用其他属性或组合条件进行定位,或者使用包含关系来定位。

  3)如果 XPath 表达式中包含特殊字符,确保进行适当的转义。一些字符(例如空格、括号等)可能需要使用转义符 \ 来处理。

  4)Iframe的问题是你没有切换进入iframe中,这种情况比较容易发现,如果目标元素位于 <iframe> 或 <frame> 中,需要先切换到该 iframe 或 frame,然后再执行 XPath 定位。

  示例代码(使用 Selenium)

  iframe = driver.find_element_by_xpath("//iframe[@id='frameId']")
  driver.switch_to.frame(iframe)

  5)页面操作逻辑问题也会让你定位不到元素,也就是说必须要先出现其他元素或你要先操作一些步骤,你需要定位的元素才能出现,

  6)还有一种情况,你直接复制xpath,得到的是绝对路径,然后运行的过程中这个路径无效了,你也定位不到元素,这种情况可以考虑使用相对路径来解决。

  二、兼容性问题

  兼容性问题不仅出现在手工测试中,还经常出现在UI自动化测试中,比如你当时编写的自动化脚本在谷歌运行正常,可是一放到IE浏览器就出问题了,这就是在编写脚本时缺少浏览器兼容考量带来的问题,脚本中没有深层次的区分判断浏览器的品种问题,这个需要你仔细分析2种浏览器带来的不同地方,然后针对性的修改你的自动化测试脚本,在脚本中多写预判,多写容错机制。

  三、测试用例维护困难

  随着项目的发展和变更,UI自动化测试用例可能会变得难以维护和调试,(所以有些小公司对于中小型项目干脆采用接口自动化,甚至完全放弃自动化测试,其实掌握合适的方法,只要测试时间允许,都是可以采用UI自动化的。)以下是解决方法:

  1. 使用Page Object模式:将页面对象和操作封装成可复用的Page Object,减少测试用例中的重复代码。

  2. 定期更新测试用例:及时跟进需求和变更,确保测试用例与实际业务场景保持一致。

  3. 使用版本控制工具:使用Git等版本控制工具来管理测试代码,方便回滚、合并和团队协作。

  实例:

  使用Page Object模式可以有效地分离页面操作和测试逻辑,提高测试用例的可维护性和稳定性,例如:

  ```
  class LoginPage:
  def __init__(self, driver):
  driver
  def input_username(self, username):
  # 输入用户名...
  def input_password(self, password):
  # 输入密码...
  def click_login_button(self):
  # 点击登录按钮...
  # 在测试用例中使用Page Object
  login_page LoginPage(driver)
  login__username("username")
  login__password("password")
  login__login_button()
  ```

  四、测试用例执行顺序问题

  刚开始写自动化脚本的萌新可能经常苦恼于有时候测试顺序无法按照自己的意愿来,或者本来设置好的顺序也可能在执行时错乱,导致依赖关系无法正确处理,其实这个问题也简单,只需要使用测试框架提供的测试运行器或测试套件机制,确保测试用例按照期望的顺序执行。

  五、封装定位函数的时候,定位不了元素了,单独拿出来可以定位,一封装到函数中,就定位不了,这种该怎么办呢?

  这种情况大部分是参数输入到函数中被改变了,参数来一段字符串,然后进入到函数内,发现这个字符串变了,特别是直接把定位元素某个值,直接传入到参数中,特别容易出问题。建议定义变量储存这个字符串,然后通过变量传递到函数内,然后在函数内再次验证这个字符串,如果ok再进行元素定位,如果不ok,就要想办法处理字符串,处理成你想要的结果。

  其次就是建议在封装的函数中添加适当的异常处理,捕获可能发生的捕获可能发生的 NoSuchElementException 或其他异常,以便定位问题。打印相关信息帮助调试。

  示例代码:

  from selenium.common.exceptions import NoSuchElementException
  def find_element(driver, by, value, timeout=10):
      try:
          element = WebDriverWait(driver, timeout).until(
              EC.presence_of_element_located((by, value))
          )
          return element
      except NoSuchElementException as e:
          print(f"Element not found: {e}")
          return None
  还有就是作用域问题,如果封装的函数在切换了 iframe 或 frame 后执行,要确保在正确的作用域中进行元素定位。可以在函数中添加切换 iframe 的逻辑。
  示例代码:
  def find_element_in_frame(driver, frame_id, by, value, timeout=10):
      driver.switch_to.frame(frame_id)
      element = WebDriverWait(driver, timeout).until(
          EC.presence_of_element_located((by, value))
      )
      driver.switch_to.default_content()  # 切回主文档
      return element

  总结:

  做好自动化测试除了需要细心,耐心的品质,更需要在编程方面打好基础,无论是基于Python的自动化还是基于Java或者其它的自动化都是如此,一定要深入专研这门语言,了解语言的特性,这样才能在出现问题的时候有方向有思路去解决,多看看开发们写的代码对我们自动化软件测试工程师是有非常大的帮助。同时也要掌握多个自动化框架,如Robotframework、unittest、Pytest等等,知道根据项目的体量和特点灵活采取适合的自动化框架。只有做到这些,我们才能在自动化测试中游刃有余!


作者:有房车的直男    

来源:http://www.51testing.com/?action-viewnews-itemid-7801125

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 如何进行需求管理?需求采集、需求分析、需求筛选、需求处理这4个步骤有什么成体系的方法吗?有适合的工具进行管理吗?可以介绍一下工作中的具体方法吗?结合上面的问题,我们来具体了解一下需求管理,需求管理源于业务需要,始于需求挖掘,继而需求分析,需求定义,需求验证。周而复始。一、业务需要说明需求产生的原因,可能是高层制定的目标,中层对工作流程的调整,基层碰到无法解决的问题,用户需要,外部环境变化,竞争对手策略变化或者政府政策调整等。需求人员在明确业务需要时,首先明确干系人,其次获取干系人要求/需求。可以采用的方法包括:行业基准(竞品),业务规则分析(产品分析),头脑风暴,焦点小组,功能分解,根源分析等...
            0 0 843
            分享
          • 测试人员应该具备的几种思维方式1、逆向思维方式逆向思维在测试中用的很多,比如将根据结果逆推条件,从而得出输入条件的等价类划分;其实逆向思维在调试当中用到的也比较多,当发现缺陷时,进一步定位问题的所在,往往就是逆流而上,进行分析;逆向思维是相对的,就是按照与常规思路相反的方向进行思考,测试人员往往能够运用它发现开发人员思维的漏洞。2、组合思维方式很多东西单一的思考都没有问题,当将相关的事物组合在一起却能发现很多问题;如多进程并发,让程序的复杂度上了一个台阶,也让程序的缺陷率随之而增长;按照是否排序组合可以分为:排列(有序)和组合(无序);针对不同的应用,可以酌情考虑使用“排列”或者“组合”;为了...
            13 13 1130
            分享
          •   一.APP兼容性测试的必要性  APP兼容测试即是移动端的手机客户端兼容测试。APP测试者为了保障不同系统及版本、不同网络制式、不同分辨率和厂商(不同深度定制的ROM)、不同版本都能够有很好的用户体验而面临巨大挑战。所以APP兼容性测试也是测试质量保障任务中的重要环节。  二.APP兼容性考虑维度  三.使用云测工具进行兼容性测试  1.测试平台地址:阿里云(mqc):http://mqc.aliyun.com  2.云测工具测试内容:智能UI适配,安装/卸载/更新,性能监控:启动时间/CPU消耗/内存消耗等。  备注:工具推荐的是开源的体验版,减少10%的工作量,是通用功能的兼容性测试,...
            12 12 1624
            分享
          •   当我们需要在互联网上搜索一些信息时,往往会选择使用搜索引擎来获取更加准确和丰富的信息。Google搜索引擎是全球最大的搜索引擎之一,拥有着极其庞大的数据库和算法,可以根据关键词搜索出大量的相关信息。但是,当我们需要采集搜索结果中的URL时,手动复制粘贴会非常繁琐。因此,本文将介绍如何使用Python编写爬虫程序,自动爬取Google搜索结果中的URL。注意:谷歌爬取是要代理。  前置条件  在开始编写爬虫程序之前,需要确保已经安装了Python编程环境和一些必要的Python库,比如requests、re等。可以使用pip命令来安装这些库。  爬虫程序的实现  首先,我们需要设置请求头信息...
            0 0 232
            分享
          • 前言做为一个压测工具(库),[locust](http://locust.io/) 其实解决这么一个问题:AB 之类压测工具不能编写复杂的因果逻辑,而现实场景中,待压的服务往往是有一套完整执行流程的,比如 APP 要访问一个 API,是需要先鉴权(验明不是非 APP 访问),再登录换 Token,然后才是 API 调用……这一切,在 locust 中都很容易实现,本质上,应用 locust 做压测,就是在写 Python 程序,只是它集成了一套不错的 UI,外加并发的benchmark功能。至于写个压测为什么要用Python,是因为:这玩意心智负担低,你谷歌SO复制粘贴一把梭,直接上...
            0 0 2196
            分享
      • 51testing软件测试圈微信