移动端自动化测试实例与核心—全栈软件测试自动化(8)

发表于:2020-7-06 09:27

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

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

  第3章 移动端自动化测试实例与核心
  原理剖析
  3.1 引言
  本章会讲解Selenium远程执行的原理,包括常用的Selenium Grid及云端执行等;然后通过两个经典实例讲解移动自动化测试工具Appium。
  本章从始至终都会贯穿一个核心内容—Desired Capabilities(Desired Caps),只有掌握了它的核心原理,读者才能游刃有余地按照自己的想法在测试中使用Selenium和Appium。
  3.2 Desired Caps与Driver-Selenium的原理
  3.2.1 无所不能的Desired Caps
  Desired Caps往往是一个被很多测试工程师忽视的对象,但是它的功能很强大。它是所有需要执行自动化测试的平台入口。有了它,我们可以轻松定义远程机器上需要执行的浏览器名称、版本号,以及针对不同浏览器的各式各样的配置;有了它,我们可以在移动领域中轻松定义当前需要运行在iOS还是Android上,以及OS需要运行在模拟器还是真机上,如运行在iPhone 7、iPhone 8或者iPhone X上,甚至Apple TV上;有了它,我们甚至可以在Sauce Labs上指定运行想要的任何平台、任何版本号,无论是在移动端还是Web端,都可以虚拟出一个对应的实例供测试执行。
  3.2.2 不同驱动器的底层实现原理
  读者一定很想知道为什么Selenium这么强大,可以做到这么多事情。其实Selenium本身并不强大,如果没有各类驱动器(ChromeDriver、GeckoDriver、IEDriver等)的支持,那么Selenium几乎是一无用处。为什么用Selenium可以轻松集成各种主流浏览器?这是因为Selenium如今扮演的角色已经远远不只是一个工具那么简单,它已经成为一个标准、一个平台。Selenium提供了一种叫作JsonWireProtocol的统一协议,所有支持的浏览器驱动器都会根据JsonWireProtocol协议接口来实现浏览器自身的自动化行为,最终封装成一个驱动器。也就是说,只要遵守这个协议接口的驱动器都可以与Selenium无缝集成,这是一个非常巧妙的设计,同时测试工程师完全可以自行开发一个自定义的驱动器与Selenium结合使用。
  3.2.3 Selenium的运行原理
  明白了所有的驱动器都是根据Selenium的JsonWireProtocol来实现的以后,那么这些驱动器又是如何与Selenium进行集成的呢?
  简单地说,完整的Selenium其实包含两部分,一个是执行端部分,也就是客户端,另一个是服务器端。
  什么是客户端?我们平时写的Selenium测试脚本就是Selenium的客户端脚本。那么什么是服务器端?所有实现了JsonWireProtocol协议的驱动器即为服务端。当Selenium指定了某个浏览器执行自动化测试之前,会找到对应浏览器的驱动器,并启动这个驱动器(作为服务器端)。当客户端脚本执行输入或者单击操作时,它会发送一个正确的请求给对应驱动器所启动的服务器端,由服务器端最终执行自动化测试操作。因此,真正的自动化执行者是驱动器,Selenium只是负责提交指令给对应的驱动器。再通俗点,当脚本执行到send_keys操作时,脚本会发送一个请求,告诉服务器:“嘿,驱动器老兄,请帮我执行send_keys操作,谢谢!”驱动器收到请求后会立即执行对应的操作,并回复说:“执行完毕,操作已成功!”
  当然,如果驱动器在操作时出现异常,也会回复信息给客户端,让客户端抛出对应的异常信息。这就是Selenium的基本运行原理,在了解了这个原理之后,读者在阅读后面的内容时便会更加易于理解。
  3.2.4 利用Standalone Server远程执行测试脚本
  提到远程执行测试脚本,就不得不提Selenium提供的“大名鼎鼎”的Standalone Server包,它的主要功能是让Selenium具有远程执行的特性。最神奇的是,远程执行的机器并不需要执行任何自动化测试代码,只需要通过一个命令行启动一个服务器,即可完成整个远程操作。
  在正式开始之前,首先需要下载Standalone Server的jar包,页面样式如图3.1所示。
  图3.1  下载Selenium Standalone Server的JAR包
  如图3.1所示,可以看到Selenium Standalone Server当前提供下载的版本号为3.4.0,只要单击那个链接即可下载。下载完毕后,可以得到一个文件selenium-server-standalone-<版本号此处为3.4.0>.jar。有了这个jar文件之后,就可以很容易地通过一个命令行直接启动远程服务器。命令行如下。
 java -jar selenium-server-standalone-3.4.0.jar
  执行完毕后,可以看到图3.2所示的结果。
  图3.2  通过命令行启动远程服务器
  在图3.2中,最后一行表示Selenium的服务器已经启动成功并处于运行状态。如果不确定服务器是否启动成功,可以直接打开URL(http://0.0.0.0:4444/wd/hub)验证其是否启动成功。图3.3所示的结果即代表启动成功。
  图3.3  验证服务器启动成功
  那么启动完服务器后该怎么使用它呢?下面介绍一下这个服务器具体是什么及它的具体作用。
  Selenium支持市场上绝大部分的浏览器,有很多针对不同浏览器的专有驱动器,如FirefoxDriver、ChromeDriver、IEDriver等。除了这些驱动器之外,还有RemoteWebDriver,这是所有驱动器中最特殊的一个,因为其他驱动器能做到的它都能做到,而其他驱动器做不到的它同样也能做到。我们接着看一下如何使用这个驱动器。实现代码如下。
   from selenium import webdriver
  from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  driver = webdriver.Remote(
  command_executor='http://<server_ip>:4444/wd/hub',
  desired_capabilities=DesiredCapabilities.FIREFOX
  )
  driver.get("网站URL")
  driver.quit()
   以上代码不难理解,通过调用webdriver下的Remote调用RemoteWebdriver对象。参数需要提供两个:第一个参数是服务器的URL,这里只需要把<server_ip>替换成启动Standalone Server JAR包的那台服务器的IP即可;第二个参数是进行自动化测试的浏览器名称,由于DesiredCapabilities类已经提供了对应的浏览器,因此可直接使用这个类完成指定浏览器的选择。
  这样最终得到的驱动器就是一个远程的RemoteWebdriver对象,之后的操作步骤与之前讲过的其他普通浏览器的驱动器的使用方式完全一样,在此就不再进行阐述了。
  3.2.5  添加Chrome浏览器的支持
  首先,我们把 3.2.4 节代码段中的 DesiredCapabilities 下的 FIREFOX 直接改成CHROME。代码如下。
   from selenium import webdriver
  from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  driver = webdriver.Remote(
  command_executor='http://<server_ip>:4444/wd/hub',
  desired_capabilities=DesiredCapabilities.CHROME
  )
  driver.get("网站URL")
  driver.quit()
  除了把FIREFOX改成CHROME之外,代码几乎没有任何其他改动。运行以上代码后会发现出现了如下异常。
  Exception: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see https://<ChromeDriver相关网站>. The latest version can be downloaded from http://<chromedriver下载网站>/index.html
  原因很简单,因为我们并没有引用ChromeDriver,测试脚本在试图启动Chrome之前会首先寻找ChromeDriver这个文件。读者应该记得之前所提到的ChromeDriver是服务器端,Selenium需要在服务器端正常启动后才能运行,如果我们在测试脚本中没有指定它,Selenium自然不可能找到ChromeDriver这个文件,从而不能正常启动服务器端。因此,我们首先需要从ChromeDriver官网下载ChromeDriver,图3.4所示为下载页面。
  如图3.4所示,当前ChromeDriver版本为2.30,下载后将其解压。接下来有两种方法:第一种方法比较容易,直接复制ChromeDriver文件到Standalone Server jar包的同级目录下即可,既快速又容易,一般都会采用这种简单的方式;第二种方法是通过指定webdriver.chrome.driver系统属性来告诉Selenium具体存放ChromeDriver的路径,该方法也很简单。之前启动Standalone Server的时候使用如下命令行。
 java -jar selenium-server-standalone-3.4.0.jar
  这里只需要在命令行里增加系统属性参数即可,命令行如下。
   java -Dwebdriver.chrome.driver=<chromedriver的相对路径> -jar selenium-server-
  standalone-3.4.0.jar
  利用以上方法可以添加多个浏览器支持,如用户可以直接一次性添加IE、Chrome和Safari等多个浏览器同时支持的服务器。方法是一样的,先下载对应的驱动器包,然后指定相应包的相对路径或者完整路径即可。
  图3.4  ChromeDriver下载页面
  这种方法可让用户自行指定ChromeDriver的路径,相比之前的方法更加灵活,因此,建议读者使用第二种方法,从而使各类驱动器的路径可配置化。无论使用哪一种方法,我们再次执行之前失败的测试脚本,看一下结果会如何,如图3.5所示。
  图3.5  创建Chrome的会话
  如图3.5所示,这一次我们可以清楚地看到,服务器的日志显示了已成功创建的Chrome的会话,且没有任何错误信息出现,Chrome也成功跳转到指定网站并关闭了浏览器,最终测试脚本运行完毕。
  以上测试脚本用到了DesiredCapabilities这个类—告诉Selenium哪一个浏览器才是我们需要运行的。为了更深入地了解其原理,查看一下这个类的源代码,如图 3.6所示。
  图3.6  DesiredCapabilities类的源代码
  从如图3.6所示源代码中可以非常清楚地看到,DesiredCapabilities类包含了字典对象,其中每一个字典对象都包含了对应的browserName、platform。为什么Version都是空的?其实答案就在代码注释里,如图3.7所示。
  图3.7  DesiredCapabilities类的源代码注释
  DesiredCapabilities主要用于连接Selenium Server及Selenium Grid。这里的注释提供了一个样例,当我们需要使用Firefox浏览器的时候,只需要使用DesiredCapabilities.FIREFOX.copy复制一个Firefox的字典对象,再将platform和version改成我们想要的设置,这里设置为Windows 10系统,最后将全新且完整的字典对象传入Remote Webdriver类的构造器中,即赋值给desired_capabilities。
  在上述实例,我们完全可以自己创建一个字典对象,直接传入Remote Webdriver类的构造器中。让我们来试试看,首先创建如下字典对象作为DesiredCapabilities对象。
  caps = {"browserName": "chrome"}
  caps是一个非常简单的字典对象。通过这行代码,我们直接定义一个browserName项及Chrome浏览器,接着把它们传入RemoteWebDriver类的构造器中并初始化,实现代码如下。
   driver = webdriver.Remote(
  command_executor = 'http://<server ip>:4444/wd/hub',
  desired_capabilities = caps)
  在server ip中填入对应服务器的IP地址,就可以成功初始化了。完整的代码如下。
   from selenium import webdriver
  import time
  caps = {"browserName": "chrome"}
  driver = webdriver.Remote(
  command_executor = 'http://<server ip>:4444/wd/hub',
  desired_capabilities = caps)
  driver.get("网站URL")
  time.sleep(2)
  driver.quit()
  注意,此处无须再导入DesiredCapabilities类,因为这里已经使用了自定义的字典对象来代替它。运行以上脚本,会成功打开Chrome浏览器,跳转到指定网络并最终关闭。

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号