Цикл в цикле на Python с использованием Selenium срабатывает только один раз.

azazello

Новичок
Пользователь
Фев 12, 2023
7
0
1
Добрый день.
Использую Windows10, Python3.10
Имееться программа на Python с использованием Selenium которая должна заходить на сайт, найти нужные элементы и после клика по каждому элементу запускать цикл.
Пытаюсь реализовать с помощью двух циклов, но встроенный цикл с CSV словарем срабатывает только один раз.
Подскажите пожалуйста в чем может быть проблема?



Python:
import time
from tkinter import filedialog
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import os
import csv


filepath=filedialog.askopenfilename()
openfile=open(filepath)
reader = csv.DictReader(openfile)


driver = webdriver.Firefox()
# Сайт на который заходим (сайт с авторизацией - в свободый доступ не могу дать):
driver.get('https://####')
wait=WebDriverWait(driver, 30)


## Нахождение всех элементов на сайте (значение XPATH скрыто):
imagePreviews=driver.find_elements(By.XPATH, "#####")


# Цикл для клика по каждому элементу и для каждого элемента необходимо выполнить другой цикл. В дальнейшем с помощью условия планируеться с CSV словаря получить нужную строку перебрав все строки,
# но сейчас вижу, что внутренний цикл срабатывает только один раз, а надо чтобы при каждом клике цикл срабатывал полностью
for i in imagePreviews:
        wait.until(EC.presence_of_element_located((By.XPATH, "#####")))
        i.click()
        for row in reader:
                print(row)
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
возможно после i.click() меняется код страницы, и поэтому элементы imagePreviews становятся недоступны.
 

azazello

Новичок
Пользователь
Фев 12, 2023
7
0
1
возможно после i.click() меняется код страницы, и поэтому элементы imagePreviews становятся недоступны.
У меня ошибки (исключения) нету. Все нужные элементы находятся на странице в нужное время. Проблема в том что внутренний цикл с использованием csv словаря срабатывает только в первой итерации внешнего цикла, а потом не выполняется без ошибок, программа работает дальше.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 650
472
83
У меня ошибки (исключения) нету. Все нужные элементы находятся на странице в нужное время. Проблема в том что внутренний цикл с использованием csv словаря срабатывает только в первой итерации внешнего цикла, а потом не выполняется без ошибок, программа работает дальше.
в дебагере посмотрите, что идет не так
 

azazello

Новичок
Пользователь
Фев 12, 2023
7
0
1
Извиняюсь некорректно написал : " а потом не выполняется без ошибок"
а надо :
выполняется без ошибок.
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
ну если ошибок нет, то можно предположить, что imagePreviews состоит из одного элемента.
 

azazello

Новичок
Пользователь
Фев 12, 2023
7
0
1
ну если ошибок нет, то можно предположить, что imagePreviews состоит из одного элемента.
точно состоит не из одного элемента так как при запуске программы кликает по всем изображениям что есть на сайте (тоесть цикл внешний работает). Придумал костыль который решает проблему это когда я во внешний цикл помещаю открытие csv файла и создание словаря- то-есть при каждой итерации внешнего цикла открывается файл и создается словарь ---- но как на меня это еще тот КОСТЫЛЬ.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 650
472
83
точно состоит не из одного элемента так как при запуске программы кликает по всем изображениям что есть на сайте (тоесть цикл внешний работает). Придумал костыль который решает проблему это когда я во внешний цикл помещаю открытие csv файла и создание словаря- то-есть при каждой итерации внешнего цикла открывается файл и создается словарь ---- но как на меня это еще тот КОСТЫЛЬ.
применить дебагер вы вообще не рассматриваете?
 

azazello

Новичок
Пользователь
Фев 12, 2023
7
0
1
я пользуюсь отладкой, но понять в чем причина не могу
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 650
472
83
я пользуюсь отладкой, но понять в чем причина не могу
ну ваш код не воспроизводим, а гадать бесполезно...

возможно проблема в reader = csv.DictReader(openfile), попробуйте просто reader
 
Последнее редактирование:
  • Мне нравится
Реакции: azazello

azazello

Новичок
Пользователь
Фев 12, 2023
7
0
1
Это рабочий, упрощенный код:
Python:
import time
from tkinter import filedialog
import os
import csv


filepath=filedialog.askopenfilename()
openfile=open(filepath)
reader = csv.DictReader(openfile)


for i in range(10):
    print(i)
    for row in reader:
        print(row)

прикрепил также csv файл с которого берутся данные.
после 0 выводятся в консоль строки с словаря, а после 1,2,3,4,5,6,7,8,9 не выводятся - хотя должны были бы.
 

Вложения

  • test.zip
    896 байт · Просмотры: 2

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
дело в объекте reader, как правильно заметил камрад regnor. в первой итерации этот объект был прочитан до конца и курсор остался в конце документа. если после цикла чтения поместить openfile.seek(0), то всё будет работать как положено.
 
  • Мне нравится
Реакции: azazello

azazello

Новичок
Пользователь
Фев 12, 2023
7
0
1
дело в объекте reader, как правильно заметил камрад regnor. в первой итерации этот объект был прочитан до конца и курсор остался в конце документа. если после цикла чтения поместить openfile.seek(0), то всё будет работать как положено.
Спасибо . То что надо.
 

Форум IT Специалистов