【问题标题】:Pressing a "cancel" popup button in playwright throws exception在剧作家中按下“取消”弹出按钮会引发异常
【发布时间】:2021-03-19 21:33:50
【问题描述】:

我在 python 中使用 playwright 来取消网页上的文本提交:

page.once("dialog", lambda dialog: asyncio.create_task(dialog.accept()))
with page.expect_navigation():
    page.click("text=\"Cancel\"")

但是这会引发:

Exception in callback SyncBase._sync.<locals>.callback(<Task finishe...> result=None>) at /home/.../venv/lib/python3.8/site-packages/playwright/sync_base.py:100
handle: <Handle SyncBase._sync.<locals>.callback(<Task finishe...> result=None>) at /home/.../venv/lib/python3.8/site-packages/playwright/sync_base.py:100>
Traceback (most recent call last):
  File "/usr/lib/python3.8/asyncio/events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
...
TypeError: a coroutine was expected, got None

代码工作正常,取消得到正确确认 - 但是很高兴知道我在这里做错了什么以及如何解决它。

【问题讨论】:

  • 疯狂猜测,但也许应该只是lambda dialog: dialog.accept()(没有asyncio.create_task())?我找不到page.once() 的 Python 版本的任何文档,所以很难确定。
  • 就是这样。好眼力。我必须同意文件。 python版本似乎不存在。如果您将解决方案作为答案提交,我会将其标记为正确。也许我们可以完全摆脱 lambda? (因为我们正在使用“lambda 对话框:dialog.accept()”)

标签: python playwright


【解决方案1】:

代替:

page.once("dialog", lambda dialog: asyncio.create_task(dialog.accept()))

显然应该只是:

page.once("dialog", lambda dialog: dialog.accept())

这基本上是一个幸运的猜测,所以请持保留态度。我找不到一个好的来源来备份它。

在撰写本文时,Python 版本的 Playwright 的 documentation 似乎根本没有提到 page.once()

在 Playwright 的原始 JavaScript 版本中,page.once() 被记录为标准 Node.js EventEmitter 类的一部分,Page 派生自该类。不过,Python 标准库中没有像 EventEmitter 这样的东西。

【讨论】:

  • 对 OP 询问的问题的评论是否也意味着您可以摆脱 lambda。我不这么认为,因为你需要它来接受 Playwright 给你的dialog 参数。
  • 我在 IRC 上四处询问过,似乎page.once("dialog", operators.methodcaller('accept')) 是一个选择。但是我保留了lambda,因为我认为它更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多