I am working on a browser automation project in Python using selenium. I am trying to upload a picture to a page. I login, go to the page, and click the upload button. After cli
Here's an idea for doing a file upload without popping the chooser:
filename = 'x.jpg'
with open(filename, "rb") as file:
content = base64.b64encode(file.read()).decode('utf8')
mimeType = "image/jpeg"
selector = "input[type=file]"
driver.execute_async_script("""
const [filename, content, mimeType, selector, cb] = arguments
const dt = new DataTransfer()
const response = await fetch(`--data:${mimeType};base64,${content}`)
const file = new File([await response.blob()], filename)
dt.items.add(file)
const element = document.querySelector(selector)
element.files = dt.files
element.dispatchEvent(new Event('input', { bubbles: true }))
cb()
""", filename, content, mimeType, selector)
driver.find_element_by_css_selector('input[type=submit]').click()
Also you might want to think about switching to Puppeteer for things like this because Selenium is not likely to ever have a good implementation of this.
Selenium can only interact with the browser. The window that appears after clicking the "Upload Photos" button is the Windows File Explorer, unrelated to the browser. You'll have to use a tool like PyWinAuto or AutoIt to interact with the File Explorer.
In regards to what you're trying to accomplish, there are some workarounds: (1) using APIs, (2) passing in the file path directly to the upload button, etc. Depending on what the purpose of your script is (Automated UI Testing, automating some task of yours, etc.), some of these alternatives are better than others.