这篇文章接着上一篇来给大家介绍一下 TestCafe 页面交互的一些高级操作。
鼠标拖拽鼠标拖拽
1、拖拽元素偏移
可以将元素相对于原来位置进行偏移拖拽。
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、拖拽元素到另一个元素位置
将元素拖拽到另一个元素的位置。
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、上传文件
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、清除上传文件
删除文件上传元素中,已选择的上传文件
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、页面进行截图
对整个页面进行截图,截取下来的图片会自动保存到 screenshot 的目录中
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 动作。
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);
});
TestCafe 测试的测试操作和 selenium 一样仅限于主窗口。如果页面中存在 iframe 内嵌页面,那么进行自动化测试的过程中,如果存在 iframe,则应需要进行切换。
testcafe中的方法switchToIframe,可以帮我们从主窗口切换到iframe中
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 中切换回页面窗口
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)
});
在前几节的学习中我们打开页面都是在 fixture 中,调用 page 方法。那么如果在测试用例中我们要跳转到另一个指定的页面,则需要使用 TestCafe 中的 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、切换到特定窗口
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、切换上一个活动窗口
切换到前一个活动的窗口, 使用该方法方法调用将在两个最近的窗口之间循环切换。
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、切换的父级窗口
import { Selector } from 'testcafe';
fixture `百度测试`
.page `https://www.baidu.com`;
test('Wait test', async t => {
// 打开一个新窗口,接收新窗口的描述符
await t.openWindow('http://www.taobao.com')
// 切换到上一个窗口(就窗口)
t.switchToParentWindow()
});
下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!
面试经:一线城市搬砖!又面软件测试岗,5000就知足了…
面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…
什么样的人适合从事软件测试工作?
那个准点下班的人,比我先升职了…
测试岗反复跳槽,跳着跳着就跳没了…