Ошибка селена при попытке загрузить несколько картинок

Я работаю над собственным проектом, в который хочу загрузить несколько изображений с помощью 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)

и Никогда ничего не загружал!

Возможно, дополнительные изображения на самом деле поступают из какой-то другой части программы, которую вы нам не показали?

John Gordon 01.04.2023 20:09

Моя программа никак не взаимодействует с этим вводом, можно ли его еще загрузить? у меня есть код, в котором сохраняются изображения, но на самом деле нажатие на этот ввод только здесь, какой код я пишу здесь

Nika Chelidze 01.04.2023 20:20

Каковы двенадцать фактических имен файлов, которые были загружены?

John Gordon 01.04.2023 20:23

Может быть, вы просто запустили этот код дважды, поэтому каждое из шести изображений загружалось дважды?

John Gordon 01.04.2023 20:24

Как это возможно, что я запускал этот код дважды?

Nika Chelidze 01.04.2023 20:25

Я не знаю вашего рабочего процесса разработки/тестирования, поэтому не могу ответить на этот вопрос...

John Gordon 01.04.2023 20:28

Я загружаю его только один раз

Nika Chelidze 01.04.2023 20:29

Значит, вы запускали этот код только один раз?

John Gordon 01.04.2023 20:33

Пожалуйста, проверьте мое редактирование. Нет, я запускаю этот код несколько раз, но этот фрагмент кода используется только один раз, я имею в виду, что я никогда не нажимаю ввод нигде, кроме как здесь.

Nika Chelidze 01.04.2023 20:39

Второй пример, очевидно, не сработает — если вы сначала вызовете .add(), то, конечно, if file_name in uploaded_files будет истинным.

John Gordon 01.04.2023 20:43

Да, я знаю, что это не сработает, но дублированные файлы все еще загружаются, когда это после кода. Так почему? Если оно истинно, когда написано сначала, то почему оно ложно, когда написано и в конце?

Nika Chelidze 01.04.2023 20:45

Как я упоминал ранее, одним из объяснений может быть то, что этот участок кода (каким-то образом) выполняется дважды. Вы не показали нам окружающий код, поэтому мы не знаем, возможно это или нет.

John Gordon 01.04.2023 20:48

Кроме того, какова ваша процедура тестирования? Есть ли у вас способ удалить все загруженные файлы с сервера перед выполнением кода, чтобы убедиться, что вы начинаете с нуля?

John Gordon 01.04.2023 20:48

Я удаляю каталог вручную, я удаляю папку вручную.

Nika Chelidze 01.04.2023 20:51

Так вы можете видеть имена файлов на сервере? Названы ли они так же, как исходные файлы с вашего компьютера? Можешь выложить имена?

John Gordon 01.04.2023 20:55

Какой сервер? Я тестирую свою программу на своем компьютере, у меня есть изображения с определенным именем на моем компьютере, и я пытаюсь загрузить их с помощью селена.

Nika Chelidze 02.04.2023 11:17

«Загрузить» обычно означает, что вы отправляете файл со своего компьютера на сервер веб-сайта. Вы не делаете этого? Сервер веб-сайта также размещен на вашем локальном компьютере?

John Gordon 02.04.2023 17:58

Пожалуйста, проверьте мой ответ Джон

Nika Chelidze 03.04.2023 02:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
18
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решено!

Как кажется, когда мы отправляем ключи элементу ввода в цикле, на каждой итерации предыдущий ввод не очищается. Так, например, если в первом цикле ключи отправки отправляли 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)

Другие вопросы по теме