Как объяснено здесь , вам нужно искусственно щелкнуть по элементу с помощью javascript, поскольку он создается самим javascript (селен не может «видеть» элемент). Другим примером подобной ситуации является мой ответ на этот вопрос . Корректировка вашего кода так работает (я тоже реализовал ожидание, но, вероятно, в этом нет необходимости):
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common import action_chains
import time
driver = webdriver.Chrome()
driver.get("https://www.eco-visio.net/v5/")
username_element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//form/div/input[@id='login-username']")))# driver.find_element_by_id("login-username")
driver.execute_script("arguments[0].click();", username_element)
time.sleep(1) # give the click a moment to register
action = action_chains.ActionChains(driver)
action.send_keys("midregcog.admin")
action.perform()
Это работает, чтобы заполнить поле на моей машине! Надеюсь, это поможет.
обновление
@ MarcelWilson указывает, что вам просто нужно дождаться загрузки страницы (не совсем уверен, почему, поскольку она есть, и с парой тестов я не уверен, почему она не работает только с явным ожиданием. Видимо первый ответ был слишком сложным, и вы можете достичь желаемого эффекта с помощью:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome()
driver.get("https://www.eco-visio.net/v5/")
username_element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//form/div/input[@id='login-username']")))# driver.find_element_by_id("login-username")
time.sleep(2) # give a longer wait than the explicit wait in the previous line
username_element.click()
username_element.send_keys("username")
password_element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//form/div/input[@id='login-password'][@type='password']")))# driver.find_element_by_id("login-username")
password_element.click()
password_element.send_keys("password")
Я думаю, это может быть потому, что в javascript, который генерирует страницу (а я не эксперт по javascript), есть такие строки, как if: loaded()
, что заставляет меня поверить, что явный WebDriverWait
получает элемент, но javascript все еще находится в процессе его загрузки. Таким образом, WebDriverWait
проверяет, что элемент существует, а time.sleep(2)
проверяет, что он также загружен, прежде чем пытаться взаимодействовать с ним, и в этот момент кажется, что вы можете взаимодействовать с ним как обычная страница без проблем. Я даже узнал кое-что новое для этого поста XD!