Нажатие всплывающей кнопки «отмена» в playwright вызывает исключение

#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() )? Я не могу найти никакой документации для версии Python page.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 , поскольку считаю его более читаемым.