我有一个Selenium webdriverIO
V5框架。我在这里面临的问题是,以下代码在Mac OS上可以正常运行,但在Windows OS上不能正常运行。在Windows操作系统中,它陷入了无限循环问题。
以下代码功能是:合并yaml
个文件(包含定位符),并通过传递键来返回定位符的值:
const glob = require('glob');
const yamlMerge = require('yaml-merge');
const sleep = require('system-sleep');
let xpath;
class Page {
getElements(elementId) {
function objectCollector() {
glob('tests/wdio/locators/*.yml', function (er, files) {
if (er) throw er;
xpath = yamlMerge.mergeFiles(files);
});
do {
sleep(10);
} while (xpath === undefined);
return xpath;
}
objectCollector();
return xpath[elementId];
}
}
module.exports = new Page();
答案 0 :(得分:0)
由于您正在等待回调的结果,因此建议您从Promise
函数返回一个新的getElements
和resolve()
返回的值。然后,当您调用getElements
时,您将需要解析该Promise
或使用await
表示法。该函数将在此时停止并等待Promise
解析,但是事件循环仍将继续。有关更多信息,请参见一些documentation。
下面我将写一个示例,说明使用Promise
时代码的外观,但是调用getElements
时,需要在关键字await
之前加上关键字。如果要避免这种情况,可以在进入Promise
时从objectCollector
解析getElements
并从其定义中删除async
关键字,但实际上您不应该这样做妨碍异步JavaScript。另外,您可能会缩短代码一点,因为在此示例中,objectCollector
看起来像是不必要的功能:
const glob = require('glob')
const yamlMerge = require('yaml-merge')
const sleep = require('system-sleep')
let xpath
class Page {
function async getElements(elementId) {
function objectCollector() {
return new Promise((resolve,reject) => {
glob('tests/wdio/locators/*.yml', function (er, files) {
if (er) reject(er)
resolve(yamlMerge.mergeFiles(files))
})
})
}
let xpath = await objectCollector()
return xpath[elementId]
}
}
module.exports = new Page();