Селен: Элемент не активен в данный момент (питон)

В настоящее время я работаю над проектом, который заполняет форму автоматически. И следующая кнопка появляется при заполнении формы, поэтому выдает ошибку.

ПЫТАЛСЯ:

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"//input[@type='button' and @class='button']")))
Next = driver.find_element_by_xpath("//input[@type='button' and @class='button']")
Next.click()

HTTP:

<span class="btn">
    <input type="button" value="Next" class="button" payoneer="Button" data-controltovalidate="PersonalDetails" data-onfieldsvalidation="ToggleNextButton" data-onclick="UpdateServerWithCurrentSection();" id="PersonalDetailsButton">
     </input>
     <div class="clearfix"></div>
</span>

ОШИБКА:

selenium.common.exceptions.ElementClickInterceptedException: Сообщение: щелчок элемента перехвачен: Элемент недоступен для щелчка в точке (203, 530). Другой элемент получит щелчок: ... (Информация о сеансе: chrome=76.0.3809.132)

11 ответов

Если путь xpath правильный, возможно, вы можете попробовать этот метод для решения этой проблемы. Замените старый код следующим кодом:

button = driver.find_element_by_xpath("xpath"]")
driver.execute_script("arguments[0].click();", button)

Я и раньше решал эту проблему, но, честно говоря, не знаю причины.

Это сообщение об ошибке...

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (203, 530). Other element would receive the click: ... (Session info: chrome=76.0.3809.132)

... означает, что click() на желаемый элемент был перехвачен каким-то другим элементом, и нужный элемент не был доступен для клика.


Вам необходимо учесть следующие моменты:

  • При использовании Selenium для автоматизации с помощьюtime.sleep(secs) без каких-либо конкретных условий для достижения поражений цели автоматизации, и этого следует избегать любой ценой. Согласно документации:

time.sleep(secs) приостанавливает выполнение текущего потока на заданное количество секунд. Аргументом может быть число с плавающей запятой, чтобы указать более точное время сна. Фактическое время приостановки может быть меньше запрошенного, потому что любой пойманный сигнал завершит sleep() после выполнения процедуры перехвата этого сигнала. Кроме того, время приостановки может быть больше, чем запрошено произвольной величиной из-за планирования других действий в системе.


Решение

Для того, чтобы нажать на кнопку с значением, как Далее вы можете использовать любой из следующих стратегий локатора:

  • С помощью CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.button#PersonalDetailsButton[data-controltovalidate='PersonalDetails']"))).click()
    
  • С помощью XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='button' and @id='PersonalDetailsButton'][@data-controltovalidate='PersonalDetails']"))).click()
    
  • Примечание. Вам необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Я столкнулся с аналогичными проблемами, .click() всегда возвращает исключение Not clickable. в

      driver.execute_script('arguments[0].click()', button)

творит чудеса. Вы также можете использовать его для выполнения любого другого js-скрипта таким образом

      script = 'your JavaScript goes here'
element = driver.find_element_by_*('your element identifier goes here')
driver.execute_script(script, element)

Я посмотрел на элемент, который его вызвал, и это был баннер о согласии / файлах cookie. Итак, сначала я убедился, что он нажал "ОК" на баннере согласия, а затем нажал другую кнопку, которая мне нужна. Надеюсь, это кому-то поможет.

"selenium.common.exceptions.ElementClickInterceptedException: Сообщение: щелчок по элементу перехвачен: элемент не кликабельный..."

Это исключение возникает, когда элемент не найден на веб-странице (когда искомый элемент находится в нижней части страницы, которая еще не загружена)

Таким образом, вы можете прокручивать страницу с помощью javascript и загружать полную страницу и

      from selenium.webdriver.common.by import By
from selenium import webdriver

url = "YOUR URL"
SCROLL_PAUSE_TIME = 0.5
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)

def scroll_page():
    i = 0
    while i < 5:
        # Scroll down to 500 pixel
        driver.execute_script("window.scrollBy(0, 500)", "")

        # Wait to load page
        time.sleep(SCROLL_PAUSE_TIME)

        # Will scroll only for 4 increments of 500px
        i += 1

Я столкнулся с аналогичной проблемой и заметил кое-что, что может помочь понять основную причину проблемы. В моем случае я смог щелкнуть элемент, находящийся в режиме просмотра веб-сайта на ПК, но не смог этого сделать в мобильном представлении (в котором мне нужно было запустить сценарий). Я обнаружил, что в мобильном представлении порядок элементов (li в моем случае) изменился, а в html-документе они остались прежними. Вот почему я не мог щелкнуть по нему, не прокрутив сначала до него. Это также может объяснить, почему это работает: -

driver.execute_script("arguments[0].click();", button)

У меня была такая же проблема. Но моя проблема была не с элементом. Кнопка была активирована с href. Я изменил код с

      <a class="services-button"  href="desired url">

К

      <a class="services-button"  onclick="location.href='{% url "desired url" %}'";">

У меня недостаточно комментариев для комментариев, но распространенной причиной этой ошибки может быть то, что Selenium находит элемент из DOM на экране и определяет координаты xy (300, 650), а затем нажимает на них, но если на экране между ними происходят некоторые изменения продолжительность клика, например реклама Google или какое-то всплывающее окно, тогда невозможно щелкнуть по нему, что приводит к этому исключению

Я просто догадываюсь, есть ли у кого-нибудь правильное объяснение, пожалуйста, поделитесь

Это решение сработало для меня:

      from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Firefox(executable_path="")
driver.get("https://UrlToOpen")   
action = ActionChains(driver)

firstLevelMenu = driver.find_element_by_id("menu")
firstLevelMenu.click()

источник: http://allselenium.info/mouse-over-actions-using-python-selenium-webdriver/

Похоже, есть некоторые другие элементы, которые имеют тот же xpath, попробуйте изменить xpath примерно так

Next = driver.find_element_by_xpath("//input[@id='PersonalDetailsButton']");
Next.Click();

или

Next = driver.find_element_by_xpath(//input[@value='Next' and @id='PersonalDetailsButton']);
Next.Click();

Попробуйте первый xpath, если это не сработает, перейдите ко второму. Если и это не сработает, попробуйте использовать сикули. Я почти уверен, что первый xpath будет работать

Вы можете попробовать:

      driver.execute_script("arguments[0].click();", button)

Это решение решило мои проблемы, когда я столкнулся с похожими проблемами.

Другие вопросы по тегам