如何在剧作家中等待JavaScript完成
我正在用剧作家和JavaScript测试UI。我的代码找到的输入元素有时可以是下拉列表,有时是文本,有时是日期。为了处理这个问题,我分两步输入值。首先,我填充文本,然后单击tab键调用JavaScript来格式化元素中的值如何在剧作家中等待JavaScript完成,javascript,puppeteer,playwright,Javascript,Puppeteer,Playwright,我正在用剧作家和JavaScript测试UI。我的代码找到的输入元素有时可以是下拉列表,有时是文本,有时是日期。为了处理这个问题,我分两步输入值。首先,我填充文本,然后单击tab键调用JavaScript来格式化元素中的值 await page.fill("#myID", inputText); await page.keyboard.press('Tab'); // this line trigger the JS // continue to the next el
await page.fill("#myID", inputText);
await page.keyboard.press('Tab'); // this line trigger the JS
// continue to the next element
问题在于,它不是等待JavaScript完成。在代码继续之前,我如何等待JS完成。使用page.waitFor。。。功能
剧作家在满足某些条件时提供了一系列功能,这些功能从page.waitFor开始,例如。可能page.waitForFunction是最通用的,因为您可以传递一个等待满足特定条件的自定义函数
或者,使用超时
我认为您可以在页面上下文中对page.evaluate使用setTimeout来等待其他JavaScript运行:
await page.evaluate(() => {
// if this doesn't work, you can try to increase 0 to a higher number (i.e. 100)
return new Promise((resolve) => setTimeout(resolve, 0));
});
这可能相当于,但我不确定。请注意,他们建议不要在生产中使用page.waitForTimeout。使用page.waitfort。。。功能
剧作家在满足某些条件时提供了一系列功能,这些功能从page.waitFor开始,例如。可能page.waitForFunction是最通用的,因为您可以传递一个等待满足特定条件的自定义函数
或者,使用超时
我认为您可以在页面上下文中对page.evaluate使用setTimeout来等待其他JavaScript运行:
await page.evaluate(() => {
// if this doesn't work, you can try to increase 0 to a higher number (i.e. 100)
return new Promise((resolve) => setTimeout(resolve, 0));
});
这可能相当于,但我不确定。请注意,他们建议不要在生产中使用page.waitForTimeout。您可能会发现这很有用 或者,从中找到一个示例,该示例似乎更简单:
const promise = new Promise((resolve, reject) => {
setTimeout(function(){
resolve(); // Task is completed
}, 3000);
return resolve;
});
promise.then(res => {
console.log('resolved');
}).catch(err => {
console.log(err)
});
你可能会发现这很有用 或者,从中找到一个示例,该示例似乎更简单:
const promise = new Promise((resolve, reject) => {
setTimeout(function(){
resolve(); // Task is completed
}, 3000);
return resolve;
});
promise.then(res => {
console.log('resolved');
}).catch(err => {
console.log(err)
});
我可以使用以下方法解决此问题:
page.waitForFunction(() => Ext.Ajax.isLoading() === false );
我可以使用以下方法解决此问题:
page.waitForFunction(() => Ext.Ajax.isLoading() === false );
不幸的是,这种情况并不好。这种模式发生了很多次,如果我使用硬编码值,脚本将非常慢。JS完成后,我需要停止等待。您可以尝试使用0超时,这可能会起作用,具体取决于事件冒泡的方式,或者您可以将其抽象为允许传递超时参数的函数。如果这不起作用,就很难确定JS何时完成,如果不显式地编写代码说明它已经完成。例如,如果您可以编辑客户端代码,您可以拥有一个名为doneClientSide的自定义函数,您可以在playwright中检查该函数。我有一种感觉,总的来说,您会遇到性能问题。我认为waitForFunction可能会有所帮助,尽管这并不容易。我需要检查一下。谢谢你!不幸的是,这种情况并不好。这种模式发生了很多次,如果我使用硬编码值,脚本将非常慢。JS完成后,我需要停止等待。您可以尝试使用0超时,这可能会起作用,具体取决于事件冒泡的方式,或者您可以将其抽象为允许传递超时参数的函数。如果这不起作用,就很难确定JS何时完成,如果不显式地编写代码说明它已经完成。例如,如果您可以编辑客户端代码,您可以拥有一个名为doneClientSide的自定义函数,您可以在playwright中检查该函数。我有一种感觉,总的来说,您会遇到性能问题。我认为waitForFunction可能会有所帮助,尽管这并不容易。我需要检查一下。谢谢你!在这种情况下,我不能使用硬编码等待。该模式出现多次,如果使用硬编码等待,脚本将非常慢。JS完成后,我需要停止等待。在这种情况下,我不能使用硬编码等待。该模式出现多次,如果使用硬编码等待,脚本将非常慢。JS完成后,我需要停止等待。什么是Ext.Ajax?如果您正在等待Ajax加载,可以使用Wait page.waitForLoadState'networkidle';什么是Ext.Ajax?如果您正在等待Ajax加载,可以使用Wait page.waitForLoadState'networkidle';