Following with that topic:
@Deimos I managed to do it. The solution is a bit hacky, but works, headless or not.
Hack to make selenium tests works in headless selenium driver. · GitHub
This gist has the code that keeps a reference to the last 20 created input elements.
with open("./scripts/hack-file-upload.js", "r") as f: patch_for_elm_file = f.read() driver.execute_script(patch_for_elm_file) time.sleep(1) # Not sure this is needed, but is late.
In seleinum, trigger the file dialog of the elm app.
# Awaiter is a custom class, just use regular wait. def set_file_image_elm_hack(driver: WebDriver, offset: int, path: str): id = str(random.randint(111111111, 999999999)) driver.execute_script("document.addFileInputToDom(arguments, arguments)", offset, id) file_input = WebDriverWait(driver, 30).until(ec.presence_of_element_located((By.XPATH, "//*[@test-id='" + id + "']"))) file_input.send_keys(path) driver.execute_script("document.removeFileInputFromDom(arguments)", id) if not HEADLESS: time.sleep(1) subprocess.call(["./scripts/close_file_dialog.sh"])
- This bash script closes the file dialog:
#!/usr/bin/env bash # The window name is not the same in firefox. we should handle that if we need it. win_name="Open File" # Find window PID for pid in $(xdotool search --name "$win_name"); do error=$(xdotool windowactivate $pid 2>&1) if [[ "$error" == "" ]]; then WIN=$pid break fi done if [[ "$WIN" == "" ]]; then echo "Failed to find file dialog window." exit 1 fi # Switch to the window xdotool windowactivate $WIN # Press "Open" button xdotool key --window $WIN alt+c