移动端ui自动化测试和ci集成_【新书连载08】全栈软件测试自动化—移动端自动化测试实例与核心...

27269ac66c2876eb96084c2f4b5155fe.gif

出品 | 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所示。

ccdc855f24991b8de05b9ea8bc6a7162.png

  图3.1  下载Selenium Standalone Server的JAR包

  如图3.1所示,可以看到Selenium Standalone Server当前提供下载的版本号为3.4.0,只要单击那个链接即可下载。下载完毕后,可以得到一个文件selenium-server-standalone-.jar。有了这个jar文件之后,就可以很容易地通过一个命令行直接启动远程服务器。命令行如下。

 java -jar selenium-server-standalone-3.4.0.jar

  执行完毕后,可以看到图3.2所示的结果。

be05f6b7dd8c6c28a15a01e06700c034.png

  图3.2  通过命令行启动远程服务器

  在图3.2中,最后一行表示Selenium的服务器已经启动成功并处于运行状态。如果不确定服务器是否启动成功,可以直接打开URL(http://0.0.0.0:4444/wd/hub)验证其是否启动成功。图3.3所示的结果即代表启动成功。

a8691b8e9f394da6f2fb538be5af2113.png

  图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://:4444/wd/hub',             desired_capabilities=DesiredCapabilities.FIREFOX ) driver.get("网站URL") driver.quit()

       以上代码不难理解,通过调用webdriver下的Remote调用RemoteWebdriver对象。参数需要提供两个:第一个参数是服务器的URL,这里只需要把替换成启动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://: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://. The latest version can be downloaded from http:///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= -jar selenium-server- 

   standalone-3.4.0.jar

  利用以上方法可以添加多个浏览器支持,如用户可以直接一次性添加IE、Chrome和Safari等多个浏览器同时支持的服务器。方法是一样的,先下载对应的驱动器包,然后指定相应包的相对路径或者完整路径即可。

45a246add32abc6c5b0248210d3f7dbf.png

  图3.4  ChromeDriver下载页面

... ...

扫码/点击查看独家连载

50c8be2dd7b7efbf2388b102e85ffbbb.png

读者交流QQ群:470983754

61cee26f9c28f789c7a3c71a66babba5.gif

50ac059d4ab6f560dd333d8c20889cb3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值