Прошу помощи, с модулем time (если раскомментировать строчку time.sleep(5)) код работает хорошо, везде кликает и завершается без ошибки. Как только не использовать модуль time так работает через раз, а именно стабильно валится либо на выборе города либо на третьем выпадающем списке, в сообщении об ошибке пишет следующее
Message: element click intercepted: Element <li tabindex="-1" role="option" unselectable="on" class="k-item" aria-selected="false" data-offset-index="2">...</li> is not clickable at point (482, 465). Other element would receive the click: <li tabindex="-1" role="option" unselectable="on" class="k-item" aria-selected="false" data-offset-index="0">...</li>
Кликаю именно на сами фразы (location, visa type, sub type) для активации выпадающего списка, и после ищу есть ли требуемый город/тип итд на странице, т.к есть на странице фейковые формы которые тоже содержат такие же значения. Из-за фейковых форм и не использовал select.
Пробовал вводить ожидания что элемент есть на странице и изображен и кликабелен - не помогает:
WebDriverWait(driver, 5, poll_frequency=2).until(EC.any_of(EC.visibility_of_any_elements_located((By.XPATH, '//*[text()="Moscow"]')),EC.element_to_be_clickable((By.XPATH, '//*[text()="Moscow"]'))))
WebDriverWait(driver, 5, poll_frequency=2).until(EC.all_of(EC.visibility_of_any_elements_located((By.XPATH, '//*[text()="Schengen Visa"]')), EC.presence_of_all_elements_located((By.XPATH, '//*[text()="Schengen Visa"]'))))
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"]')))
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"]')))
Стабильно крашится через раз в цикле: for element in driver.find_elements('xpath', '//label[@class and text()="Visa Sub Type"]'):
Подскажите пожалуйста где ошибка?
Тк с time все элементы подгрузились то не падает код, а без него похоже элементы продолжают грузиться и не все успевают подгрузиться, поэтому и падает скорее всего. Может какое-то ожидание еще добавить?
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
import time
url = "C:\\Users\\User\\Downloads\\dropdown_example.html"
def get_chromedriver(use_proxy=False, user_agent=None):
chrome_options = webdriver.ChromeOptions()
prefs = {"detach": True,"excludeSwitches": ["enable-automation"],'useAutomationExtension': False, "credentials_enable_service": False, "profile.password_manager_enabled": False}
chrome_options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(options=chrome_options)
driver.implicitly_wait(10)
return driver
def main():
try:
driver = get_chromedriver(use_proxy=False, user_agent='Mozilla/5.0 (Wayland like X11; Debian; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6635.179 Safari/537.36')
driver.get(url)
wait = WebDriverWait(driver, 10)
book_app(driver,wait)
driver.quit()
except Exception as e:
print(e)
def book_app(driver, wait):
url_book=driver.current_url
driver.get(url_book)
# time.sleep(5)
# Ищем элементы с данным xpath, тк на странице существуют точно такие же фейковые формы
elements = driver.find_elements('xpath', '//span[@class and @aria-selected="true"]')
for element in elements:
#Проверяем есть ли данная форма на страничке
if element.is_displayed():
#Активация списка городов по щелчку
# dropdown = Select(driver.find_element('xpath', '//*[@id="q5b9736e-4bb8-4468-afe5-48863c3d8e92"]'))
# dropdown.click()
# dropdown.select_by_visible_text('Moscow')
element.click()
#После появления выпадающего списка в страницу подгружается список городов
print('Активировали Location')
WebDriverWait(driver, 5, poll_frequency=2).until(EC.any_of(EC.visibility_of_any_elements_located((By.XPATH, '//*[text()="Moscow"]')),EC.element_to_be_clickable((By.XPATH, '//*[text()="Moscow"]'))))
for i in driver.find_elements('xpath', '//*[text()="Moscow"]'):
if i.is_displayed():
i.click()
print('Нажали на нужный город')
break
# Попробовать Select метод для выпадающего списка, но не работает
# driver.find_elements('xpath', '//*[text()="Moscow"]').click()
# select = Select(WebDriverWait(driver,5, poll_frequency=2).until(EC.element_to_be_clickable((By.XPATH,'//*[text()="Moscow"]'))))
# select.select_by_visible_text('Moscow')
break
for element in driver.find_elements('xpath', '//label[@class and text()="Visa Type"]'):
if element.is_displayed():
element.click()
# time.sleep(2)
WebDriverWait(driver, 5, poll_frequency=2).until(EC.all_of(EC.visibility_of_any_elements_located((By.XPATH, '//*[text()="Schengen Visa"]')), EC.presence_of_all_elements_located((By.XPATH, '//*[text()="Schengen Visa"]'))))
for i in driver.find_elements('xpath', '//*[text()="Schengen Visa"]'):
if i.is_displayed():
i.click()
print('Нажали на Visa Type')
break
break
for element in driver.find_elements('xpath', '//label[@class and text()="Visa Sub Type"]'):
if element.is_displayed():
element.click()
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"]')))
for i in driver.find_elements('xpath', '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"]'):
if i.is_displayed():
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"]')))
i.click()
print('Нажали на Sub Type')
break
break
for element in driver.find_elements('xpath', '//label[@class and text()="Category"]'):
if element.is_displayed():
element.click()
WebDriverWait(driver, 5, poll_frequency=2).until(EC.all_of(EC.visibility_of_any_elements_located((By.XPATH, '//*[text()="Normal"]')), EC.element_to_be_clickable((By.XPATH, '//*[text()="Normal"]'))))
for i in driver.find_elements('xpath', '//*[text()="Normal"]'):
if i.is_displayed():
i.click()
print('Нажали на Category')
break
break
return
if __name__ == '__main__':
main()