Pydoll is a library for automating chromium-based browsers without a WebDriver, offering realistic interactions.
This report summarizes scanner evidence for autoscrape-labs/pydoll, a HTML project with 7,110 GitHub stars. SynthScan examined 126,395 lines of code across 545 source files, recording 2393 pattern matches distributed across 19 syntactic categories. The legacy adjusted pattern signal is 25.4 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1369 finding(s).
Are imports declared and package/API names verified? 832 finding(s).
Are wrappers, guards, and repeated structures necessary? 1459 finding(s).
Which changes need focused human review? 2393 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 2393 distinct pattern matches across 19 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/test_har_recorder.py | 33 | async def test_stop_awaits_in_flight_body_tasks_and_cleans_up(): | CODE |
| LOW | tests/unit/test_har_recorder.py | 56 | async def test_stop_flushes_in_flight_request_as_pending_entry(): | CODE |
| LOW | tests/unit/test_har_recorder.py | 94 | async def test_fetch_response_body_retries_until_body_available(): | CODE |
| LOW | tests/unit/test_har_recorder.py | 107 | async def test_fetch_response_body_no_retry_when_body_not_expected(): | CODE |
| LOW | tests/unit/test_har_recorder.py | 119 | async def test_fetch_response_body_gives_up_after_max_attempts(): | CODE |
| LOW | tests/unit/test_emulation_commands.py | 13 | def test_get_screen_infos_shape(): | CODE |
| LOW | tests/unit/test_emulation_commands.py | 41 | def test_update_screen_omits_unset_params(): | CODE |
| LOW | tests/unit/test_emulation_commands.py | 46 | def test_update_screen_requires_only_screen_id(): | CODE |
| LOW⚡ | tests/unit/test_url_match.py | 29 | def test_regex_is_searched_anywhere_in_the_url(): | CODE |
| LOW⚡ | tests/unit/test_url_match.py | 35 | def test_callable_decides_by_itself(): | CODE |
| LOW⚡ | tests/unit/test_url_match.py | 41 | def test_unsupported_pattern_type_is_rejected(): | CODE |
| LOW⚡ | tests/unit/test_url_match.py | 46 | def test_glob_translation_is_anchored_and_escapes_regex_characters(): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 24 | def test_normalize_synthetic_xpath_extracts_inner_xpath(): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 28 | def test_normalize_synthetic_xpath_passes_through_plain_selector(): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 32 | def test_normalize_synthetic_xpath_returns_input_when_unparseable(): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 43 | def test_decode_image_to_bytes(self): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 52 | def test_decode_image_to_bytes_empty_string(self): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 59 | def test_decode_image_to_bytes_complex_data(self): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 210 | def test_validate_browser_paths_file_exists_but_not_executable(self): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 226 | def test_validate_browser_paths_directory_instead_of_file(self): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 236 | def test_validate_browser_paths_empty_list(self): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 245 | def test_validate_browser_paths_mixed_valid_invalid(self): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 287 | def test_validate_browser_paths_valid_path(self, tmp_path): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 297 | def test_validate_browser_paths_invalid_paths(self): | CODE |
| LOW | tests/unit/test_utils.py | 105 | async def test_missing_websocket_url(self): | CODE |
| LOW | tests/unit/test_utils.py | 155 | def test_validate_browser_paths_success(self): | CODE |
| LOW | tests/unit/test_utils.py | 173 | def test_validate_browser_paths_first_valid_wins(self): | CODE |
| LOW | tests/unit/test_utils.py | 192 | def test_validate_browser_paths_no_valid_paths(self): | CODE |
| LOW | tests/unit/test_utils.py | 308 | def test_clean_script_for_analysis_removes_comments(self): | CODE |
| LOW⚡ | tests/unit/test_utils.py | 340 | def test_is_script_already_function_regular_function(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 345 | def test_is_script_already_function_arrow_function(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 350 | def test_is_script_already_function_with_parameters(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 355 | def test_is_script_already_function_not_function(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 360 | def test_is_script_already_function_with_whitespace(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 365 | def test_has_return_outside_function_simple_return(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 370 | def test_has_return_outside_function_no_return(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 375 | def test_has_return_outside_function_return_inside_function(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 385 | def test_has_return_outside_function_mixed_returns(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 395 | def test_has_return_outside_function_already_function(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 400 | def test_has_return_outside_function_with_comments(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 410 | def test_has_return_outside_function_nested_braces(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 424 | def test_has_return_outside_function_arrow_function(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 434 | def test_extract_text_without_strip_without_separator(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 440 | def test_extract_text_with_strip_without_separator(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 446 | def test_extract_text_without_strip_with_separator(self): | STRING |
| LOW⚡ | tests/unit/test_utils.py | 452 | def test_extract_text_with_strip_with_separator(self): | STRING |
| LOW | tests/unit/test_utils.py | 324 | def test_clean_script_for_analysis_removes_strings(self): | STRING |
| LOW⚡ | tests/unit/test_tab_waits.py | 26 | async def test_returns_the_matching_url(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 33 | async def test_times_out_when_the_url_never_matches(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 41 | async def test_returns_a_primitive_value_and_evaluates_by_reference(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 51 | async def test_a_node_is_truthy_and_its_handle_is_released(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 60 | async def test_a_function_and_an_empty_object_are_truthy(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 115 | async def test_returns_when_nothing_matches(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 120 | async def test_passes_every_criterion_through_to_find(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 128 | async def test_enables_network_events_for_the_wait_and_restores_them(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 136 | async def test_a_request_in_flight_keeps_the_page_busy(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 336 | async def test_waits_for_the_main_frame_and_the_load_event(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 345 | async def test_url_filter_ignores_other_navigations(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 352 | async def test_the_whole_wait_is_bounded_by_one_timeout(self, fake_conn, fake_tab): | CODE |
| LOW⚡ | tests/unit/test_tab_waits.py | 362 | async def test_a_load_event_before_the_navigation_does_not_count(self, fake_conn, fake_tab): | CODE |
| 1160 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 191 | assert '(!real || _truthful.has(self))' in js | CODE |
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 317 | assert 'if (real === null && extensionOwnedParams.has(pname)) return real;' in js | CODE |
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 319 | assert '_apply(origGetSupportedExtensions, this, []);\n return null;' in js | CODE |
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 324 | assert 'const ext1 = null;' in js | CODE |
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 325 | assert 'const ext1Order = null;' in js | CODE |
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 400 | assert 'const limits = null;' in js | CODE |
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 401 | assert 'const features = null;' in js | CODE |
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 443 | assert 'if (wanted.length > 0 && wanted.every((f) => allow.has(f))) return real;' in js | CODE |
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 586 | assert '_FAKES.get(m).enabledPlugin = owner || null;' in js | CODE |
| HIGH⚡ | tests/unit/test_fingerprint_builder.py | 586 | assert '_FAKES.get(m).enabledPlugin = owner || null;' in js | CODE |
| HIGH | tests/unit/test_fingerprint_builder.py | 341 | assert 'if (pname === COMPRESSED_FORMATS && ArrayBuffer.isView(real))' in js | CODE |
| HIGH | tests/integration/test_iframe_integration.py | 928 | Its ``contentDocument.frameId`` is null, so resolution goes through the | STRING |
| HIGH | tests/integration/test_fingerprint_webgl_integration.py | 36 | out[kind] = gl ? gl.getSupportedExtensions() : null; | CODE |
| HIGH | tests/integration/test_fingerprint_webgl_integration.py | 50 | out.unsupported = out.list1.filter((name) => gl.getExtension(name) === null); | CODE |
| HIGH | tests/integration/test_fingerprint_webgl_integration.py | 87 | } : null; | CODE |
| HIGH | tests/integration/test_fingerprint_webgl_integration.py | 112 | returnsUndefined: pa.provokingVertexWEBGL(pa.FIRST_VERTEX_CONVENTION_WEBGL) === undefined, | CODE |
| HIGH⚡ | tests/integration/test_query_script_integration.py | 45 | nothing = await tab.query_script('function() { return null; }') | CODE |
| HIGH⚡ | tests/integration/playwright/test_events_integration.py | 80 | await page.evaluate('() => console.log(true, null, undefined, 1, 1.5, "s", -0, NaN)') | CODE |
| HIGH | …s/integration/playwright/test_isolation_integration.py | 15 | const record = (name) => calls.push(name); | CODE |
| HIGH⚡ | …s/integration/playwright/test_isolation_integration.py | 73 | assert await handle.evaluate('e => window.__app.ready && e.id') == 'btn-save' | STRING |
| HIGH | tests/integration/playwright/test_page_integration.py | 391 | '() => screen.width >= innerWidth && screen.height >= innerHeight' | CODE |
| HIGH | pydoll/constants.py | 31 | rect.width > 0 && rect.height > 0 | CODE |
| HIGH | pydoll/constants.py | 47 | return elementFromPoint === this || this.contains(elementFromPoint); | CODE |
| HIGH | pydoll/constants.py | 90 | var select = this && this.parentElement ? this.parentElement.closest('select') : null; | CODE |
| HIGH | pydoll/constants.py | 90 | var select = this && this.parentElement ? this.parentElement.closest('select') : null; | CODE |
| HIGH⚡ | pydoll/constants.py | 112 | "{escaped_value}", this, null, | CODE |
| HIGH⚡ | pydoll/constants.py | 120 | "{escaped_value}", document, null, | CODE |
| HIGH⚡ | pydoll/constants.py | 129 | "{escaped_value}", this, null, | CODE |
| HIGH⚡ | pydoll/constants.py | 134 | results.push(elements.snapshotItem(i)); | CODE |
| HIGH⚡ | pydoll/constants.py | 142 | "{escaped_value}", document, null, | CODE |
| HIGH⚡ | pydoll/constants.py | 147 | results.push(elements.snapshotItem(i)); | CODE |
| HIGH | pydoll/constants.py | 173 | null, | CODE |
| HIGH | pydoll/constants.py | 209 | allDescendants.push( | CODE |
| HIGH | pydoll/constants.py | 276 | jsonData = null; | CODE |
| HIGH | pydoll/constants.py | 280 | jsonData = null; | CODE |
| HIGH | pydoll/constants.py | 295 | error: error.toString(), | CODE |
| HIGH | pydoll/constants.py | 388 | GET_SCROLL_Y = 'window.scrollY || window.pageYOffset || 0' | STRING |
| HIGH | pydoll/constants.py | 397 | const scrollTop = window.scrollY || window.pageYOffset || 0; | CODE |
| HIGH | pydoll/constants.py | 426 | if (!hasSelection && text === '') { | CODE |
| HIGH | pydoll/constants.py | 512 | return !!(this && this.tagName && this.tagName.toLowerCase() === 'option'); | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 242 | if (marked !== undefined) return marked; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 247 | if (d && d.get && _FAKED.has(_apply(_ORIG, d.get, []))) { marked = true; break; } | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 255 | for (let proto = Object.getPrototypeOf(value); proto !== null; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 265 | if (value === null || typeof value !== 'object' || seen.has(value)) return null; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 265 | if (value === null || typeof value !== 'object' || seen.has(value)) return null; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 268 | if (seen.size > budget) return null; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 271 | if (Array.isArray(value) || proto === null || proto === Object.prototype | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 272 | || Object.getPrototypeOf(proto) === null) { | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 281 | if (found !== null) return found; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 283 | return null; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 292 | if (fake !== null) throw _cloneError(context, fake); | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 316 | const options = args.length > 1 ? args[1] : null; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 317 | if (options !== null && typeof options === 'object') { | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 319 | if (fake !== null) throw _cloneError("Failed to construct 'Notification'", fake); | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 322 | }, null); | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 627 | if (fp !== undefined && fp.has(pname) && !lost(this)) { | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 635 | if (pname === COMPRESSED_FORMATS && ArrayBuffer.isView(real)) { | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 640 | if (override === undefined) return real; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 641 | if (real === null && extensionOwnedParams.has(pname)) return real; | CODE |
| HIGH⚡ | pydoll/utils/fingerprint_builder.py | 646 | if (hasPrecision && Object.keys(precisionOverrides).length > 0) { | CODE |
| 64 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/test_har_recorder.py | 9 | CODE | |
| LOW | tests/unit/test_emulation_commands.py | 7 | CODE | |
| LOW | tests/unit/test_url_match.py | 3 | CODE | |
| LOW | tests/unit/test_utils.py | 7 | CODE | |
| LOW | tests/unit/conftest.py | 11 | CODE | |
| LOW | tests/unit/test_tab_waits.py | 7 | CODE | |
| LOW | tests/unit/test_keyboard_humanized.py | 14 | CODE | |
| LOW | tests/unit/test_interactions.py | 8 | CODE | |
| LOW | tests/unit/test_shadow_root.py | 9 | CODE | |
| LOW | tests/unit/test_decorators.py | 5 | CODE | |
| LOW | tests/unit/test_decorators.py | 6 | CODE | |
| LOW | tests/unit/test_extractor_helpers.py | 3 | CODE | |
| LOW | tests/unit/test_temp_dir_manager.py | 8 | CODE | |
| LOW | tests/unit/test_interactions_utils.py | 3 | CODE | |
| LOW | tests/unit/test_har_cookie_parsing.py | 11 | CODE | |
| LOW | tests/unit/test_web_element.py | 10 | CODE | |
| LOW | tests/unit/test_browser_wiring.py | 8 | CODE | |
| LOW | tests/unit/test_browser_process_manager.py | 3 | CODE | |
| LOW | tests/unit/test_webgl_extensions.py | 3 | CODE | |
| LOW | tests/unit/test_browser_commands.py | 9 | CODE | |
| LOW | tests/unit/test_selector_parser.py | 3 | CODE | |
| LOW | tests/unit/test_user_agent_parser.py | 8 | CODE | |
| LOW | tests/unit/test_fingerprint_applier.py | 8 | CODE | |
| LOW | tests/unit/test_proxy_manager.py | 7 | CODE | |
| LOW | tests/unit/test_commands_manager.py | 3 | CODE | |
| LOW | tests/unit/test_bundle.py | 10 | CODE | |
| LOW | tests/unit/test_fingerprint_builder.py | 9 | CODE | |
| LOW | tests/unit/test_events_manager.py | 3 | CODE | |
| LOW | tests/unit/test_mouse_humanized.py | 12 | CODE | |
| LOW | tests/unit/test_tab_commands.py | 10 | CODE | |
| LOW | tests/unit/test_request_cookie_extraction.py | 11 | CODE | |
| LOW | tests/unit/test_scroll_humanized.py | 15 | CODE | |
| LOW | tests/unit/test_find_elements_mixin.py | 9 | CODE | |
| LOW | tests/unit/playwright/test_boundary.py | 8 | CODE | |
| LOW | tests/unit/playwright/test_pure_helpers.py | 3 | CODE | |
| LOW | tests/unit/playwright/test_surface.py | 8 | CODE | |
| LOW | tests/unit/sync/test_runtime.py | 3 | CODE | |
| LOW | tests/unit/sync/test_generated_current.py | 6 | CODE | |
| LOW | tests/integration/conftest.py | 3 | CODE | |
| LOW | tests/integration/test_web_element_integration.py | 10 | CODE | |
| LOW | tests/integration/test_tab_io_integration.py | 12 | CODE | |
| LOW | tests/integration/test_extractor_integration.py | 3 | CODE | |
| LOW | tests/integration/test_interactions_integration.py | 9 | CODE | |
| LOW | tests/integration/test_browser_start_failure.py | 8 | CODE | |
| LOW | tests/integration/test_fingerprint_webgl_integration.py | 11 | CODE | |
| LOW | tests/integration/test_tab_request_integration.py | 9 | CODE | |
| LOW | tests/integration/test_tab_features_integration.py | 11 | CODE | |
| LOW | tests/integration/test_tab.py | 10 | CODE | |
| LOW | tests/integration/test_browser_integration.py | 10 | CODE | |
| LOW | tests/integration/test_socks5_forwarder.py | 13 | CODE | |
| LOW | tests/integration/test_connection_handler.py | 9 | CODE | |
| LOW | tests/integration/_waits.py | 10 | CODE | |
| LOW | tests/integration/test_waiting_integration.py | 8 | CODE | |
| LOW | tests/integration/playwright/conftest.py | 8 | CODE | |
| LOW | tests/integration/playwright/test_events_integration.py | 3 | CODE | |
| LOW | …s/integration/playwright/test_isolation_integration.py | 3 | CODE | |
| LOW | …/integration/playwright/test_docs_flows_integration.py | 9 | CODE | |
| LOW | …sts/integration/playwright/test_locator_integration.py | 3 | CODE | |
| LOW | tests/integration/playwright/test_engine_integration.py | 7 | CODE | |
| LOW | tests/integration/playwright/test_page_integration.py | 3 | CODE | |
| 636 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pydoll/connection/connection_handler.py | 101 | Send CDP command and await response. Args: command: CDP command to send. timeo | STRING |
| HIGH | pydoll/connection/connection_handler.py | 198 | Send several commands back to back and wait for all of their answers. The browser handles the commands of one s | STRING |
| HIGH | pydoll/utils/general.py | 161 | Validates potential browser executable paths and returns the first valid one. Checks a list of possible browse | STRING |
| HIGH | pydoll/extractor/field.py | 64 | Define extraction metadata for a model field. Wraps pydantic.Field() and registers ExtractionMetadata for the engin | STRING |
| HIGH | pydoll/extractor/model.py | 62 | Read ExtractionMetadata from pydantic FieldInfo objects via registry. For each field, checks if json_schema_extra c | STRING |
| HIGH | pydoll/extractor/engine.py | 42 | Extract a single model instance from the page. Args: model: ExtractionModel subclass to populate. | STRING |
| HIGH | pydoll/extractor/engine.py | 292 | Build model instance from extracted values. Pydantic handles validation, type coercion, and defaults. Args: | STRING |
| HIGH | pydoll/browser/tab.py | 293 | Extract structured data from the page into a typed model. Args: model: ExtractionModel subclass def | STRING |
| HIGH | pydoll/browser/tab.py | 502 | Find all shadow roots in the page. Traverses the entire DOM tree (including iframes and nested shadow | STRING |
| HIGH | pydoll/browser/tab.py | 805 | Get the response body for a given request ID. Args: request_id: Request ID to get the resp | STRING |
| HIGH | pydoll/browser/tab.py | 827 | Get network logs. Args: filter: Filter to apply to the network logs. Returns: | STRING |
| HIGH | pydoll/browser/tab.py | 919 | Wait until the tab's URL matches a pattern and return it. Covers full navigations and in-page changes | STRING |
| HIGH | pydoll/browser/tab.py | 951 | Wait until a JavaScript expression evaluates to a truthy value and return it. Truthiness is JavaScript | STRING |
| HIGH | pydoll/browser/tab.py | 1009 | Wait until no element matches the criteria, the same criteria ``find()`` takes. Use it for the thing t | STRING |
| HIGH | pydoll/browser/tab.py | 1168 | Capture the first request whose URL matches, sent during the block. The handle is empty inside the blo | STRING |
| HIGH | pydoll/browser/tab.py | 1216 | Capture the first response whose URL matches, received during the block. The block exits once the resp | STRING |
| HIGH | pydoll/browser/tab.py | 1334 | Capture screenshot of current page. Args: path: File path for screenshot (extension determ | STRING |
| HIGH | pydoll/browser/tab.py | 1417 | Generate PDF of current page. Args: path: File path for PDF output. Required if as_base64= | STRING |
| HIGH | pydoll/browser/tab.py | 1638 | Execute JavaScript in page context. Args: script (str): JavaScript code to execute. | STRING |
| HIGH | pydoll/browser/managers/browser_process_manager.py | 65 | Launch browser process with CDP debugging enabled. Args: binary_location: Path to browser | STRING |
| HIGH | pydoll/browser/requests/request.py | 96 | Execute an HTTP request in the browser's JavaScript context. This method uses the browser's fetch API to make r | STRING |
| HIGH | pydoll/browser/chromium/base.py | 1060 | Send a raw CDP command on the browser-level session. Use it for browser-wide domains (Target, Browser, | STRING |
| HIGH | pydoll/elements/web_element.py | 291 | Get the shadow root attached to this element. Args: timeout: Maximum seconds to wait for t | STRING |
| HIGH | pydoll/elements/web_element.py | 361 | Retrieve all direct and nested child elements of this element. Args: max_depth (int, optio | STRING |
| HIGH | pydoll/elements/web_element.py | 394 | Retrieve all sibling elements of this element (elements at the same DOM level). Args: tag_ | STRING |
| HIGH | pydoll/elements/web_element.py | 424 | Capture screenshot of this element only. Automatically scrolls element into view before capturing. | STRING |
| HIGH | pydoll/elements/web_element.py | 987 | Execute JavaScript in element context. Args: script (str): JavaScript code to execute. Use | STRING |
| HIGH | pydoll/elements/mixins/find_elements_mixin.py | 159 | Find element(s) using combination of common HTML attributes. Flexible element location using standard | STRING |
| HIGH | pydoll/elements/mixins/find_elements_mixin.py | 272 | Find element(s) using raw CSS selector or XPath expression. Direct access using CSS or XPath syntax. S | STRING |
| HIGH | pydoll/elements/mixins/find_elements_mixin.py | 318 | Core element finding method with optional waiting capability. Searches for elements with flexible wait | STRING |
| HIGH | pydoll/elements/mixins/find_elements_mixin.py | 393 | Retry loop for iframe-crossing element searches. Repeatedly calls :meth:`_attempt_find_across_iframes` | STRING |
| HIGH | pydoll/elements/mixins/find_elements_mixin.py | 472 | Find first element matching selector. Internal method performing actual element search. Can be called | STRING |
| HIGH | pydoll/elements/mixins/find_elements_mixin.py | 537 | Find all elements matching selector. Internal method performing actual multi-element search. Can be ca | STRING |
| HIGH | pydoll/elements/mixins/find_elements_mixin.py | 603 | Run a JavaScript function that returns elements and wrap them as WebElements. The function runs with t | STRING |
| HIGH | pydoll/elements/mixins/find_elements_mixin.py | 879 | Send a raw CDP command through this object's session. The command is routed exactly like the object's | STRING |
| HIGH | pydoll/commands/network_commands.py | 140 | Deletes browser cookies with matching criteria. Provides granular control over cookie removal through | STRING |
| HIGH | pydoll/commands/network_commands.py | 224 | Retrieves cookies matching specified URLs. Args: urls: list of URLs to scope cookie retrie | STRING |
| HIGH | pydoll/commands/network_commands.py | 430 | Applies custom HTTP headers to all subsequent requests. Enables advanced scenarios: - A/B test | STRING |
| HIGH | pydoll/sync/_generated.py | 485 | Send a raw CDP command on the browser-level session. Use it for browser-wide domains (Target, Browser, | STRING |
| HIGH | pydoll/sync/_generated.py | 810 | Send a raw CDP command on the browser-level session. Use it for browser-wide domains (Target, Browser, | STRING |
| HIGH | pydoll/sync/_generated.py | 916 | Extract structured data from the page into a typed model. Args: model: ExtractionModel subclass def | STRING |
| HIGH | pydoll/sync/_generated.py | 1039 | Find all shadow roots in the page. Traverses the entire DOM tree (including iframes and nested shadow | STRING |
| HIGH | pydoll/sync/_generated.py | 1082 | Get the response body for a given request ID. Args: request_id: Request ID to get the resp | STRING |
| HIGH | pydoll/sync/_generated.py | 1097 | Get network logs. Args: filter: Filter to apply to the network logs. Returns: | STRING |
| HIGH | pydoll/sync/_generated.py | 1162 | Wait until the tab's URL matches a pattern and return it. Covers full navigations and in-page changes | STRING |
| HIGH | pydoll/sync/_generated.py | 1182 | Wait until a JavaScript expression evaluates to a truthy value and return it. Truthiness is JavaScript | STRING |
| HIGH | pydoll/sync/_generated.py | 1208 | Wait until no element matches the criteria, the same criteria ``find()`` takes. Use it for the thing t | STRING |
| HIGH | pydoll/sync/_generated.py | 1259 | Capture the first request whose URL matches, sent during the block. The handle is empty inside the blo | STRING |
| HIGH | pydoll/sync/_generated.py | 1278 | Capture the first response whose URL matches, received during the block. The block exits once the resp | STRING |
| HIGH | pydoll/sync/_generated.py | 1313 | Capture screenshot of current page. Args: path: File path for screenshot (extension determ | STRING |
| HIGH | pydoll/sync/_generated.py | 1333 | Generate PDF of current page. Args: path: File path for PDF output. Required if as_base64= | STRING |
| HIGH | pydoll/sync/_generated.py | 1406 | Execute JavaScript in page context. Args: script (str): JavaScript code to execute. | STRING |
| HIGH | pydoll/sync/_generated.py | 1549 | Find element(s) using combination of common HTML attributes. Flexible element location using standard | STRING |
| HIGH | pydoll/sync/_generated.py | 1588 | Find element(s) using raw CSS selector or XPath expression. Direct access using CSS or XPath syntax. S | STRING |
| HIGH | pydoll/sync/_generated.py | 1611 | Run a JavaScript function that returns elements and wrap them as WebElements. The function runs with t | STRING |
| HIGH | pydoll/sync/_generated.py | 1639 | Send a raw CDP command through this object's session. The command is routed exactly like the object's | STRING |
| HIGH | pydoll/sync/_generated.py | 1853 | Get the shadow root attached to this element. Args: timeout: Maximum seconds to wait for t | STRING |
| HIGH | pydoll/sync/_generated.py | 1872 | Retrieve all direct and nested child elements of this element. Args: max_depth (int, optio | STRING |
| HIGH | pydoll/sync/_generated.py | 1891 | Retrieve all sibling elements of this element (elements at the same DOM level). Args: tag_ | STRING |
| HIGH | pydoll/sync/_generated.py | 1909 | Capture screenshot of this element only. Automatically scrolls element into view before capturing. | STRING |
| 10 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/conftest.py | 41 | def set_response(self, method: str, result: dict) -> None: | CODE |
| LOW | tests/unit/conftest.py | 45 | def set_failure(self, method: str, code: int, message: str) -> None: | CODE |
| LOW | tests/integration/conftest.py | 77 | def set_error(self, method: str, code: int, message: str) -> None: | CODE |
| LOW | tests/integration/conftest.py | 85 | def set_result(self, method: str, result: dict) -> None: | CODE |
| LOW | pydoll/__init__.py | 28 | __all__ = [ | CODE |
| LOW | pydoll/decorators.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/interactions/__init__.py | 13 | __all__ = [ | CODE |
| LOW | pydoll/interactions/iframe.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/interactions/mouse.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/interactions/keyboard.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/connection/connection_handler.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/connection/__init__.py | 3 | __all__ = [ | CODE |
| LOW | pydoll/connection/managers/events_manager.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/connection/managers/__init__.py | 4 | __all__ = [ | CODE |
| LOW | pydoll/connection/managers/commands_manager.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/utils/socks5_proxy_forwarder.py | 66 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/utils/__init__.py | 18 | __all__ = [ | CODE |
| LOW | pydoll/utils/fingerprint_builder.py | 99 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/utils/general.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/extractor/__init__.py | 9 | __all__ = [ | CODE |
| LOW | pydoll/extractor/engine.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/playwright/_playwright.py | 208 | def set_test_id_attribute(self, attribute_name: str) -> None: | CODE |
| LOW | pydoll/playwright/_locator.py | 342 | async def set_checked(self, checked: bool, **kwargs: Any) -> None: | CODE |
| LOW | pydoll/playwright/_locator.py | 523 | __all__ = ['FilePayload', 'FrameLocator', 'Locator', 'Pattern', 'Position', 'SelectOption'] | CODE |
| LOW | pydoll/playwright/__init__.py | 11 | __all__ = ['Error', 'TargetClosedError', 'TimeoutError'] | CODE |
| LOW | pydoll/playwright/_actions.py | 808 | __all__ = [ | CODE |
| LOW⚡ | pydoll/playwright/_browser_context.py | 252 | def set_default_timeout(self, timeout: float) -> None: | CODE |
| LOW⚡ | pydoll/playwright/_browser_context.py | 255 | def set_default_navigation_timeout(self, timeout: float) -> None: | CODE |
| LOW⚡ | pydoll/playwright/_browser_context.py | 372 | async def set_geolocation(self, geolocation: dict[str, float] | None) -> None: | CODE |
| LOW⚡ | pydoll/playwright/_browser_context.py | 380 | async def set_extra_http_headers(self, headers: dict[str, str]) -> None: | CODE |
| LOW⚡ | pydoll/playwright/_browser_context.py | 385 | async def set_offline(self, offline: bool) -> None: | CODE |
| LOW | pydoll/playwright/_browser_context.py | 586 | __all__ = ['BrowserContext', 'RuntimeCommands'] | CODE |
| LOW⚡ | pydoll/playwright/_page.py | 434 | def set_default_timeout(self, timeout: float) -> None: | CODE |
| LOW⚡ | pydoll/playwright/_page.py | 437 | def set_default_navigation_timeout(self, timeout: float) -> None: | CODE |
| LOW | pydoll/playwright/_page.py | 55 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/playwright/_page.py | 207 | async def _settle_event_sources(self) -> None: | CODE |
| LOW | pydoll/playwright/_page.py | 272 | async def _settle_frames(self, deadline: Deadline) -> None: | CODE |
| LOW | pydoll/playwright/_page.py | 865 | async def set_extra_http_headers(self, headers: dict[str, str]) -> None: | CODE |
| LOW | pydoll/playwright/_page.py | 871 | async def set_viewport_size(self, viewport_size: dict[str, int]) -> None: | CODE |
| LOW | pydoll/playwright/_page.py | 1179 | async def set_checked(self, selector: str, checked: bool, **kwargs: Any) -> None: | CODE |
| LOW | pydoll/playwright/_page.py | 1185 | async def set_input_files(self, selector: str, files: Any, **kwargs: Any) -> None: | CODE |
| LOW | pydoll/playwright/_page.py | 1263 | __all__ = ['Page', 'WebElement', 'Awaitable', 'TargetClosedError'] | CODE |
| LOW | pydoll/playwright/_browser.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/playwright/_network.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/playwright/_events.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | pydoll/playwright/_dialog.py | 236 | __all__ = ['ConsoleMessage', 'Dialog', 'Download', 'FileChooser', 'JSHandle'] | CODE |
| LOW | pydoll/playwright/_element_handle.py | 270 | async def set_checked(self, checked: bool, **kwargs: Any) -> None: | CODE |
| LOW | pydoll/playwright/async_api/__init__.py | 27 | __all__ = [ | CODE |
| LOW⚡ | pydoll/playwright/sync_api/_generated.py | 338 | def set_default_timeout(self, timeout: float) -> None: | CODE |
| LOW⚡ | pydoll/playwright/sync_api/_generated.py | 341 | def set_default_navigation_timeout(self, timeout: float) -> None: | CODE |
| LOW⚡ | pydoll/playwright/sync_api/_generated.py | 368 | def set_geolocation(self, geolocation: dict[str, float] | None) -> None: | CODE |
| LOW⚡ | pydoll/playwright/sync_api/_generated.py | 371 | def set_extra_http_headers(self, headers: dict[str, str]) -> None: | CODE |
| LOW⚡ | pydoll/playwright/sync_api/_generated.py | 374 | def set_offline(self, offline: bool) -> None: | CODE |
| LOW⚡ | pydoll/playwright/sync_api/_generated.py | 494 | def set_default_timeout(self, timeout: float) -> None: | CODE |
| LOW⚡ | pydoll/playwright/sync_api/_generated.py | 497 | def set_default_navigation_timeout(self, timeout: float) -> None: | CODE |
| LOW⚡ | pydoll/playwright/sync_api/_generated.py | 1099 | def set_checked(self, checked: bool, **kwargs: Any) -> None: | CODE |
| LOW⚡ | pydoll/playwright/sync_api/_generated.py | 1108 | def set_input_files(self, files: str | Path | FilePayload | Sequence[str | Path] | Sequence[FilePayload], timeout: f | CODE |
| LOW | pydoll/playwright/sync_api/_generated.py | 228 | def set_test_id_attribute(self, attribute_name: str) -> None: | CODE |
| LOW | pydoll/playwright/sync_api/_generated.py | 572 | def set_content(self, html: str, timeout: float | None=None, wait_until: str | None=None) -> None: | CODE |
| LOW | pydoll/playwright/sync_api/_generated.py | 611 | def set_extra_http_headers(self, headers: dict[str, str]) -> None: | CODE |
| 40 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/integration/conftest.py | 116 | except websockets.ConnectionClosed: | CODE |
| HIGH | tests/integration/test_har_recording_integration.py | 150 | except (BrokenPipeError, ConnectionResetError, OSError): | CODE |
| HIGH | tests/integration/test_har_recording_integration.py | 161 | except (BrokenPipeError, ConnectionResetError, OSError): | CODE |
| HIGH | tests/integration/test_socks5_forwarder.py | 43 | except OSError: | CODE |
| HIGH | pydoll/interactions/scroll.py | 326 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | pydoll/utils/socks5_proxy_forwarder.py | 125 | except (ConnectionResetError, BrokenPipeError, OSError): | CODE |
| HIGH | pydoll/utils/socks5_proxy_forwarder.py | 516 | except NotImplementedError: | CODE |
| HIGH | pydoll/utils/socks5_proxy_forwarder.py | 598 | except (asyncio.TimeoutError, OSError): | CODE |
| HIGH | pydoll/utils/socks5_proxy_forwarder.py | 397 | except (asyncio.TimeoutError, OSError): | CODE |
| HIGH | pydoll/playwright/_actions.py | 121 | except Retry: | CODE |
| HIGH | pydoll/playwright/_browser_context.py | 471 | except Exception: | CODE |
| HIGH | pydoll/playwright/_browser_context.py | 498 | except PydollException: | CODE |
| HIGH | pydoll/playwright/_page.py | 1109 | except TRANSPORT_ERRORS: | CODE |
| HIGH | pydoll/playwright/_page.py | 642 | except Exception: | CODE |
| HIGH | pydoll/playwright/_browser.py | 204 | except TRANSPORT_ERRORS: | CODE |
| HIGH | pydoll/playwright/_browser.py | 197 | except Error: | CODE |
| HIGH | pydoll/browser/managers/temp_dir_manager.py | 113 | except Exception: # noqa: BLE001 - best-effort cleanup | CODE |
| HIGH | pydoll/elements/web_element.py | 315 | except ShadowRootNotFound: | CODE |
| HIGH | pydoll/sync/_runtime.py | 316 | except TypeError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/integration/test_extractor_integration.py | 207 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/integration/test_extractor_integration.py | 209 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/integration/test_extractor_integration.py | 21 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/integration/test_extractor_integration.py | 23 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | pydoll/elements/utils/selector_parser.py | 20 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | pydoll/elements/utils/selector_parser.py | 22 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | pydoll/elements/utils/selector_parser.py | 159 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | pydoll/elements/utils/selector_parser.py | 161 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | pydoll/elements/utils/selector_parser.py | 197 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | pydoll/elements/utils/selector_parser.py | 199 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | pydoll/elements/utils/selector_parser.py | 234 | # ================================================================== | COMMENT |
| MEDIUM⚡ | pydoll/elements/utils/selector_parser.py | 236 | # ================================================================== | COMMENT |
| MEDIUM | pydoll/elements/utils/selector_parser.py | 48 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | pydoll/elements/utils/selector_parser.py | 50 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | pydoll/elements/utils/selector_parser.py | 65 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | pydoll/elements/utils/selector_parser.py | 67 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | pydoll/elements/utils/selector_parser.py | 112 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | pydoll/elements/utils/selector_parser.py | 114 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | pydoll/elements/utils/selector_parser.py | 125 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | pydoll/elements/utils/selector_parser.py | 127 | # ------------------------------------------------------------------ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/pt/deep-dive/network/build-proxy.md | 71 | except Exception as e: | CODE |
| LOW | docs/pt/deep-dive/network/build-proxy.md | 100 | except Exception: | CODE |
| LOW | docs/pt/deep-dive/network/build-proxy.md | 265 | except Exception as e: | CODE |
| MEDIUM | docs/pt/deep-dive/network/build-proxy.md | 41 | def _handle_client(self, reader, writer): | CODE |
| MEDIUM | docs/pt/deep-dive/network/build-proxy.md | 256 | def _handle_client(self, reader, writer): | CODE |
| LOW | docs/zh/deep-dive/network/build-proxy.md | 71 | except Exception as e: | CODE |
| LOW | docs/zh/deep-dive/network/build-proxy.md | 100 | except Exception: | CODE |
| LOW | docs/zh/deep-dive/network/build-proxy.md | 265 | except Exception as e: | CODE |
| MEDIUM | docs/zh/deep-dive/network/build-proxy.md | 41 | def _handle_client(self, reader, writer): | CODE |
| MEDIUM | docs/zh/deep-dive/network/build-proxy.md | 256 | def _handle_client(self, reader, writer): | CODE |
| LOW | docs/en/deep-dive/network/build-proxy.md | 71 | except Exception as e: | CODE |
| LOW | docs/en/deep-dive/network/build-proxy.md | 100 | except Exception: | CODE |
| LOW | docs/en/deep-dive/network/build-proxy.md | 265 | except Exception as e: | CODE |
| MEDIUM | docs/en/deep-dive/network/build-proxy.md | 41 | def _handle_client(self, reader, writer): | CODE |
| MEDIUM | docs/en/deep-dive/network/build-proxy.md | 256 | def _handle_client(self, reader, writer): | CODE |
| LOW | pydoll/decorators.py | 154 | except Exception as exc: | CODE |
| LOW | pydoll/decorators.py | 190 | except Exception as exc: | CODE |
| LOW | pydoll/interactions/iframe.py | 361 | except Exception: | CODE |
| LOW | pydoll/connection/connection_handler.py | 396 | except Exception: | CODE |
| LOW | pydoll/connection/connection_handler.py | 400 | except Exception: | CODE |
| LOW | pydoll/connection/managers/events_manager.py | 92 | except Exception: | CODE |
| LOW | pydoll/connection/managers/events_manager.py | 202 | except Exception as e: | CODE |
| LOW | pydoll/utils/socks5_proxy_forwarder.py | 279 | except Exception: | CODE |
| LOW | pydoll/extractor/engine.py | 308 | except Exception as exc: | CODE |
| LOW | pydoll/playwright/_browser_context.py | 471 | except Exception: | CODE |
| MEDIUM | pydoll/playwright/_page.py | 711 | def waiter() -> None: | CODE |
| LOW | pydoll/playwright/_page.py | 579 | except Exception as exc: | CODE |
| LOW | pydoll/playwright/_page.py | 626 | except Exception as error: | CODE |
| LOW | pydoll/playwright/_page.py | 642 | except Exception: | CODE |
| LOW | pydoll/playwright/_page.py | 714 | except Exception as error: | CODE |
| LOW | pydoll/playwright/_network.py | 753 | except Exception: | CODE |
| LOW | pydoll/playwright/_network.py | 792 | except Exception as error: | CODE |
| LOW | pydoll/playwright/_navigation.py | 287 | except Exception as error: | CODE |
| MEDIUM | pydoll/playwright/_navigation.py | 253 | def waiter() -> None: | CODE |
| LOW | pydoll/playwright/_events.py | 67 | except Exception: | CODE |
| LOW | pydoll/playwright/_events.py | 74 | except Exception: | CODE |
| LOW | pydoll/browser/tab.py | 1534 | except Exception: | CODE |
| LOW | pydoll/browser/tab.py | 2260 | except Exception as exc: | CODE |
| LOW | pydoll/browser/managers/temp_dir_manager.py | 113 | except Exception: # noqa: BLE001 - best-effort cleanup | CODE |
| LOW | pydoll/browser/requests/request.py | 139 | except Exception as exc: | CODE |
| LOW | pydoll/browser/requests/har_recorder.py | 65 | except Exception: | CODE |
| LOW | pydoll/browser/requests/har_recorder.py | 331 | except Exception: | CODE |
| LOW | pydoll/browser/requests/har_recorder.py | 433 | except Exception: | CODE |
| LOW | pydoll/browser/chromium/base.py | 904 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/pt/deep-dive/fingerprinting/auditing.md | 0 | document.head.insertadjacenthtml('beforeend', '<style>.probe{--g: srgb} @media (color-gamut: p3){.probe{--g: p3}}</style | STRING |
| HIGH | docs/zh/deep-dive/fingerprinting/auditing.md | 0 | document.head.insertadjacenthtml('beforeend', '<style>.probe{--g: srgb} @media (color-gamut: p3){.probe{--g: p3}}</style | STRING |
| HIGH | docs/en/deep-dive/fingerprinting/auditing.md | 0 | document.head.insertadjacenthtml('beforeend', '<style>.probe{--g: srgb} @media (color-gamut: p3){.probe{--g: p3}}</style | STRING |
| HIGH | docs/pt/stealth/evasion-techniques.md | 0 | return { useragent: navigator.useragent, webdriver: navigator.webdriver, languages: navigator.languages, plugins: naviga | STRING |
| HIGH | docs/zh/stealth/evasion-techniques.md | 0 | return { useragent: navigator.useragent, webdriver: navigator.webdriver, languages: navigator.languages, plugins: naviga | STRING |
| HIGH | docs/en/stealth/evasion-techniques.md | 0 | return { useragent: navigator.useragent, webdriver: navigator.webdriver, languages: navigator.languages, plugins: naviga | STRING |
| HIGH | pydoll/browser/chromium/edge.py | 0 | initialize chrome browser instance. args: options: chrome configuration options (default if none). connection_port: cdp | STRING |
| HIGH | pydoll/sync/_generated.py | 0 | initialize chrome browser instance. args: options: chrome configuration options (default if none). connection_port: cdp | STRING |
| HIGH | pydoll/browser/chromium/chrome.py | 0 | initialize chrome browser instance. args: options: chrome configuration options (default if none). connection_port: cdp | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pydoll/playwright/_selectors.py | 84 | CODE | |
| LOW | pydoll/playwright/_playwright.py | 80 | CODE | |
| LOW | pydoll/playwright/_actions.py | 237 | CODE | |
| LOW | pydoll/playwright/_page.py | 985 | CODE | |
| LOW | pydoll/playwright/_page.py | 1061 | CODE | |
| LOW | pydoll/playwright/sync_api/_generated.py | 204 | CODE | |
| LOW | pydoll/playwright/sync_api/_generated.py | 644 | CODE | |
| LOW | pydoll/playwright/sync_api/_generated.py | 647 | CODE | |
| LOW | pydoll/browser/tab.py | 1618 | CODE | |
| LOW | pydoll/browser/tab.py | 2086 | CODE | |
| LOW | pydoll/elements/web_element.py | 971 | CODE | |
| LOW | pydoll/elements/mixins/find_elements_mixin.py | 78 | CODE | |
| LOW | pydoll/elements/mixins/find_elements_mixin.py | 92 | CODE | |
| LOW | pydoll/elements/mixins/find_elements_mixin.py | 106 | CODE | |
| LOW | pydoll/elements/mixins/find_elements_mixin.py | 120 | CODE | |
| LOW | pydoll/elements/mixins/find_elements_mixin.py | 134 | CODE | |
| LOW | pydoll/elements/mixins/find_elements_mixin.py | 147 | CODE | |
| LOW | pydoll/commands/target_commands.py | 152 | CODE | |
| LOW | pydoll/commands/network_commands.py | 322 | CODE | |
| LOW | pydoll/commands/runtime_commands.py | 111 | CODE | |
| LOW | pydoll/commands/runtime_commands.py | 241 | CODE | |
| LOW | pydoll/commands/page_commands.py | 385 | CODE | |
| LOW | pydoll/commands/input_commands.py | 82 | CODE | |
| LOW | pydoll/commands/input_commands.py | 171 | CODE | |
| LOW | pydoll/commands/input_commands.py | 543 | CODE | |
| LOW | pydoll/commands/emulation_commands.py | 146 | CODE | |
| LOW | pydoll/commands/emulation_commands.py | 310 | CODE | |
| LOW | pydoll/sync/_generated.py | 1405 | CODE | |
| LOW | pydoll/sync/_generated.py | 1539 | CODE | |
| LOW | pydoll/sync/_generated.py | 1541 | CODE | |
| LOW | pydoll/sync/_generated.py | 1543 | CODE | |
| LOW | pydoll/sync/_generated.py | 1545 | CODE | |
| LOW | pydoll/sync/_generated.py | 1547 | CODE | |
| LOW | pydoll/sync/_generated.py | 1548 | CODE | |
| LOW | pydoll/sync/_generated.py | 2112 | CODE | |
| LOW | pydoll/sync/_generated.py | 2159 | CODE | |
| LOW | pydoll/sync/_generated.py | 2161 | CODE | |
| LOW | pydoll/sync/_generated.py | 2163 | CODE | |
| LOW | pydoll/sync/_generated.py | 2165 | CODE | |
| LOW | pydoll/sync/_generated.py | 2167 | CODE | |
| LOW | pydoll/sync/_generated.py | 2168 | CODE | |
| LOW | pydoll/sync/_generated.py | 2312 | CODE | |
| LOW | pydoll/sync/_generated.py | 2314 | CODE | |
| LOW | pydoll/sync/_generated.py | 2316 | CODE | |
| LOW | pydoll/sync/_generated.py | 2318 | CODE | |
| LOW | pydoll/sync/_generated.py | 2320 | CODE | |
| LOW | pydoll/sync/_generated.py | 2321 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/integration/test_tab_io_integration.py | 52 | CODE | |
| LOW | tests/integration/test_tab_io_integration.py | 61 | CODE | |
| LOW | tests/integration/test_har_recording_integration.py | 60 | CODE | |
| LOW | tests/integration/test_tab_request_integration.py | 48 | CODE | |
| LOW | pydoll/connection/managers/events_manager.py | 191 | CODE | |
| LOW | pydoll/utils/url_match.py | 22 | CODE | |
| LOW | pydoll/playwright/_selectors.py | 157 | CODE | |
| LOW | pydoll/playwright/_browser_context.py | 303 | CODE | |
| LOW | pydoll/playwright/_frame.py | 977 | CODE | |
| LOW | pydoll/browser/fingerprint_applier.py | 796 | CODE | |
| LOW | pydoll/browser/fingerprint_applier.py | 830 | CODE | |
| LOW | pydoll/browser/tab.py | 1467 | CODE | |
| LOW | pydoll/browser/managers/temp_dir_manager.py | 96 | CODE | |
| LOW | pydoll/browser/requests/request.py | 496 | CODE | |
| LOW | pydoll/browser/requests/har_recorder.py | 585 | CODE | |
| LOW | scripts/generate_sync_api.py | 162 | CODE | |
| LOW | scripts/generate_sync_api.py | 209 | CODE | |
| LOW | scripts/generate_sync_api.py | 259 | CODE | |
| LOW | scripts/generate_sync_api.py | 279 | CODE | |
| LOW | scripts/generate_sync_api.py | 407 | CODE | |
| LOW | scripts/generate_sync_api.py | 607 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/unit/test_utils.py | 216 | # Create a file that exists but is not executable | COMMENT |
| MEDIUM⚡ | tests/unit/test_utils.py | 289 | # Create a temporary executable file | COMMENT |
| MEDIUM | tests/unit/test_utils.py | 161 | # Create a temporary executable file | COMMENT |
| MEDIUM | tests/integration/test_iframe_integration.py | 451 | # Create a test page with multiple iframes | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README_zh.md | 235 | await (await tab.find(id='username')).type_text('user@example.com') | CODE |
| LOW | tests/integration/test_iframe_integration.py | 383 | placeholder = input_elem.get_attribute('placeholder') | CODE |
| LOW⚡ | tests/integration/test_extractor_integration.py | 254 | assert article.author.name == 'Jane Doe' | CODE |
| LOW | tests/integration/test_extractor_integration.py | 306 | assert data['author']['name'] == 'Jane Doe' | CODE |
| LOW | tests/integration/test_extractor_integration.py | 495 | assert article.author_name == 'Jane Doe' | CODE |
| LOW⚡ | tests/integration/test_core_integration.py | 150 | test_text = 'user@example.com' | CODE |
| LOW | tests/integration/pages/web_element.html | 78 | <input id="email-input" type="email" value="user@example.com"> | CODE |
| LOW | pydoll/protocol/dom/types.py | 47 | PLACEHOLDER = 'placeholder' | CODE |
| LOW | pydoll/protocol/accessibility/types.py | 38 | PLACEHOLDER = 'placeholder' | CODE |
| LOW | pydoll/playwright/_selectors.py | 77 | return get_by_attribute_text_selector('placeholder', text, exact=exact) | CODE |
| LOW | pydoll/playwright/_injected/engine.js | 1208 | const placeholder = element.getAttribute('placeholder') || ''; | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | pydoll/playwright/_dialog.py | 227 | await self._page.context._browser._chrome.execute_command({ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pydoll/interactions/scroll.py | 154 | # Check if we are stuck | COMMENT |
| LOW | pydoll/utils/general.py | 252 | # Check if return is inside a function by counting braces | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/ISSUE_TEMPLATE/feature_request.yml | 29 | placeholder: I'm trying to accomplish X, but I'm unable to because Y... | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pydoll/elements/web_element.py | 928 | """Check if element is visible using comprehensive JavaScript visibility test.""" | STRING |
| MEDIUM | pydoll/sync/_generated.py | 2097 | """Check if element is visible using comprehensive JavaScript visibility test.""" | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pydoll/decorators.py | 131 | def my_function(): | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pydoll/utils/fingerprint_builder.py | 101 | _WEBGL_INT32_PARAMS = frozenset({'max_viewport_dims'}) | COMMENT |