Я работаю над собственным проектом, в который хочу загрузить несколько изображений с помощью Python Selenium.
Вот мой код загрузки:
folder_path = i['full_folder_path']
for file_name in i['images']:
file_path = os.path.join(folder_path, file_name)
element = driver.find_element(By.CSS_SELECTOR, ".upload-images")
element.send_keys(file_path)
Странно, что картинки загружаются, но как-то странно. длина i['images'] равна 6, но загружено 12 изображений. Кроме того, они являются странными дубликатами друг друга, ниже я загружу фотографии всего:
Вот как выглядит мой каталог:
Это печатается, когда я печатаю file_path:
C:/Projects/python/rea_back/ქირავდება დღიურად ახალი აშენებული ბინა საბურთალოზე_aoiaegimet\11356160_1.jpg
C:/Projects/python/rea_back/ქირავდება დღიურად ახალი აშენებული ბინა საბურთალოზე_aoiaegimet\11356160_2.jpg
C:/Projects/python/rea_back/ქირავდება დღიურად ახალი აშენებული ბინა საბურთალოზე_aoiaegimet\11356160_3.jpg
C:/Projects/python/rea_back/ქირავდება დღიურად ახალი აშენებული ბინა საბურთალოზე_aoiaegimet\11356160_4.jpg
C:/Projects/python/rea_back/ქირავდება დღიურად ახალი აშენებული ბინა საბურთალოზე_aoiaegimet\11356160_5.jpg
C:/Projects/python/rea_back/ქირავდება დღიურად ახალი აშენებული ბინა საბურთალოზე_aoiaegimet\11356160_6.jpg
имена правильные в каталоге, как вы видите. Пожалуйста, помогите мне решить, что происходит!
РЕДАКТИРОВАТЬ 1.0
Я попытался отладить свой код, поэтому добавил следующее:
folder_path = i['full_folder_path']
uploaded_files = set()
for file_name in i['images']:
if file_name in uploaded_files:
# skip the file if it has already been uploaded
continue
file_path = os.path.join(folder_path, file_name)
print(file_path)
element = driver.find_element(By.CSS_SELECTOR, ".upload-images")
element.send_keys(file_path)
uploaded_files.add(file_name)
Это все еще дублирует изображения, мне было интересно, работает ли .add, поэтому я изменил свой код следующим образом:
folder_path = i['full_folder_path']
uploaded_files = set()
for file_name in i['images']:
uploaded_files.add(file_name)
if file_name in uploaded_files:
# skip the file if it has already been uploaded
continue
file_path = os.path.join(folder_path, file_name)
print(file_path)
element = driver.find_element(By.CSS_SELECTOR, ".upload-images")
element.send_keys(file_path)
и Никогда ничего не загружал!
Моя программа никак не взаимодействует с этим вводом, можно ли его еще загрузить? у меня есть код, в котором сохраняются изображения, но на самом деле нажатие на этот ввод только здесь, какой код я пишу здесь
Каковы двенадцать фактических имен файлов, которые были загружены?
Может быть, вы просто запустили этот код дважды, поэтому каждое из шести изображений загружалось дважды?
Как это возможно, что я запускал этот код дважды?
Я не знаю вашего рабочего процесса разработки/тестирования, поэтому не могу ответить на этот вопрос...
Я загружаю его только один раз
Значит, вы запускали этот код только один раз?
Пожалуйста, проверьте мое редактирование. Нет, я запускаю этот код несколько раз, но этот фрагмент кода используется только один раз, я имею в виду, что я никогда не нажимаю ввод нигде, кроме как здесь.
Второй пример, очевидно, не сработает — если вы сначала вызовете .add()
, то, конечно, if file_name in uploaded_files
будет истинным.
Да, я знаю, что это не сработает, но дублированные файлы все еще загружаются, когда это после кода. Так почему? Если оно истинно, когда написано сначала, то почему оно ложно, когда написано и в конце?
Как я упоминал ранее, одним из объяснений может быть то, что этот участок кода (каким-то образом) выполняется дважды. Вы не показали нам окружающий код, поэтому мы не знаем, возможно это или нет.
Кроме того, какова ваша процедура тестирования? Есть ли у вас способ удалить все загруженные файлы с сервера перед выполнением кода, чтобы убедиться, что вы начинаете с нуля?
Я удаляю каталог вручную, я удаляю папку вручную.
Так вы можете видеть имена файлов на сервере? Названы ли они так же, как исходные файлы с вашего компьютера? Можешь выложить имена?
Какой сервер? Я тестирую свою программу на своем компьютере, у меня есть изображения с определенным именем на моем компьютере, и я пытаюсь загрузить их с помощью селена.
«Загрузить» обычно означает, что вы отправляете файл со своего компьютера на сервер веб-сайта. Вы не делаете этого? Сервер веб-сайта также размещен на вашем локальном компьютере?
Пожалуйста, проверьте мой ответ Джон
Решено!
Как кажется, когда мы отправляем ключи элементу ввода в цикле, на каждой итерации предыдущий ввод не очищается. Так, например, если в первом цикле ключи отправки отправляли image1.jpg, в следующем цикле он отправлял image1, image1.jpg, image2.jpg, а в следующем цикле он отправлял image1, image1.jpg, image1.jpg image2.jpg image2.jpg, image3.jpg и т.д....
Фикс был такой:
element = driver.find_element(By.CSS_SELECTOR, ".upload-images")
folder_path = i['full_folder_path']
file_extension = ".jpg"
# get a list of all file names in the folder with the specified extension
file_names = [f for f in os.listdir(folder_path) if f.endswith(file_extension)]
# generate the string for each file path
file_paths = []
for k, file_name in enumerate(file_names):
file_path = os.path.join(folder_path, file_name)
file_index = k + 1
file_paths.append(f"{file_path[:-4]}{file_extension}")
result = "\n".join(file_paths)
element.send_keys(result)
Возможно, дополнительные изображения на самом деле поступают из какой-то другой части программы, которую вы нам не показали?