前端自动化测试漫长路之——Selenium初探

引言

最近想解决前端开发或测试中的两个问题:一是界面UI的布局适配,能否在测试的过程中,通过命令操作真机打开相应页面然后截屏,通过对图片识别分类,发现有问题的图片,然后及时修复;二是页面性能分析,很多时候页面只能在指定的Webview中使用,能否直接通过命令打开指定的页面,分析页面在真实APP中的性能,并生成报告。这两个问题的前提就是通过命令直接操作手机App,带着问题找线索,于是我就结识了Selenium,下面将结合实例和大家分享一下。

Selenium是什么?

先看一下官网的解释:

Selenium automates browsers. That‘s it! What you do with that power is entirely up to you. Primarily, it is for automating web applications for testing purposes, but is certainly not limited to just that. Boring web-based administration tasks can (and should!) be automated as well.

Selenium has the support of some of the largest browser vendors who have taken (or are taking) steps to make Selenium a native part of their browser. It is also the core technology in countless other browser automation tools, APIs and frameworks.

从上面的话我们可以知道3个点:

  1. 利用Selenium可以自动化操作浏览器,来实现web程序的自动化测试;
  2. Selenium是一个综合性的项目,提供了提供了不同语言版本的类库和工具,来支持浏览器的自动化;
  3. 主流浏览器基于W3C规定的的Web Driver规范,提供了相应的Web Driver,而标准的主要技术支持来源于Selenium项目。

一图胜千言,Selenium在自动化测试中扮演的角色如下图所示:

Selenium如何用?

我们的诉求是通过脚本控制本地和手机上的浏览器,甚至APP中的Webview,Selenuim正好提供了WebDriver API供我们使用。从上面可以知道Selenium支持多种语言,如python、go、javascript等,对于前端而言,首选当然是javascript。以下是相关的操作步骤:

环境准备

该环节主要是两步:

  1. 在项目中下载selenium-webdriver

    npm install selenium-webdriver --save
  2. 下载浏览器提供的WebDriver,并将该命令文件放置在系统变量PATH下

    我使用的是chrome的WebDriver,针对不同的chrome版本,需要下载不同版本的WebDriver,否则程序会报错。网上有好心人已经整理出了chrome的WebDriver与chrome的版本映射表,可以点击查看

代码编写

selenium-webdriver的说明文档相当的赞,在selenium-webdriver包的目录下有几个文件:chrome.js、edge.js、ie.js、phantom.js等,这些都是selenium-webdriver针对不同的浏览器的webdriver的调用做了封装,打开chrome.js,在文件的开头有详细的文档说明。

chrome.js中提到了3种使用场景:分别是Headless Chrome、Customizing the ChromeDriver Server、Working with Android。而我需要的场景就是Working with Android。

实例代码如下:

let chrome = require(‘selenium-webdriver/chrome‘);
let {Builder} = require(‘selenium-webdriver‘);
let driver = new Builder()
          .forBrowser(‘chrome‘)
          .setChromeOptions(new chrome.Options()
              .androidPackage(‘com.example‘)
              .androidActivity(‘com.example.Activity‘))
          .build();

其中需要要点就是指定要操作的浏览器类型、APP包的名字、android程序的Activity名字。一般webview的内核都是基于webkit的,指定浏览器类型为chrome即可,APP的包名和Activity名字可以通过命令工具aapt获取,关于aapt的详细介绍可以参考这篇博客

通过以上两步,就可以通过node执行相应的js文件,实现通过命令来控制APP了,这里是几个我测试的demo,供大家下载

selenium-webdriver运行原理

上面的操作涉及到了两个核心,即浏览器提供的webdriver和浏览器(chrome/chromium)。selenium-webdriver的作用就是利用webdriver将浏览器启动起来,并实现一系列自动操作。但究竟webdriver和浏览器是怎样一个协同关系呢,从chrome.js文件的注释中可以找到一些线索。

