mirror of
https://github.com/ThePhaseless/Byparr.git
synced 2026-11-10 11:08:20 +00:00
Merge pull request #427 from ThePhaseless/fix/vendored-playwright-errors
fix: catch invisible_playwright's own error classes
This commit is contained in:
7 files changed
+33
-11
No files matched your search
+1
-1
@@ -9,7 +9,7 @@ description = "API for getting cookies for Cloudflare challenges"
|
||||
readme = "README.md"
|
||||
dependencies = [
|
||||
"fastapi[standard]==0.143.*",
|
||||
"invisible-playwright>=0.6.1",
|
||||
"invisible-playwright>=0.15.0",
|
||||
"playwright==1.63.*",
|
||||
"playwright-captcha==0.1.*",
|
||||
"pydantic==2.*",
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@ import time
|
||||
from asyncio import sleep
|
||||
from contextlib import suppress
|
||||
|
||||
from playwright.async_api import Error as PlaywrightError
|
||||
from invisible_playwright.async_api import Error as PlaywrightError
|
||||
from invisible_playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
from playwright.async_api import FloatRect, Page
|
||||
from playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
from playwright_captcha.solvers.click.cloudflare.utils.detection import (
|
||||
CF_INTERSTITIAL_INDICATORS_SELECTORS,
|
||||
detect_cloudflare_challenge,
|
||||
|
||||
+2
-2
@@ -5,8 +5,8 @@ from typing import Annotated
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from fastapi.responses import RedirectResponse
|
||||
from playwright.async_api import Error as PlaywrightError
|
||||
from playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
from invisible_playwright.async_api import Error as PlaywrightError
|
||||
from invisible_playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
|
||||
from src.challenge import challenge_present, solve_challenge
|
||||
from src.content import build_response_content
|
||||
|
||||
+1
-1
@@ -7,8 +7,8 @@ from typing import Annotated
|
||||
|
||||
import trafilatura
|
||||
from fastapi import APIRouter, Depends, Header, HTTPException
|
||||
from invisible_playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
from playwright.async_api import Page
|
||||
from playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
from pydantic import BaseModel
|
||||
|
||||
from src.consts import OWUI_API_KEY
|
||||
|
||||
+25
-3
@@ -6,8 +6,8 @@ from unittest.mock import AsyncMock, MagicMock
|
||||
import httpx2
|
||||
import pytest
|
||||
from fastapi import HTTPException
|
||||
from playwright.async_api import Error as PlaywrightError
|
||||
from playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
from invisible_playwright.async_api import Error as PlaywrightError
|
||||
from invisible_playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
from starlette.testclient import TestClient
|
||||
|
||||
from main import app
|
||||
@@ -148,6 +148,7 @@ def fake_dep(
|
||||
challenged: bool = False,
|
||||
marker_counts: list[int] | None = None,
|
||||
widget_box: dict[str, float] | None = None,
|
||||
widget_error: Exception | None = None,
|
||||
user_agent: str | None = "UnitTestBrowser/1.0",
|
||||
) -> BrowserDepClass:
|
||||
"""Build a browser dependency pair backed by mocks."""
|
||||
@@ -171,7 +172,9 @@ def fake_dep(
|
||||
def locator(selector: str) -> MagicMock:
|
||||
handle = MagicMock()
|
||||
handle.count = AsyncMock(side_effect=lambda: count_for(selector))
|
||||
handle.first.bounding_box = AsyncMock(return_value=widget_box)
|
||||
handle.first.bounding_box = AsyncMock(
|
||||
return_value=widget_box, side_effect=widget_error
|
||||
)
|
||||
handle.first.input_value = AsyncMock(return_value="")
|
||||
return handle
|
||||
|
||||
@@ -298,6 +301,25 @@ async def test_challenge_that_clears_on_its_own_is_never_clicked():
|
||||
dep.page.mouse.down.assert_not_awaited()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_slow_widget_read_does_not_abort_the_solve():
|
||||
"""One widget read outlasting its short timeout is retried, never a 500 (#419)."""
|
||||
dep = fake_dep(
|
||||
challenged=True,
|
||||
marker_counts=[1, 1, 1, 0],
|
||||
widget_error=PlaywrightTimeoutError(
|
||||
"Locator.bounding_box: Timeout 1000ms exceeded."
|
||||
),
|
||||
)
|
||||
|
||||
response = await read_item(
|
||||
LinkRequest(url="https://example.test/login", max_timeout=5), dep
|
||||
)
|
||||
|
||||
assert response.status == "ok"
|
||||
dep.page.mouse.down.assert_not_awaited()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_challenge_that_never_clears_returns_408():
|
||||
"""A challenge still up when the budget runs out is a timeout, not a 500."""
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ from http import HTTPStatus
|
||||
from unittest.mock import AsyncMock, MagicMock, patch
|
||||
|
||||
import pytest
|
||||
from playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
from invisible_playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
from starlette.testclient import TestClient
|
||||
|
||||
from main import app
|
||||
|
||||
@@ -106,7 +106,7 @@ test = [
|
||||
[package.metadata]
|
||||
requires-dist = [
|
||||
{ name = "fastapi", extras = ["standard"], specifier = "==0.143.*" },
|
||||
{ name = "invisible-playwright", specifier = ">=0.6.1" },
|
||||
{ name = "invisible-playwright", specifier = ">=0.15.0" },
|
||||
{ name = "playwright", specifier = "==1.63.*" },
|
||||
{ name = "playwright-captcha", specifier = "==0.1.*" },
|
||||
{ name = "pydantic", specifier = "==2.*" },
|
||||
|
||||
Reference in new issue
Block a user