超详细的 web 自动化教程 (五)—TestCafe 页面高级操作

迭代涟漪
• 阅读 1365

前言

这篇文章接着上一篇来给大家介绍一下 TestCafe 页面交互的一些高级操作。
一、鼠标拖拽
1、拖拽元素偏移
方法:t.drag 可以将元素相对于原来位置进行偏移拖拽。
案例
import { Selector } from 'testcafe';

fixture 元素拖拽

.page `https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable`;

test('Drag test', async t => {

await t
    .switchToIframe('#iframeResult')
    // 相对于元素原来位置,x轴拖动360像素
    .drag('#draggable', 360, 0);

});
2、拖拽元素到另一个元素位置
方法:dragToElement 将元素拖拽到另一个元素的位置。
案例
import { Selector } from 'testcafe';

fixture 元素拖拽

.page `https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable`;

test('Drag test', async t => {

await t
    .switchToIframe('#iframeResult')
    // 将元素#draggable 拖动到 #droppable 中
    .dragToElement('#draggable', '#droppable')

});
二、文件上传
1、上传文件
方法:t.setFilesToUpload:
参数:
参数
描述
selector
目标元素(目标元素必须是带有 type="file" 属性的 input 标签。)
filePath
上传文件的路径(支持多个文件上传,以数组的形式传递参数)
案例

fixture My fixture

.page `https://www.layui.com/demo/upload.html`;

test('Uploading', async t => {

await t
    // 上传文件
    .setFilesToUpload('#test2+input', [
        'C:\\课件\\images\\p5_1_1.png',
        'C:\\课件\\images\\p5_1.png'
    ])

});
2、清除上传文件
2、清除上传文件
方法:t.clearUpload 删除文件上传元素中,已选择的上传文件
案例
fixture My fixture

.page `https://www.layui.com/demo/upload.html`;

test('Uploading', async t => {

await t
    // 上传文件
    .setFilesToUpload('#test2+input', [
        'C:\\课件\\images\\p5_1_1.png',

    ])
    .clearUpload("'#test2+input")

});
三、截屏操作
关于截图,testcafe 提供了两个方法,一个的对整个页面进行截图,一个是对具体的某个元素进行截图。
1、页面进行截图
方法:t.takeScreenshot
对整个页面进行截图,截取下来的图片会自动保存到 screenshot 的目录中
参数说明:
范围
描述
默认值
path
屏幕截图文件的相对路径和名称(非必填)。
fullPage
指定应捕获整个页面,包括由于溢出而看不到的内容(非必填)。
false

例子
import { Selector } from 'testcafe';

fixture 页面截图

.page `https://www.baidu.com`;

test('screenshot ', async t => {

await t
    .typeText('#kw', '柠檬杯')
    .click('#su')
    .takeScreenshot({
        path: 'index_page.png',
        fullPage: true
    });

});
2、元素截图
方法:t.takeElementScreenshot()
对页面指定的具体元素进行截图
参数说明
范围
描述
selector
屏幕截图的网页元素
path
屏幕截图文件的相对路径和名称(非必填)。
options
定义如何截屏的选项(非必填)。详细请参阅官方文档

例子
import { Selector } from 'testcafe';

fixture 页面截图

.page `https://www.baidu.com`;

// 百度首页搜索按钮截图
test('screenshot ', async t => {

await t
    .takeElementScreenshot('#su', 'su_ele.png');

});
四、窗口滚动
TestCafe 对处于页面下方不可见的元素进行操作,会自动滚动到元素可见。因此 TestCafe 中没有提供专用来滚动窗口的操作方法。如果您特别需要在不对元素执行任何操作的情况下,滚动到页面元素可见,可以使用 TestCafe 提供的客户端功能构造函数 ClientFunction,自己定义一个滚动的方法。
1、自定义滚动方法
自定义滚动的方法需要使用 TestCafe 提供的构造函数 ClientFunction 来创建客户端函数。
关于 ClientFunction,后面的章节会详细讲解,这边咱们直接使用
import { ClientFunction } from 'testcafe';