By default, every Chrome session will use a single driver service, which is started the first time a {@link Driver} instance is created and terminated when this process exits. The default service will inherit its environment from the current process and direct all output to /dev/null. You may obtain a handle to this default service using {@link #getDefaultService getDefaultService()} and change its configuration with {@link #setDefaultService setDefaultService()}.

从上面可以知道,selenium-webdriver先通过webdriver启动了一个driver service,该service又启动chrome,分别起在不同的端口。

通过查阅资料,可以知道driver service在开启chrome的同时,为chrome安装了一个Chrome Automation Extension扩展程序,该扩展程序的描述是:Exposes extension APIs for automating Chrome,通过查看其源码,可以看到launchApp、getWindowInfo等函数,主要是提供了一些操作chrome的相关方法。

一图胜千言,selenium-webdriver的工作原理如下图所示,该图来源于网络

Tips:

上面知道了driver service与chrome之间的关系,知道默认情况下driver service的生命周期和测试的Chrome session是同步的,意味着每次测试都需要开启一个driver service,如果频繁的开启和关闭service,势必会造成资源浪费。

针对这个情况,官方的描述是这样的:

The ChromeDriver class starts the ChromeDriver server process at creation and terminates it when quit is called. This can waste a significant amount of time for large test suites where a ChromeDriver instance is created per test.

官方针对该情况提出了两个解决办法:

  1. Start the ChromeDriver server separately before running your tests, and connect to it using the Remote WebDriver.

    即测试之前先单独启动driver server,然后使用Remote WebDriver连接上driver server所在的端口。官方提供了一个python的示例:

    import time
    from selenium import webdriver
    import selenium.webdriver.chrome.service as service
    service = service.Service(‘/path/to/chromedriver‘)
    service.start()
    capabilities = {‘chrome.binary‘: ‘/path/to/custom/chrome‘}
    driver = webdriver.Remote(service.service_url, capabilities)
    driver.get(‘http://www.google.com/xhtml‘);
    time.sleep(5) # Let the user actually see something!
    driver.quit()
  2. Use the ChromeDriverService. This is available for most languages and allows you to start/stop the ChromeDriver server yourself.

    可自己创建一个driver,同时为这个driver指定相应的service。这样不仅可以为driver提供个性化的服务(如log日志),还可以控制service的生命周期。

    代码如下:

    let chrome = require(‘selenium-webdriver/chrome‘);
    let service = new chrome.ServiceBuilder()
    .loggingTo(‘/my/log/file.txt‘)
    .enableVerboseLogging()
    .build();
    let options = new chrome.Options();
    // configure browser options ...
     let driver = chrome.Driver.createSession(options, service);

小结

前端自动化测试的道路是漫长的,对selenium的挖掘才刚刚开始。本文并没有解决引言中提到的两个问题,selenium-webdriver只是解决了第一步,即通过命令行来操作app,后面将继续学习,继续总结分享。

时间: 2024-08-29 10:02:16

前端自动化测试漫长路之——Selenium初探的相关文章

前端自动化测试工具doh学习总结(二)

一.robot简介 robot是dojo框架中用来进行前端自动化测试的工具,doh主要目的在于单元测试,而robot可以用来模仿用户操作来测试UI.总所周知,Selenium也是一款比较流行的前端自动化测试工具,与Selenium相比robot的优点在于robot触发的浏览器事件是真正的用户操作事件,而Selenium中的事件属于"合成事件".打个比方,用户在一个textbox元素上触发了mousedown事件,但是在触发mousedown事件之前,肯定会触发mouseover等事件.

我的web前端自学之路-心得篇:我为什么要学习web前端?

时光如流水,转眼间,自己已经是大三的学长了,看着一个个学弟学妹,心中有种莫名的感觉,很怀念大学的前两年时光,但也很憧憬着自己的未来,自己将要去经历很多从未经历的事.我是我们学校信科院的一名学生,在编程方面,一开始只是接触到了C语言,但是c语言对于我来说并不友好,也并不是那么的好学,所以自己对程序不是很有兴趣,但一个偶然的机会,我接触到了web前端,看着我的一个大牛同学用前端 所涉及的语言写出了一些很棒的程序,于是就产生了一种很想学习前端的想法和很想把前端做的完美的渴望,于是,就开始了我的前端之路

web前端自动化测试利器puppeteer介绍

web前端自动化测试利器puppeteer介绍 Intro Chrome59(linux.macos). Chrome60(windows)之后,Chrome自带headless(无界面)模式很方便做自动化测试或者爬虫.但是如何和headless模式的Chrome交互则是一个问题.通过启动Chrome时的命令行参数仅能实现简易的启动时初始化操作.Selenium.Webdriver等是一种解决方案,但是往往依赖众多,不够扁平. Puppeteer是谷歌官方出品的一个通过DevTools协议控制h

前端深入之css篇丨初探【transform】,手把手带你实现1024程序员节动画

原文:前端深入之css篇丨初探[transform],手把手带你实现1024程序员节动画 写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所以就导致了许多程序员比较排斥来学习css动画(至少我是),但是一个不懂css动画的前端工程师不能称之为掌握css3,其实当你真正学习css动画之后,你会被它的魅力所吸引的,它可以减少代码量.提高性能. 值此10

前端这条路,我们该何去何从

原文地址:https://www.usblog.cc/blog/post/justzhl/前端这条路,我们该何去何从 这样,因为你会发现,如果你觉得某个教程写的不好,那可能很难找到一个教程适合你的,不是因为别人教程写的差(除非特别那种的),而是你该问问自己,是否有静下心来认真去看.找教程我给一个建议,建议你刚入门不要去看大牛的作品,最好看那些菜鸟或者和你技术差不多的,因为他们更容易让你懂,大牛的作品一般里面会涉及到很多东西,你去看的话,难免受打击,等到你了解部分之后再去品味大牛的作品. 当然菜鸟

我为什么要选前端这条路

我们都知道,前端水很深,大坑.. 因为她知识面广,越往后,越广乃至越深.. 相对于后端的先慢后快,前端是先快后慢,易学难精 选择前端,当然也是因为我算法这方面水平太次了 随意搜索一下“如何才能成为优秀的前端开发工程师”,就能发现前端要学的东西是不可估量的 也正是因为这样,我喜欢挑战,挑战各种知识,而这里的各种知识,都联系着前端这条路. 个人期望能用5-10年左右的时间将前端涉及的大部分知识了解一通,当然,往后还有机会的话,投入,更专注地深入各个细节. mark: 这只是目前心中的想法,不知几年后

我的web前端修炼之路从此开始

看过一篇文章,上面说过要想学习一门新技术,从什么时候开始都是不晚的.但对于一名大四的学生,只会一点简单的网页架构,只懂得HTML,CSS,JavaScript简单的一点皮毛,却怎么也说不过去.但也是这句话也给了自己一点安慰,不想在大学的最后一年再继续混下去,现在说什么从此我要奋发图强的话都是空谈,我了解自己,我也不敢保证我会不会一直坚持下去,但是现在我的感觉是我不想荒废自己,我不想毕业之后自己养不起自己,我不想毕业几年之后还要花父母的钱,我不想自己一个人在外地无目的的打拼,让家里的父母担心自己,

jQuery延迟加载(懒加载)插件 – jquery.lazyload.js-Web前端(W3Cways.com) - Web前端学习之路

Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服务器负担. Demo页面: 基本选项 淡入效果 对不支持JavaScript浏览器的降级处理 水平滚动 容器内水平滚动 容器内垂直滚动

00 开始技术博客之旅,加速前端学习之路。

第一篇博文 都说程序员是“30IT,30岁挨踢”,其实这是个伪命题,只要自己喜欢学技术,喜欢不断地追新技术,多少岁也不会挨踢.所以,尽管我今年已经27岁了,但是我打算从零开始,希望成为一名前端工程师,目前在家待业,自学中. 说来也可笑,毕业时因为是女生且没有项目经验,很受挫,害怕了,最后没有做程序媛,4年过去了,我依然是个没有项目经验的女生,今天我去参加了我第三次前端实习生的面试,心里也明白是挂了,而且今天的面试官很mean呢,依然很受挫,但是不害怕了. 受挫是难免的,但是每每学完一个知识点,成