Добрый день.
Использую 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)
На сайте используется 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 не выводятся - хотя должны были бы.
А т.е. дело было не в кликах. А этот reader разве будет сбрасываться в ноль на новом шаге цикла? Не будет так, что вы все строки вывели на 0 шаге и ушли в конец. И выводить больше нечего?
Если reader = csv.DictReader(openfile) поместить внутрь первого цикла будет тоже самое или начнёт выводить строки?