等待过渡以木偶结尾

时间:2018-07-26 21:49:54

标签: javascript css3 puppeteer

我正在尝试使用Puppeteer测试网站。不幸的是,我在单击工具栏中的元素时遇到了麻烦。工具栏使用CSS过渡来优雅地滑入页面。我的代码失败,因为我在页面仍处于动画状态时单击元素将出现的位置。我使用超时作为解决方法,但是必须有一个更优雅的解决方案。这是一个示例:

unchecked generic array creation for varargs parameter

我认为我需要等待await page.click("#showMeetings"); //Toolbar slides in await page.waitFor(3000); //Can I do this without a timeout? await page.click("#mtgfind"); //Click button in toolbar 事件,但是我不确定如何在Puppeteer中执行此操作。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

您可以使用page.evaluate()transitionend事件来实现您的目标:

await page.evaluate(() => {
  const show_meetings = document.getElementById('showMeetings');
  const mtg_find = document.getElementById('mtgfind');

  mtg_find.addEventListener('transitionend', event => {
    mtg_find.click();
  }, false);

  show_meetings.click();
});

答案 1 :(得分:0)

我想出了一个相当愚蠢的解决方案。我查看了转换应该花多长时间(在本例中为0.2秒),并修改了waitFor语句以等待那么长时间。最终代码:

await page.click("#showMeetings"); //Toolbar slides in
await page.waitFor(200);
await page.click("#mtgfind"); //Click button in toolbar

如果时间是可变的,这将不起作用,但是网站会在各处重复使用相同的过渡,因此对于我的用例来说很好。

答案 2 :(得分:0)

对于Grant解决方案,您不应忘记删除事件侦听器并等待它。您可以尝试此解决方案,它对我有用。我有类似的问题。

async waitForTransitionEnd(element) {
  await page.evaluate((element) => {
    return new Promise((resolve) => {
      const transition = document.querySelector(element);
      const onEnd = function () {
        transition.removeEventListener('transitionend', onEnd);
        resolve();
      };
      transition.addEventListener('transitionend', onEnd);
    });
  }, element);
}

并命名为:

await page.click('#showMeetings');
await waitForTransitionEnd('#elementWithTransition');
await page.click("#mtgfind");