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

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

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)

А разве можно так? По сути клик может увести на другую страницу, где нет этих элементов. Поэтому циклы тут не особо помогут.

2 лайка

На сайте используется AJAX. Внешним циклом я прохожусь по всем найденным элементам (изображениям-их до 100 шт ) и после клика по изображению генерируется html однотипный код с возможностью выбора определенных элементов (атрибутов изображения из списка), а выбор этих самых элементов должен быть реализован в дальнейшем с использованием данных с csv файла. В встроенном цикле планирую с помощью условия перебирать значения рядов csv словаря созданного из csv файла и сравнивать их с значением получаемым с сайта и если условие True, тогда выбирается соответствующий элемент - но это пока реализовать не получается пока не реализована возможность полноценного запуска внутреннего цикла после каждого прохода внешнего.

Клик на другую страницу не уводит, а как раз генерирует нужный код для работы с ним

Я думаю, что формат форума не совсем то место, где нужно получать базовые знания по web’у. Просто поверьте, что если URL один и тот же, то это не значит что и страница таже самая. Собственно вся концепция SPA зиждиться на этом принципе. При этом DOM у страниц может быть сильно разный, при одном и том же адресе. Есть прекрасный доклад от Алексея Баранцева про “заморочки Selenium” в частности часть №7 Staleness в которой это поведение описывается и это не баг, а фича Selenium’а, которую можно “пофиксить” и как это делается там тоже есть информация в докладе:

Это рабочий, упрощенный код:

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)

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

содержимое csv файла любое

А т.е. дело было не в кликах. А этот reader разве будет сбрасываться в ноль на новом шаге цикла? Не будет так, что вы все строки вывели на 0 шаге и ушли в конец. И выводить больше нечего?

Если reader = csv.DictReader(openfile) поместить внутрь первого цикла будет тоже самое или начнёт выводить строки?

Будет тоже самое .
Чтобы работало надо в цикл помещать еще и
filepath=filedialog.askopenfilename()