又到了Node.js结合selenium做web自动化测试时间,今天已经到了第九课了,感谢大家的坚持和陪伴,今天我们要说的内容是切换窗口,拖拽和快捷键操作。



Given(/^浏览网址"([^"]*)"$/, async function (url) {
await driver.get(url)
});
拖拽部分的还是要一步一步慢慢来滴,开始要先定位元素

这个滑块的属性在这里,找到它的id属性值了
When(/^拖拽验证码块到最右侧$/, async function () {
let div = await driver.findElement({ id: 'nc_1_n1z' })
});
API里刚才说dragAndDrop(from,to),from是拖拽的元素,to是要拖到的位置,这里可以是一个元素,也可以是x,y轴定位到的地址,那我们先把刚刚定义的div元素位置打印出来看一下
When(/^拖拽验证码块到最右侧$/, async function () {
let div = await driver.findElement({ id: 'nc_1_n1z' })
console.log("div",div.getLocation())
});
这个时候运行一下,结果,你会大吃一惊,为什么呢,因为报错了


我们新建一个html文件,里面先写入一个p标签







看到有iframe(id),那就用它吧,方法是这样的


When(/^拖拽验证码块到最右侧$/, async function () {
await driver.switchTo().frame('alibaba-register-box');
let div = await driver.findElement({ id:'nc_1_n1z' })
console.log("div",await div.getLocation())
});
运行的结果就给我们打印出坐标位置了

然后就是要把它平行移动了,我们尝试让它移动80个像素,最终完整的代码就是这样的,拿去随意玩吧
var { Given, When, Then } = require('cucumber')
const { driver } = require('../support/web_driver');
Given(/^浏览网址"([^"]*)"$/, async function (url) {
await driver.get(url)
});
When(/^拖拽验证码块到最右侧$/, async function () {
await driver.switchTo().frame('alibaba-register-box');
let div = await driver.findElement({ id:'nc_1_n1z' })
console.log("div",await div.getLocation())
let div_location=await div.getLocation();
let offset_y=div_location.y+80
await driver.actions().dragAndDrop(div,{x:div_location.x,y:offset_y}).perform()
});
下面来介绍alert,alert是什么呢,还是用一个html说,先在html里写一个按钮




When(/^点击按钮弹出alert窗口$/, async function () {
await driver.findElement({tagName:'button'}).click()//定位到按钮,点击按钮
let text =await driver.switchTo().alert().getText()//获取弹窗的文本信息
console.log("text is",text)//打印出弹窗的文本信息
});
Then(/^点击确定按钮$/, async function () {
await driver.switchTo().alert().accept()//弹出的对话框中点击确定按钮
});
结果的动画大家动动勤劳的小手演示一下就能看到了

此方法在管理系统删除配置等操作中应用较多
下面一个场景,我们说一说多个窗口切换,html文件里准备一个跳转页面的按钮
<html>
<p>123456</p>
<button onclick="alertmes()">click me</button>
<a href="http://cuketest.com"target="_blank">cuketest</a>
<script>
function alertmes(){
alert('abc')
}
</script>
</html>
浏览器里打开是这样的



When(/^点击cuketest$/, async function () {
await driver.findElement({tagName:"a"}).click()
});
Then(/^打开一个新的窗口$/, async function () {
let allwindows=await driver.getAllWindowHandles()
console.log(allwindows.length)//取到打开的窗口的数量值
await driver.switchTo().window(allwindows[1])
//切换到最后一个窗口,因为这里打开了两个窗口,数组的排序是从0开始,所以第二个窗口的索引值是1
});
这里切换好窗口,下面很简单,点击cuketest页面里的按钮就好,我们最熟悉的定位.click
Then(/^新的窗口打开文档$/, async function () {
await driver.findElement({className:"font-tab"}).click()
});
结果运行一定是Pass,棒棒哒


鼠标放到这里,你会发现这里是一个div,跟之前的input不一样,所以我们不能直接的sendKeys输入字段,首先要把鼠标移动到输入框

Then(/^模拟快捷键ctrl\+b$/, async function () {
let div=await driver.findElement({css:'.CodeMirror-scroll'})//定位到输入框
await driver.actions().mouseMove(div).click()//鼠标移动到输入框点击
});
点击之后你会看到检查元素界面有两个blingbling在跳动的地方,其实这是光标在闪烁,找到其中一个元素值就可以
let input_area=await driver.findElement({css:'.CodeMirror-cursor'})
定位到以后到了快捷键操作步骤了,记得之前曾经介绍过的KEY吗,它又可以表演了

最后我们的代码是
Then(/^模拟快捷键ctrl\+b$/, async function () {
let div=await driver.findElement({css:'.CodeMirror-scroll'})//定位到输入框
await driver.actions().mouseMove(div).click()//鼠标移动到输入框点击
await driver.actions().mouseMove(div).keyDown(Key.CONTROL).sendKeys('b').keyUp(Key.CONTROL).perform()
//鼠标移动到输入框,keyDown(Key.CONTROL)是按下ctrl键,同时sendKeys('b'),就是ctrl+b,
//之后keyUp(Key.CONTROL)松开ctrl
});
运行结果:在输入框输入了字体加粗操作,这里的****是markdown语法的粗体

今天的笔记为大家整理到这里,更多精彩课程,欢迎收看腾讯课堂
Node.js结合Selenium做web自动化测试https://ke.qq.com/course/281565#tuin=173f40be
测试工具CukeTest下载地址http://www.cuketest.com/
晚上8:00,不见不散
网友评论