#python #playwright
#python #playwright
Вопрос:
Я использую playwright в python для отмены отправки текста на веб-странице:
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
Код работает нормально, отмена подтверждается правильно — однако было бы неплохо узнать, что я здесь делаю не так и как это исправить.
Комментарии:
1. Дикое предположение, но, может быть, это должно быть просто
lambda dialog: dialog.accept()
(безasyncio.create_task()
)? Я не могу найти никакой документации для версии Pythonpage.once()
, поэтому трудно быть уверенным.2. Это было так. Хороший глаз. Я должен согласиться с документацией. Похоже, оно не существует для версии python. Если вы отправите решение в качестве ответа, я отмечу его как правильное. Может быть, мы можем полностью избавиться от лямбды? (Поскольку мы перешли к «lambda dialog: dialog.accept()»)
Ответ №1:
Вместо:
page.once("dialog", lambda dialog: asyncio.create_task(dialog.accept()))
По-видимому, это должно быть просто:
page.once("dialog", lambda dialog: dialog.accept())
По сути, это была удачная догадка, так что отнеситесь к ней с недоверием. Я не могу найти хороший источник для его резервного копирования.
На момент написания, документация для Python версии Playwright, похоже page.once()
, вообще не упоминается.
В оригинальной версии JavaScript Playwright page.once()
задокументировано как часть стандарта Node.js EventEmitter
класс, из которого Page
является производным. Однако ничего подобного не EventEmitter
существует в стандартной библиотеке Python.
Комментарии:
1. Комментарий к вопросу, заданному OP, означает ли это, что вы также можете избавиться от
lambda
. Я так не думаю, поскольку вам это нужно, чтобы принятьdialog
аргумент, предоставленный вам Playwright.2. Я поспрашивал в IRC, и, похоже, это
page.once("dialog", operators.methodcaller('accept'))
был бы вариант. Однако я сохранилlambda
, поскольку считаю его более читаемым.