Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在剧作家中等待JavaScript完成_Javascript_Puppeteer_Playwright - Fatal编程技术网

如何在剧作家中等待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

我正在用剧作家和JavaScript测试UI。我的代码找到的输入元素有时可以是下拉列表,有时是文本,有时是日期。为了处理这个问题,我分两步输入值。首先,我填充文本,然后单击tab键调用JavaScript来格式化元素中的值

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';