0

使用 PuppeteerSharp,如何等待元素完成扩展?

与其他问题非常相似,我有一个单击时会滑动打开的菜单。我正在尝试单击扩展 div 内的链接。

我尝试等待Visible = true但我认为它可能在停止扩展之前变得可见。(它没有单击#bar。)

var waitOptions = new WaitForSelectorOptions() { Visible = true };
var waitTask = page.WaitForSelectorAsync("#bar", waitOptions);
var clickTask = page.ClickAsync("#foo");
await Task.WhenAll(waitTask, clickTask); // the next line works if I put a breakpoint here
await page.ClickAsync("#bar");

这个解决方案对 JS 中的 Puppeteer 很有意义。但是 ElementHandle 没有类似的东西addEventListener,而且我找不到任何支持的事件TransitionEnd

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);
}

所以我尝试从 C# 中实现该 JavaScript,但它从未完成......

也许我对事件侦听器做错了什么......

不幸的是,我没有任何好的例子来重现它。

    var divSelector = "#foo";
    var expandMenuTask = page.EvaluateFunctionAsync(@"(element) => {
        return new Promise((resolve) => {
          const transition = document.querySelector(element);
          const onEnd = function () {
            transition.removeEventListener('transitionend', onEnd);
            resolve();
          };
          transition.addEventListener('transitionend', onEnd);
        });
      }", divSelector);

    var clickTask = page.ClickAsync(divSelector);

    await Task.WhenAll(expandMenuTask, clickTask);

我可能最终会选择Task.Delay(1000). 只是在寻找正确的方法。

4

0 回答 0