Python Selenium не удается нажать кнопку «Сохранить» в форме

#python #selenium #selenium-webdriver

Вопрос:

Я использую Selenium Webdriver, чтобы установить флажок в форме и нажать «Сохранить» на той же странице. Флажок работает нормально, но не может нажать кнопку Сохранить. Я пробовал несколько решений без рабочего решения. Я добавляю режим сна, так как после нажатия кнопки сохранить вручную обработка занимает некоторое время.

Вот html-код для кнопки сохранить:

 <input class="cbi-button cbi-button-apply" type="submit" name="cbi.apply" value="Save">
 

Вот мой код с использованием xpath (попытка 1):

 driver.find_element_by_xpath("//input[@type='submit']").click()
time.sleep(20)
 

Результат попытки 1:

 ElementNotInteractableException: Message: element not interactable
 

Попытка 2 с использованием цепочек действий, как предлагается в другом ответе:

 button = driver.find_element_by_class_name(u"cbi-page-actions")
driver.implicitly_wait(10)
ActionChains(driver).move_to_element(button).click(button).perform()
time.sleep(20)
 

Во второй попытке ошибок не возникло, но при просмотре браузера кнопка сохранения, похоже, не была нажата. Я также проверил позже на странице, и изменения, которые я добавил, определенно не были сохранены.

Я также пытался использовать веб-формы, однако у меня есть противоположная проблема, когда я могу сохранить форму, но не могу установить флажок.

Ответ №1:

Попробуйте это

 element = driver.find_element_by_xpath("//input[@type='submit']")
driver.execute_script("arguments[0].click();", element)
 

Ответ №2:

Вам следует подождать, прежде чем, возможно, элемент был загружен неправильно, а не после запуска click

Решение 1: Прямой щелчок с наихудшим типом явного ожидания

 time.sleep(20)
driver.find_element_by_xpath("//input[@type='submit']").click()
 

Решение 2. Использование цепочки действий :

 button = driver.find_element_by_css_selector("input[value='Save']")
ActionChains(driver).move_to_element(button).click(button).perform()
 

Решение 3. Использование динамического явного ожидания:-

 wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.NAME, "cbi.apply"))).click()
 

Импорт :

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

Решение 4: Использование Js

 button = driver.find_element_by_name("cbi.apply")
driver.execute_script("arguments[0].click();", button)