drission 0.5.1

Rust 反检测浏览器自动化与身份治理引擎:账号池指纹准入/漂移/lifecycle 审计,内置 ddddocr OCR 与滑块缺口识别,默认 Chrome/CDP、可选 Camoufox、Cloudflare 过盾、高并发爬虫与 XHR 监听拦截。Anti-detect browser automation and browser identity governance in Rust.
Documentation
import json
import os
import tempfile
import unittest
from pathlib import Path
from unittest.mock import patch

import drission_sidecar as sidecar


class SidecarTests(unittest.TestCase):
    def test_asset_context_and_accessors(self):
        asset = {
            "accountId": "acct-a",
            "profileId": "profile-a",
            "identityId": "fp-a",
            "label": "acct-a",
            "profileDir": "/profiles/acct-a",
            "leaseId": "lease-a",
        }
        env = {
            "DRS_IDENTITY_JOB_RUN_ID": "run-a",
            "DRS_IDENTITY_WORKER": "worker-a",
            "DRS_IDENTITY_JOB": "publish",
            "DRS_IDENTITY_SELECTED_COUNT": "1",
            "DRS_IDENTITY_SELECTED_ASSETS_JSON": json.dumps([asset]),
            "DRS_IDENTITY_ASSET_JSON": json.dumps(asset),
        }
        with patch.dict(os.environ, env, clear=True):
            self.assertEqual(sidecar.account_id(), "acct-a")
            self.assertEqual(sidecar.profile_id(), "profile-a")
            self.assertEqual(sidecar.identity_id(), "fp-a")
            self.assertEqual(sidecar.label(), "acct-a")
            self.assertEqual(sidecar.profile_dir(), "/profiles/acct-a")
            self.assertEqual(sidecar.runtime_lease_id(), "lease-a")
            self.assertEqual(sidecar.selected_count(), 1)
            self.assertEqual(sidecar.selected_assets(), [asset])
            self.assertEqual(sidecar.context()["job"], "publish")

    def test_succeeded_writes_result_out(self):
        with tempfile.TemporaryDirectory() as temp:
            result_out = Path(temp) / "child-result.json"
            env = {"DRS_IDENTITY_RESULT_OUT": str(result_out)}
            with patch.dict(os.environ, env, clear=True):
                payload = sidecar.succeeded("done", result={"itemId": "item-a"})

            self.assertEqual(
                payload,
                {
                    "status": "succeeded",
                    "message": "done",
                    "result": {"itemId": "item-a"},
                },
            )
            self.assertEqual(json.loads(result_out.read_text()), payload)

    def test_failed_writes_governance_reason(self):
        with tempfile.TemporaryDirectory() as temp:
            result_out = Path(temp) / "nested" / "child-result.json"
            payload = sidecar.failed(
                "rate_limited",
                "limited",
                cooldown_seconds=900,
                next_state="repair",
                path=result_out,
            )

            self.assertEqual(payload["status"], "failed")
            self.assertEqual(payload["reason"], "rate_limited")
            self.assertEqual(payload["cooldownSeconds"], 900)
            self.assertEqual(payload["nextState"], "repair")
            self.assertEqual(json.loads(result_out.read_text()), payload)

    def test_missing_result_out_raises(self):
        with patch.dict(os.environ, {}, clear=True):
            with self.assertRaises(sidecar.SidecarError):
                sidecar.succeeded("done")

    def test_invalid_asset_json_raises(self):
        with patch.dict(os.environ, {"DRS_IDENTITY_ASSET_JSON": "not-json"}, clear=True):
            with self.assertRaises(sidecar.SidecarError):
                sidecar.asset()


if __name__ == "__main__":
    unittest.main()