Files
stealthii/tests/test_stealth_detection.py
T

62 lines
1.9 KiB
Python
Raw Normal View History

2026-09-09 13:49:07 +02:00
# retoor <retoor@molodetz.nl>
import pytest
from stealthii import Stealthii
@pytest.mark.online
@pytest.mark.asyncio
async def test_sannysoft_detection_suite_is_clean():
"""Regression guard: every check on bot.sannysoft.com must pass under
our stealth patches. If this starts failing, a Chromium upgrade likely
changed something the STEALTH_INIT_JS patches assume."""
s = Stealthii()
try:
async with s.page() as pg:
await pg.goto('https://bot.sannysoft.com/', wait_until='networkidle', timeout=20000)
rows = await pg.evaluate(
"""() => Array.from(document.querySelectorAll('table tr')).map(tr =>
Array.from(tr.querySelectorAll('td')).map(td => td.innerText.trim()).join(' | ')
)"""
)
finally:
await s.shutdown()
failures = [r for r in rows if 'FAIL' in r or 'failed' in r]
assert not failures, f'stealth detection regressions: {failures}'
@pytest.mark.online
@pytest.mark.asyncio
async def test_async_with_instance_claims_isolated_concurrent_tabs():
"""`async with stealth as pg` must behave like `stealth.page()`, and be
safe to use concurrently from multiple tasks on one shared instance."""
import asyncio
s = Stealthii()
async def worker():
async with s as pg:
await pg.goto('https://example.com')
return await pg.title()
try:
titles = await asyncio.gather(*[worker() for _ in range(3)])
finally:
await s.shutdown()
assert titles == ['Example Domain'] * 3
@pytest.mark.online
@pytest.mark.asyncio
async def test_fast_path_uses_real_chromium_fingerprint():
"""The no-tab get()/post() fast path must carry a genuine Chromium TLS
fingerprint, distinct from a plain Python HTTP stack's."""
s = Stealthii()
try:
info = await s.fingerprint_info()
finally:
await s.shutdown()
assert info['hash']
assert info['mode'] == 'ja4'