错误:函数超时,请确保 Promise 在 XXX 内解析,因为在 SEQUENTIAL 中使用了 reduce/Promise.resolve(nightwatch cucumber)

问题描述 投票:0回答:1

黄瓜守夜。我想检查网页上是否存在 Excel 工作表中列出的元素。为此,编写了一个顺序承诺(使用reduce)以确保页面加载并且每个元素都得到验证。

运行测试时,如果元素存在,则使用 waitForElementVisible 可以正常进行元素验证。当元素不存在时,会遇到“等待元素存在 60000 毫秒超时”。

由于使用了reduce/Promise.resolve(),除非迭代所有记录,否则承诺不会得到解决。如果sheetData很小,下面的代码可以工作。但是,对于更多记录,会导致该函数超时。

const sheetData = file[sheetName];
        return sheetData
            .reduce((promiseChain, record, index) => {
                return promiseChain.then(() => {
                    return page.load(param)// Adjust timeout as needed
                        .then(() => {
                            return page.waitForPageLoad();
                        })
                        .then(async() => {
                            await client.waitForElementVisible(record["Locator"]);


                    })
                    .then(() => {
                        results.push({ "status": "fulfilled", index: index + 1 });
                    })
                    .catch((error) => {
                        results.push({ "status": "rejected", index: index + 1, error});
                        return Promise.resolve(); 
                    });
            });
        }, Promise.resolve())
        .then(() => {
            const failures = results.filter((result) => result.status === "rejected");
            if (failures.length > 0) return Promise.reject(failures);
            return Promise.resolve(true); 
        }).catch((finalError) => {
            console.error("Final errors encountered: ", finalError);
        });

由于要验证的元素/页面列表是动态变化的(adobe Analytics),我无法在步骤级别给出超时(如少数答案中所建议的),因为这取决于 Excel 记录,任何步骤级别超时都可能停止读取记录.

您能否建议如何绕过“函数超时”错误,而只跟踪不可用的元素,即使未找到也继续检查剩余元素?

javascript async-await promise cucumber nightwatch.js
1个回答
0
投票

相机权限:

<uses-permission android:name="android.permission.CAMERA"/>

  • 视频录制:
    MediaRecorder recorder = new MediaRecorder(); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  • 视频播放:
    VideoView videoView = findViewById(R.id.video_view); videoView.setVideoPath(videoFile.getAbsolutePath());
© www.soinside.com 2019 - 2024. All rights reserved.