// 定义一个相对当前位置,进行滚动的方法
const scrollBy = ClientFunction((x,y) => {

window.scrollBy(x, y);

});

// 定义一个相对当前位置,滚动到页面指定像素位置的方法
const scrollTo = ClientFunction((x,y) => {

window.scrollTo(x, y);

});

fixture My fixture

.page `https://www.layui.com/demo/upload.html`;

test('Test scrollBy', async t => {

    // 相对当前位置,向下滚动100像素
  await scrollBy(100,0);

});
test('Test scrollTo', async t => {

    //滚动到页面X轴为1000像素的位置
  await scrollTo(1000,0);

});
1
五、iframe 切换
TestCafe 测试的测试操作和 selenium 一样仅限于主窗口。如果页面中存在 iframe 内嵌页面,那么进行自动化测试的过程中,如果存在 iframe,则应需要进行切换。
1、切换到指定的 iframe 中
testcafe中的方法switchToIframe,可以帮我们从主窗口切换到iframe中
方法:switchToIframe
例子 import { Selector } from 'testcafe'; fixture qq邮箱登录之iframe切换 .page https://mail.qq.com/; test('iframe test', async t => { await t //切换到id为login_frame的iframe中 .switchToIframe('#login_frame') // 输入账号 .typeText('#u', '1234567872') // 输入面面 .typeText('#p', '123qwe') });
2、从 iframe 中切换回页面窗口
方法:switchToMainWindow()
例子
import { Selector } from 'testcafe';

fixture qq邮箱登录之iframe切换

.page `https://mail.qq.com/`;

test('iframe test', async t => {

await t
    //切换到id为login_frame的iframe中
    .switchToIframe('#login_frame')
    // 输入账号
    .typeText('#u', '1234567872')
    // 输入面面
    .typeText('#p', '123qwe')

});

test('iframe test', async t => {

const mobile_ele = Selector('a').withText('手机版')
await t
    // 切换回原窗口
    .switchToMainWindow();
    // 点击窗口中的手机版
    .click(mobile_ele)

});
1
六、页面访问
在前几节的学习中我们打开页面都是在 fixture 中,调用 page 方法。那么如果在测试用例中我们要跳转到另一个指定的页面,则需要使用 TestCafe 中的 navigateTo 方法
方法:navigateTo
在当前窗口访问另一个页面
案例
fixture('Example').page('https://www.baidu.com');

test('Navigate To URL test', async t => {

await t.navigateTo('https://www.taobao.com');

});
七、窗口切换
TestCafe 在打开新窗口时,会自动切换到新窗口,如果我们在测试的过程中需要手动进行窗口切换,
1、获取窗口描述符
获取当前活动窗口相对应的窗口描述符
方法
例子
import { Selector } from 'testcafe';

fixture 百度测试

.page `https://www.baidu.com`;

test('Wait test', async t => {

// 打开一个新窗口,接收新窗口的描述符
await t.openWindow('http://www.taobao.com')
// 获取当前窗口的描述符
const new_desc = await t.getCurrentWindow();

});
2、切换到特定窗口
方法:t.switchToWindow
参数

参数名
描述
windowDescriptor
从打开的浏览器窗口获得的描述符对象。

例子
import { Selector } from 'testcafe';

fixture 百度测试

.page `https://www.baidu.com`;

test('Wait test', async t => {

// 获取当前窗口的描述符
const old_win = await t.getCurrentWindow();
// 打开一个新窗口 
const new_win = await t.openWindow('http://www.taobao.com')
// 切换到老窗口
t.switchToWindow(old_win) 
// 再切换到新窗口
t.switchToWindow(new_win) 

});
3、切换上一个活动窗口
切换到前一个活动的窗口, 使用该方法方法调用将在两个最近的窗口之间循环切换。
方法:t.switchToPreviousWindow
例子
import { Selector } from 'testcafe';

fixture 百度测试

.page `https://www.baidu.com`;

