Pyppeteer: обнаружение навигации по методу Page.click - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть следующий фрагмент кода, который загружает страницу и следует по ссылке внутри нее, используя asyncio.gather, как рекомендовано в документации для метода щелчка :

import asyncio

import pyppeteer


async def main(selector):
    browser = await pyppeteer.launch()
    page = await browser.newPage()
    await page.goto("https://example.org")
    result = await asyncio.gather(
        page.waitForNavigation(),
        page.click(selector),
    )
    result = next(filter(None, result))
    if result and isinstance(result, pyppeteer.network_manager.Response):
        print(result.status, result.url)


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(selector="a"))

Это чудесно, когда метод click вызывает событие навигации:

200 https://www.iana.org/domains/reserved

Но я пытаюсь написать обобщенный код c, который может обрабатывать любой селектор, даже те, которые не вызывают навигацию , Если я переключаю селектор на «h1», я получаю следующий тайм-аут, потому что нет навигации, чтобы ждать:

Traceback (most recent call last):
  File "stackoverflow.py", line 20, in <module>
    loop.run_until_complete(main(selector="h1"))
  File "/usr/lib/python3.6/asyncio/base_events.py", line 484, in run_until_complete
    return future.result()
  File "stackoverflow.py", line 12, in main
    page.click(selector),
  File "/.../lib/python3.6/site-packages/pyppeteer/page.py", line 938, in waitForNavigation
    raise error
pyppeteer.errors.TimeoutError: Navigation Timeout Exceeded: 30000 ms exceeded.

Я не смог найти способ определить, будет ли событие click произвести дополнительный запрос, чтобы избежать звонка Page.waitForNavigation. Является ли это возможным? Заранее спасибо за ваше время!

...