如何在Nightwatch 3.x测试用例中引用命令脚本变量
问题:在Nightwatch 3.x测试脚本中获取自定义命令生成的URL变量
我用Nightwatch 3.x编写了一个从Solr实例生成URL的自定义命令脚本,但不知道如何在测试脚本中获取命令里的solrRandomReviewUrl变量。
自定义命令代码
const solr = require('solr-client'); const solrWpReviews = solr.createClient('solr-master-v9-prd.int.publishing.bauerxcel.tech', '8984','wpparkersreviews'); const publishDateRegex = browser.globals.publishDateRegex; let solrRandomReviewUrl; exports.command = async function(browser, done) { const randomSolrReview = require('../../custom-commands/solrQuery/randomSolrWpReviewEntry'); randomSolrReview.random_solr_wp_review_entry(solrWpReviews, publishDateRegex, function(err, solrRandomReview) { if(err) { console.log(err); done(err); } else { solrRandomReviewUrl = solrRandomReview.PageUrl.replace('/penelope', ''); console.log(solrRandomReviewUrl); } }); };
测试脚本代码
module.exports = { 'Test script result': async function (browser) { await browser.randomTestUrls.randomReviewUrl(); }, };
解决方案
核心问题说明
原命令中的solrRandomReviewUrl是局部变量,测试脚本无法直接访问,需要通过共享上下文或命令返回结果的方式传递数据。同时原命令的回调写法可以改为Promise风格,适配Nightwatch 3.x的async/await异步处理。
修改自定义命令
以下提供两种可行的修改方式:
方式1:将URL挂载到browser对象
const solr = require('solr-client'); const solrWpReviews = solr.createClient('solr-master-v9-prd.int.publishing.bauerxcel.tech', '8984','wpparkersreviews'); exports.command = async function(browser) { return new Promise((resolve, reject) => { const randomSolrReview = require('../../custom-commands/solrQuery/randomSolrWpReviewEntry'); const publishDateRegex = browser.globals.publishDateRegex; randomSolrReview.random_solr_wp_review_entry(solrWpReviews, publishDateRegex, function(err, solrRandomReview) { if(err) { console.log(err); reject(err); } else { const solrRandomReviewUrl = solrRandomReview.PageUrl.replace('/penelope', ''); console.log(solrRandomReviewUrl); // 将URL挂载到browser对象,供测试脚本访问 browser.solrRandomReviewUrl = solrRandomReviewUrl; resolve(); } }); }); };
方式2:让命令直接返回URL
const solr = require('solr-client'); const solrWpReviews = solr.createClient('solr-master-v9-prd.int.publishing.bauerxcel.tech', '8984','wpparkersreviews'); exports.command = async function(browser) { return new Promise((resolve, reject) => { const randomSolrReview = require('../../custom-commands/solrQuery/randomSolrWpReviewEntry'); const publishDateRegex = browser.globals.publishDateRegex; randomSolrReview.random_solr_wp_review_entry(solrWpReviews, publishDateRegex, function(err, solrRandomReview) { if(err) { console.log(err); reject(err); } else { const solrRandomReviewUrl = solrRandomReview.PageUrl.replace('/penelope', ''); console.log(solrRandomReviewUrl); // 返回生成的URL resolve(solrRandomReviewUrl); } }); }); };
修改测试脚本获取URL
对应上面两种方式,测试脚本的写法如下:
对应方式1:从browser对象读取
module.exports = { 'Test script result': async function (browser) { await browser.randomTestUrls.randomReviewUrl(); // 获取命令中挂载到browser的URL const reviewUrl = browser.solrRandomReviewUrl; console.log('获取到的Solr Review URL:', reviewUrl); // 后续可执行操作,比如跳转至该URL await browser.url(reviewUrl); }, };
对应方式2:接收命令返回的结果
module.exports = { 'Test script result': async function (browser) { // 直接接收命令返回的URL const reviewUrl = await browser.randomTestUrls.randomReviewUrl(); console.log('获取到的Solr Review URL:', reviewUrl); // 后续可执行操作,比如跳转至该URL await browser.url(reviewUrl); }, };
内容的提问来源于stack exchange,提问作者Darren Harley
相关产品推荐
相关产品推荐

