项目中常用Web控件—全栈软件测试自动化(7)

发表于:2020-7-02 09:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:赵旭斌 余杰    来源:51Testing软件测试网原创

  2.3  项目中常用Web控件
  作者在《精通QTP自动化测试技术领航》中花费了大量的精力构思如何讲解控件的自动化,因为这真的是一个难点。但是,我们不得不勇敢地去攻克这个学习难点,因为界面上的自动化测试整天在和控件“打交道”。无论是之前的QTP还是现在的Selenium或是未来的某个工具,我们都需要做这件事情,不同的仅仅是换了一个工具来做相同的事情罢了。
  2.3.1  WebElement—WebDriver的基层元素
  在讲解常用Web控件之前,我们先来了解一个重要的Selenium对象,即WebElement。在Selenium中,任何测试对象都会被识别成WebElement,而这个WebElement就是一个Selenium的标准对象类。任何需要操作的对象都需要事先获取到这个类之后才可以进行操作,这就好比我们要去健身房健身,健身房里有很多项目,如跑步、瑜伽、游泳等。但是,我们都知道,健身房是需要办年卡或者月卡的,而这个会员卡就好比刚刚提到的WebElement对象,有了这张会员卡,我们才可以去跑步、练瑜伽、打网球等,凡是会员卡范围内的项目,我们都可以参与。同样的道理,在获得WebElement对象后,我们就可以对控件进行想要做的操作了,WebElement对象提供的方法我们都可以使用。因此,了解这个对象非常重要。一旦掌握WebElement,就基本上掌握了70%的控件对象,而且后续的大多数控件会围绕这个对象来进行讲解。我们先来看一下Python官方的源代码是怎么解释这个对象的,如图2.17所示。
  WebElement的作用及其定义如下。
  图2.17  WebElement官方原版定义
  官方的内容翻译过来大致就是,WebElement代表一个DOM元素,所有需要与页面元素进行交互的操作都需要通过这个接口来进行,如果你觉得这句话直接翻译过来还是比较难以理解,那么我们还是用健身房的例子来解释,即如果我们想要在健身房玩各种项目,我们就必须要有健身卡这个关键“接口”。
  其实后面一段说明也很重要,所以这里专门解释一下。原文如下。
  “All method calls will do a freshness check to ensure that the element reference is still valid. This essentially determines whether or not the element is still attached to the DOM. If this test fails, then an “StaleElementReferenceException” is thrown, and all future calls to this instance will fail.”
  译文如下。
  “所有的方法调用都会做一个新鲜度检查以确保对象的引用仍然是正确的,从本质上说就是决定元素是否仍然依附在DOM中。如果验证失败,那么就会抛出一个叫作StaleElementReferenceException的异常,且之后所有的调用全部失效。”
  虽然作者已经完整地把原文翻译了,但是读者可能还不理解,更通俗的解释如下。
  当脚本在页面中通过locator获取到一个指定的WebElement对象后,可能没有立刻对这个对象进行操作,而是隔了一段时间,这个对象过期了(其实就是引用发生了变化,后续我们会提供实例说明什么是对象引用发生了变化)。此时如果再次使用这个过期的对象,即使locator与页面上的对象完全匹配,脚本也会抛出异常。
  可能大多数读者还是不太明白,那我们再借助健身房的例子来讲解。这个例子就好比我们去健身房骑动感单车,动感单车是有一个阻力阀的,我们可以调节适合自己的阻力挡位来进行练习。假设有一天你准备健身并到健身房的动感单车房间占好了位置,选择了一辆动感单车,调节好了适合你的阻力挡位,准备开始锻炼了。在此之前大家往往会做一件事—上洗手间,毕竟后面要进行30min的连续单车锻炼,而就在你上洗手间的时候,有一个顽皮的孩子把你的阻力挡位调节到了最大,这下就“有趣”了。回来后,你还是选择使用原来你已经事先“占领”的单车,并且完全不知道阻力挡位已经被偷偷更改了这回事,相信第一脚踩下去时你就已经“尴尬”了。
  开始进入正题,我们来分析一下,假设当时你没有去洗手间,调节完阻力阀后直接就骑了,那样一定没有问题,这个就好比当我们获得WebElement后直接对这个对象进行操作是完全没有问题的,脚本也不会抛出任何异常(因为阻力阀是你刚刚调节好的,没有人修改过)。接着,我们去洗手间,坏小孩趁机修改了我们的阻力阀,这就代表着阻力阀已经不是原来你调节的那个值了,因此自己就骑不动了。同样地,对于WebElement来说,某些情况会导致页面对象被修改(此处的修改并不是对象的属性被修改,而是某些时候JavaScript会删除页面的对象并重新生成一个新的动态ID相同的对象),虽然对象的locator完全相同,但是这个对象已经不再是原来的那个对象了。通过上述示例,相信读者应该能明白大致的意思了,在后续章节中,我们还会通过实例详细讲解,这里就不多介绍了。
  WebElement对象下的三大行为类型如下:
  交互操作行为;
  查找子元素行为;
  对象属性检查行为。
  1.交互操作行为
  这个类型是最简单的一个类型,在项目中使用的频率也是最高的。这个类型很简单,是因为它提供了一些单击、输入等操作方法,如click、send_keys等,后续的章节会针对不同的类型控件一一讲解相应的操作。
  2.查找子元素行为
  查找子元素行为就是在当前这个对象的基础上查找其子对象。在图2.18所示的WebElement对象源代码中,可以看到各种find_elmentXXX对象。
  在图2.18中可以看到,脚本不但支持查找单个子对象,还支持查找多个子对象。查找单个子对象直接返回另一个WebElement对象;而查找多个子对象返回一个含有多个WebElement类型的List对象。关于子对象的处理在本章的后续部分也会进行讲解。
  3.对象属性检查行为
  例如,is_displayed、is_enabled等表示对指定属性进行检查。当然,读者可以自己指定检查的属性,如get_attribute方法,可以通过指定属性名获取对应的属性值。
  关于以上三大行为类型,本章后续部分会详细讲解,并针对不同种类的Web控件操作提供丰富的实例代码,让读者能够更加深入地了解控件的常用操作方式。
  图2.18  查找各种子元素的官方源代码

查看《全栈软件测试自动化 Selenium和Appium (Python版)》全部连载章节
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号