I don't know, maybe someone will find this example useful. When I searched for this information, I couldn't find anything. Made it minimally reproducible. And you can easily adapt it to your project.
driver.get("https://www.dragdrop.com/test/")
driver.sleep(3)
upload_file = "test.jpeg"
with open(upload_file, "rb") as f:
content = f.read()
b64_file = base64.b64encode(content).decode()
# Find the drop zone
drop_target = driver.find_element(By.ID, "demo-upload")
# Perform a Drag&Drop via JS
driver.execute_script("""
const b64 = arguments[0];
const target = arguments[1];
function b64toBlob(b64Data, contentType = '', sliceSize = 512) {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
byteArrays.push(new Uint8Array(byteNumbers));
}
return new Blob(byteArrays, { type: contentType });
}
const blob = b64toBlob(b64, 'image/jpeg');
const file = new File([blob], 'test.jpg', { type: 'image/jpeg' });
const dt = new DataTransfer();
dt.items.add(file);
const eventNames = ['dragenter', 'dragover', 'drop'];
for (const name of eventNames) {
const event = new DragEvent(name, {
dataTransfer: dt,
bubbles: true,
cancelable: true
});
target.dispatchEvent(event);
}
""", b64_file, drop_target)
driver.sleep(10)