如何在Nightwatch中从.getText返回变量?遇num3未定义断言失败
在Nightwatch中正确获取.getText的返回值并传递变量
你遇到的num3变成undefined的问题,本质是没搞懂Nightwatch API的异步特性——.getText()是异步执行的,不会立刻返回结果。如果像同步代码那样直接赋值,后续代码会先跑起来,这时候.getText()的回调还没执行,num3自然就是undefined了,断言肯定失败。
下面给你几种靠谱的解决办法,按推荐程度排序:
1. 用Async/Await(最简洁推荐)
现在Nightwatch基本都支持ES6+了,用async/await能把异步代码写得像同步一样清晰:
module.exports = { '获取文本并跨页比较': async function(browser) { // 先等元素加载出来,避免找不到元素导致值为空 await browser.waitForElementVisible('#你的目标元素选择器', 5000); // 拿到num3的值 const num3 = await browser.getText('#你的目标元素选择器'); // 跳转到后续页面 await browser.navigateTo('/后续页面路径'); // 获取要比较的文本 await browser.waitForElementVisible('#要比较的元素选择器', 5000); const compareValue = await browser.getText('#要比较的元素选择器'); // 执行断言 assert.equal(num3, compareValue, '两个数值不匹配'); // 结束测试 await browser.end(); } };
核心就是把测试函数标记为async,每个异步API前面加await,这样代码会乖乖等.getText()执行完拿到值,再往下走。
2. 用嵌套回调(传统方式)
如果你的项目还在用旧版Nightwatch,或者习惯回调写法,可以把后续逻辑都塞进.getText()的回调里,确保拿到值再执行:
module.exports = { '获取文本并跨页比较': function(browser) { browser.getText('#你的目标元素选择器', function(result) { const num3 = result.value; // 拿到值后再跳页、做后续操作 browser.navigateTo('/后续页面路径') .getText('#要比较的元素选择器', function(compareResult) { assert.equal(num3, compareResult.value, '两个数值不匹配'); browser.end(); }); }); } };
这种方式要注意嵌套层级,太多的话容易变成“回调地狱”,可读性会差一点。
3. 用链式调用传变量
Nightwatch支持链式调用,也可以通过this来在链式操作中传递变量:
module.exports = { '获取文本并跨页比较': function(browser) { browser.getText('#你的目标元素选择器', function(result) { // 把值存在browser对象上 this.num3 = result.value; }) .navigateTo('/后续页面路径') .getText('#要比较的元素选择器', function(result) { // 直接从this上取之前存的num3 assert.equal(this.num3, result.value, '两个数值不匹配'); }) .end(); } };
这里要注意上下文,确保this指向的是browser实例,别搞错了。
最后再提个小提醒:如果还是拿不到值,先检查你的元素选择器是不是写错了!有时候元素还没加载出来就去获取文本,也会返回undefined,所以最好加上waitForElementVisible等元素渲染完成再操作哦。
内容的提问来源于stack exchange,提问作者adg ghd
相关产品推荐
相关产品推荐

