Web自动化测试-Protractor基础(二)

Web自动化测试-Protractor基础(二)end-to-endtestframework

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

上一篇文章的示例如下:

describe('测试百度搜索', function () { 
   
    it('测试protractor官网会不会出现在第一个搜索结果中', async function () { 
   
        await browser.waitForAngularEnabled(false);
        await browser.driver.get('https://www.baidu.com');

        await $('#kw').sendKeys('protractor');
        await $('#su').click();

        var EC = protractor.ExpectedConditions;
        await browser.wait(EC.presenceOf($('.result.c-container h3')), 5000);

        await expect($$('.result.c-container h3 a').first().getText())
            .toBe('Protractor - end-to-end testing for AngularJS');
    });
});

Jetbrains全家桶1年46,售后保障稳定

示例很简单,打开百度,搜索protractor,看搜索结果第一个是不是protractor官网。

在实际情况中,自动化测试的逻辑会很复杂。为了脚本的可维护性,我们把页面功能和测试用例分开来写:

// 页面功能
function baidu() { 
    
    this.open = function () { 
   
        browser.waitForAngularEnabled(false);
        return browser.driver.get('https://www.baidu.com');
    };
    this.getSearchInput = function () { 
   
        return $('#kw');
    };
    this.getSubmitBtn = function () { 
   
        return $('#su');
    };
    this.getResults = async function () { 
   
        await browser.wait(ExpectedConditions.presenceOf($('.result.c-container h3')), 5000);
        return $$('.result.c-container h3 a');
    };
}

// 测试用例
describe('测试百度搜索', function () { 
   
    it('测试protractor官网会不会出现在第一个搜索结果中', async function () { 
   
        var page = new baidu();
        await page.open();

        await page.getSearchInput().sendKeys('protractor');
        await page.getSubmitBtn().click();

        var searchResults = await page.getResults();
        var firstResult = await searchResults[0].getText();
        expect(firstResult).toBe('Protractor - end-to-end testing for AngularJS');
    });
});

这么写代码,function baidu()这块代码就可以复用了。

例如要测试十个关键词的搜索结果,怎么找搜索框,怎么获取结果这些逻辑我们都能复用。
以后页面结构修改,例如搜索框的id变了,我们也只用改一个地方。

另外也可以看出测试用例(describe部分)可读性更强了。

后面还可以再进一步,把function baidu()移到单独的文件中。

TypeScript

现在TypeScript很流行,我们不妨来用用看。可以享受到面向对象、类型检查和编码提示等好处。

最终文件结构

root  
|----node_modules/
|----package.json
|----protractor.conf.js
|----src/  
     |----page.ts
     |----spec.ts
|----tsconfig.json

下面一一介绍这几个文件。

package.json

devDependencies添加了jasmine types的依赖,protractor自带ts申明文件。
这里的ts-node读者可能没见过,它可以让ts文件在node上运行,详情见官网

{
    "name": "e2e-ts",
    "version": "1.0.0",
    "devDependencies": { "@types/jasmine": "^2.5.51", "protractor": "^5.1.2", "ts-node": "^3.0.6", "typescript": "^2.3.4" } }

tsconfig.json

代码运行在node中,因此可以大胆使用es2017。另外指定了需要加载的types文件。

{
    "compilerOptions": { "module": "commonjs", "moduleResolution": "node", "target": "es2017", "lib": [ "es2017" ], "typeRoots": [ "node_modules/@types" ], "types": [ "jasmine", "node" ] } }

page.ts

封装页面功能

import { browser, $, $$, ExpectedConditions, ElementFinder } from 'protractor';

export class Baidu {
    open() {
        browser.waitForAngularEnabled(false);
        return browser.driver.get('https://www.baidu.com');
    }

    getSeachInput() {
        return $('#kw');
    }

    getSubmitBtn() {
        return $('#su');
    }

    private waitForSearchResults() {
        return browser.wait(ExpectedConditions.presenceOf($('.result.c-container h3')), 5000);
    }

    async getResults(): Promise<ElementFinder[]> {
        await this.waitForSearchResults();
        return await $$('.result.c-container h3 a');
    }
}

spec.ts

测试用例

import { Baidu } from './page';

