Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Помогите реализовать прерывание цикла,через н-ное количество попыток?Установить счётчик в цикл

python
selenium
Теги: #<Tag:0x00007f7b656e9410> #<Tag:0x00007f7b656e92d0>

(Максим Рублёв) #1
    #Выбор города
    while True:
         try:
             search = self.driver.find_element_by_xpath("//*[@id='Vladivostok']")
         except Exception:
             time.sleep(1)
             self.driver.find_element_by_xpath("//*[@id='clickToCityField']").click()
         else:
             search.click()
             break

(Ray Romanov) #2
i = 0
while i < 10:
         i++
         try:
             search = self.driver.find_element_by_xpath("//*[@id='Vladivostok']")
         except Exception:
             time.sleep(1)
             self.driver.find_element_by_xpath("//*[@id='clickToCityField']").click()
         else:
             search.click()
             break

(Максим Рублёв) #3

Спасибо вам RayRom,я пробовал счётчик в try подставлять,цикл доходил до исключения и в нём и оставался постоянно кликать. Есть ещё вопрос не работал никогда с элементами с абсолютно идентичными элементами на форме,но находящимися на разных страницах, на первой странице отрабатывает скрипт,доходит до 2го такого случая и всё коллапс( например элемент //input[@id=‘Adress’]


(Ray Romanov) #4

Не знаю, у меня таких проблем не было.


(Дмитрий Мирошник) #5

А зачем эта страшная конструкция:

Не проще ли использовать waits?


(Максим Рублёв) #6

Дмитрий здравствуй,неявный ожидания дают эзепт element not clickable и выкидывает,только нажали на выпадающий список сразу кликает в поле с элементами списка,пока они ещё не подгрузились,с явными ожиданиями работать-плохой стиль пишут везде про это.Пожэтому и спользую эту страшную конструкцию.


(rmerkushin) #7

Явные ожидания вроде time.sleep(3) - зло. А WebDriverWait был специально придуман для таких случаев:

element = WebDriverWait(driver, 10).until(
	EC.element_to_be_clickable((By.ID, 'Vladivostok'))
)

Если не устраивает такой подход, поглядите как сделаны ожидания хотя бы в том же #webdriver:selenide


(Дмитрий Мирошник) #8

Так вот эта страшная конструкция и есть явное ожидание ))))))))
Почитай про implicit и explicit waits. Пример тебе @rmerkushin уже показал.


(Максим Рублёв) #9

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


(rmerkushin) #10

Там есть другие Expected Conditions, попробуйте их или их комбинации через AND


(Максим Рублёв) #11

Здравствуйте, не очень быстро отвечаю. Спасибо вам,что откликнулись) Попробовать использовать что-то типа
“element = wait.until(EC.element_to_be_clickable AND EC.presence_of_element_located ((By.ID, ‘someid’)))” ?


(rmerkushin) #12

Да, можно это. Можно на видимость добавить. Попробуйте комбинации.
З.Ы.: если список городов или что там у вас, грузится из бд, то нужно ожидание на ajax