SeleniumHQ / SeleniumHQ/selenium

[py][bidi] input.setFiles has no file detector, so local paths do not work against a remote browser

Open
#18,008 0 comments 0 reactions 1 assignee Claimed by @AutomatedTester View on GitHub
C-py I-enhancement
Dominant language
Java
Stars
34.5k
Forks
8.7k
Avg merge
2d 1h
Merged PRs (30d)
92

Description

## Feature and motivation

BiDi `input.setFiles` has no equivalent of the classic file detector, so attaching a local file to a file input does not work when the browser is on another machine (Grid, Docker, cloud provider). This is a functional gap between classic and BiDi, not just a coverage gap.

Under classic, `WebElement.send_keys` on a remote driver runs the given paths through `file_detector` and uploads each one to the node before dispatching the keys:

https://github.com/SeleniumHQ/selenium/blob/trunk/py/selenium/webdriver/remote/webelement.py#L263-L274

So this works against a remote browser today:

```python
driver.find_element(By.ID, "upload").send_keys("/path/on/my/laptop/test_file.txt")
```

Under BiDi, `input.setFiles` sends the raw path straight through to the browser, which resolves it on the *browser host*. There is no upload step and no detector hook, so the same call against a remote browser either fails or silently attaches nothing:

```python
driver.input.set_files(driver.current_window_handle, element_ref, ["/path/on/my/laptop/test_file.txt"])
```

This came out of reviewing the Python BiDi interaction code (#18007). It is not Python-specific — Java, Ruby, JS, and .NET all pass paths through to `setFiles` unchanged, so whatever we decide should apply across bindings.

## Things to consider

- The existing `setFiles` tests never catch this: they all run against a local browser and assert on the input's `value`. The new round-trip tests in #18007 are also local-only. A remote-specific test would be needed either way.
- Whether the fix belongs in the bindings (detect a local path, upload it via the classic `/session/{id}/file` endpoint, then pass the returned remote path to `setFiles`) or whether BiDi should grow a file-transfer primitive of its own. The former works today but means a BiDi call depends on a classic endpoint, which is awkward for a BiDi-only future.
- Whether `setFiles` should respect `driver.file_detector` at all, or whether users should be expected to place files on the browser host themselves. If the latter, we should document that clearly, because the classic behaviour sets the opposite expectation.
- Spec question: whether this should be raised with the WebDriver BiDi spec rather than solved per-binding.

Filing so the decision is recorded rather than discovered by users migrating from classic to BiDi.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.