describe('测试百度搜索', function () {
    it('测试protractor官网会不会出现在第一个搜索结果中', async function () {
        let baidu = new Baidu();
        await baidu.open();

        await baidu.getSeachInput().sendKeys('protractor');
        await baidu.getSubmitBtn().click();

        let results = await baidu.getResults();
        let firstResult = await results[0].getText();
        expect(firstResult).toBe('Protractor - end-to-end testing for AngularJS');
    });
});

protractor.conf.js

protractor的配置文件,注意这个还是个js文件,并没转成ts
内容比上一篇文章里的配置文件多了一段beforelaunch,主要用来初始化ts-node

exports.config = {
    directConnect: true,
    framework: 'jasmine',
    SELENIUM_PROMISE_MANAGER: false,
    specs: ['src/spec.ts'],
    beforeLaunch: function () { 
   
        require('ts-node').register({
            project: 'tsconfig.json'
        });
    }
};

运行脚本

protractor protractor.conf.js

和之前效果一样,但被我们改成了ts版的。随着测试脚本的增多,ts的优势会越发明显。

调试

这里介绍使用VSCode调试的方法,主要就是配置launch.json

launch.json

{
    // 使用 IntelliSense 以学习相关的 Node.js 调试属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "启动程序",
            "program": "C:/Users/apolis/AppData/Roaming/npm/node_modules/protractor/bin/protractor",
            "args": [
                "${workspaceRoot}/protractor.conf.js"
            ]
        }
    ]
}

program配置npm全局安装的protractor的路径
args指定了protractor的配置

点击VSCode的调试,就OK啦!
debug

结束

如果读者对Protractor感兴趣,建议阅读一下官网文档

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/204284.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Unity3d场景快速烘焙【2020】

    Unity3d场景快速烘焙【2020】很多刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,多则几十个小时,机器总是处于假死机状态,半天看不到结果,好不容易烘焙完了,黑斑、撕裂、硬边、漏光或漏阴影等缺陷遍布,惨不忍睹,整体效果暗无层次,或者苍白无力,灯光该亮的亮不起来,该暗的暗不下去,更谈不上有什么意境,痛苦的折磨,近乎失去了信心,一个团队从建模到程序,都没什么问题,可一到烘焙这一关,就堵得心塞,怎么也搞不出好的视觉效果,作品没法及时向用户交

  • JQuery的安装与下载教程

    JQuery的安装与下载教程网页中添加jQuery可以通过多种方法在网页中添加jQuery。您可以使用以下方法:从jquery.com下载jQuery库 从CDN中载入jQuery,如从Google中加载jQuery下载jQuery有两个版本的jQuery可供下载:Productionversion-用于实际的网站中,已被精简和压缩。 Developmentversion-用于测试和开发(未压缩,是可读的代码)以上两个版本都可以从jquery.com中下载。…

  • opencv-python中 boundingRect(cnt)以及cv2.rectangle用法「建议收藏」

    转自http://blog.csdn.net/zhangxb35/article/details/47275277矩形边框(BoundingRectangle)是说,用一个最小的矩形,把找到的形状包起来。还有一个带旋转的矩形,面积会更小,效果见下图上代码首先介绍下cv2.boundingRect(img)这个函数这个函数很简单,img是一个二值图,也就是它的参数;

  • eclipse 设置自动补全快捷键「建议收藏」

    eclipse 设置自动补全快捷键「建议收藏」  目的: 使用快捷键 alt+/后,实现代码自动补全功能 操作如下: a) 点击window/Preferences,出现下图   b)修改快捷键   c)保存修改后,一般不需要重启eclipse,输入代码syso后用alt+/快捷键测试,看看是否能补全成System.out.println();一般情况下会立即生效,…

  • dropdown list_css中display中flex

    dropdown list_css中display中flexサンプル画面–>http://ns.adobe.com/mxml/2009″    xmlns:s=”library://ns.adobe.com/flex/spark”    xmlns:mx=”library://ns.adobe.com/flex/mx”    minWidth=”800″    minHeight=”400″>      import

    2022年10月10日
  • html 转换成 markdown,将HTML转换为Markdown

    html 转换成 markdown,将HTML转换为Markdown我在这个博客上最大的一个错误就是没有找到一个WordPress插件可以让我用markdown来写我的文章;直到今天,我仍然需要在“视觉”模式下写文章,然后手动将文章转换为“文本”模式的HTML。有一天,我想转换现有的帖子Markdown,然后启用一个插件,将Markdown转换为HTML。这个痛苦的过程让我问自己:有没有一种方法我可以使用Node.jsJavaScript转换HTML到Markd…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号