test('Wait test', async t => {

// 打开一个新窗口,接收新窗口的描述符
await t.openWindow('http://www.taobao.com')
// 切换到上一个窗口(就窗口)
t.switchToPreviousWindow()
// 切换回来
t.switchToPreviousWindow()
// 切换到上一个窗口
t.switchToPreviousWindow()

});
4、切换的父级窗口
方法:t.switchToParentWindow
例子:
import { Selector } from 'testcafe';

fixture 百度测试

.page `https://www.baidu.com`;

test('Wait test', async t => {

// 打开一个新窗口,接收新窗口的描述符
await t.openWindow('http://www.taobao.com')
// 切换到上一个窗口(就窗口)
t.switchToParentWindow()

});
下面是我当时学习时用过的部分资料,有需要的朋友可以点击下面链接免费领取哟
【测试架构师】系统 初级测试工程师-测试架构师 学习之路
超详细的 web 自动化教程 (五)—TestCafe 页面高级操作
超详细的 web 自动化教程 (五)—TestCafe 页面高级操作
超详细的 web 自动化教程 (五)—TestCafe 页面高级操作
超详细的 web 自动化教程 (五)—TestCafe 页面高级操作

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript htmldom 元素
这篇文章将教会大家如何查找和访问网页中的HTML元素。一、找到HTML元素通常,使用JavaScript,想操作HTML元素。要做到这一点,必须先找到元素。有几种方法可以做到这一点。找到DOM中的HTML元素的最简单的方法,是利用元素的id。使用id"intro"找到元素:varmyElementdocument.getElementById("in
浩浩 浩浩
4年前
【Flutter实战】对齐与相对定位(Align)
4.6对齐与相对定位(Align)在上一节中我们讲过通过Stack和Positioned,我们可以指定一个或多个子元素相对于父元素各个边的精确偏移,并且可以重叠。但如果我们只想简单的调整一个子元素在父元素中的位置的话,使用Align组件会更简单一些。4.6.1AlignAlign组件可以调整子组件的位置,并且可以根据子
Stella981 Stella981
3年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Stella981 Stella981
3年前
Python+appium+pytest自动化教程(八)
从这篇文章我们将正式的进入正题,就是项目整合,在使用pytestappium之前我们先进行seleniumunitest的使用,如下文:pageObject是Selenium自动化测试项目的最佳设计模式之一,通过对界面的元素的封装,减少冗余代码,同时在后期维护中,若元素发生定位只需要页面调整封装元素的代码重构思路
Stella981 Stella981
3年前
RobotFramework自动化测试之元素定位
前言:最近在做基于RF框架的Web自动化测试,其中涉及到元素的定位,主要用到id、name、xpath、css四中定位方法,尤其后面的两种方法特别有效,可以解决大部分的定位问题。
Wesley13 Wesley13
3年前
CSS内容布局
网页是由不同内容块构成的:标题、段落、链接、列表、图片、视频,等等。1.定位定位并不适合总体布局,因为它会把元素拉出页面的正常流。元素的初始定位方式为静态定位(static),即块级元素垂直堆叠。把元素设置为相对定位(relative),然后可以相对于其原始位置控制该元素的偏移量,同时又不影响其周围的元
Stella981 Stella981
3年前
CSS 分类 (Classification)
★★CSS分类属性(Classification)★★⑴CSS分类属性允许你控制如何显示元素,设置图像显示于另一元素中的何处,相对于其正常位置来定位元素,使用绝对值来定位元素,以及元素的可见度。⑵下面是常用的属性以及描述:!(https://oscimg.oschina.net/oscnet/00cb565
如何利用烛龙和谷歌插件优化CLS(累积布局偏移) | 京东云技术团队
简介CLS衡量的是页面的整个生命周期内发生的每次意外布局偏移的最大突发性布局偏移分数。布局变化的发生是因为浏览器倾向于异步加载页面元素。更重要的是,您的页面上可能存在一些初始尺寸未知的媒体元素。这种组合意味着浏览器在加载完成之前无法确定单个元素将占用多少空
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(