NoSuchElementException: сообщение: нет такого элемента: невозможно найти элемент при попытке найти или получить доступ к тегам элемента

Я не могу найти поля имя пользователя и пароль. Я проверяю элементы и пытаюсь найти его с помощью селектора id, xpath или css, но это дает мне ошибку NoSuchElementException: Сообщение: нет такого элемента: Невозможно найти элемент.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.action_chains import ActionChains
import time 



if __name__ == "__main__":
    option = webdriver.ChromeOptions()
    option.add_argument("--incognito")
    option.add_argument("--start-maximized")

    if getattr(sys, 'frozen', False):
        chromedriver_path = os.path.join(sys._MEIPASS, "chromedriver.exe")
        driver = webdriver.Chrome(chromedriver_path, options=option)
    else:
        driver = webdriver.Chrome(options=option)

    driver.get("https://www.wix.com/")
    loginPage = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/header/nav/a[2]"))).click()

    usernameField = driver.find_element_by_id("input_4")
    passwordField = driver.find_element_by_xpath("input_5")

    usernameField.send_keys("user")
    passwordField.send_keys("pass")
    time.sleep(5)
    driver.quit()

Я получаю следующее сообщение об ошибке:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"input_4"}
  (Session info: chrome=71.0.3578.98)
  (Driver info: chromedriver=2.44.609538 (b655c5a60b0b544917107a59d4153d4bf78e1b90),platform=Windows NT 10.0.17134 x86_64)

person paul    schedule 21.01.2019    source источник
comment
Я не вижу input_4 на этой странице, я вижу только input_1 и input_2. Кроме того, в find_element_by_xpath("input_5") это недопустимый XPath.   -  person SiKing    schedule 21.01.2019
comment
Для меня это выглядит как input_0 и input_1   -  person Andersson    schedule 21.01.2019


Ответы (2)


Если вы хотите найти поля email и password, вы можете попробовать

usernameField = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "email")))
passwordField = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "password")))
usernameField.send_keys("user")
passwordField.send_keys("pass")

Причина, по которой вы не можете найти поля:

  • driver.find_element_by_id("input_4") - я не вижу элементов с id="input_4". @id значение может быть динамическим.
  • driver.find_element_by_xpath("input_5") - "input_5" недопустимый синтаксис XPath. Возможно, вам придется использовать //*[@id="input_5"], но в любом случае я также не вижу элементов с _10 _...
person Andersson    schedule 21.01.2019
comment
Спасибо! оно работает. Для меня он появился как input_4, поэтому я использовал его. И xpath, который я использовал // * [@ id = input_5] Я просто забыл поменять его на id при публикации. Но я также хочу спросить, а зачем мне ждать? Какова причина? - person paul; 22.01.2019
comment
@paul, потому что эти поля ввода отсутствуют в источнике страницы, поэтому вам нужно подождать, пока они не появятся в DOM - person Andersson; 22.01.2019

Элементы, например поля имя пользователя и пароль, являются элементами Angular и становится видимым, включенным и интерактивным после вызова click() в элементе с текстом как Войти и JavaScript / AjaxCalls завершены. Таким образом, вы должны вызвать WebDriverWait, чтобы нужный элемент стал интерактивным, и вы можете использовать следующее решение:

  • Минимальный блок кода:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    
    
    options = webdriver.ChromeOptions()
    options.add_argument("start-maximized")
    options.add_argument("--disable-extensions")
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.wix.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Sign In"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='email']"))).send_keys("paul")
    driver.find_element_by_css_selector("input[name='password']").send_keys("paul")
    
  • Снимок браузера:

wix_login

Примечание. Соответствующее подробное обсуждение можно найти в Selenium« selenium.common.exceptions.NoSuchElementException »при использовании Chrome

person DebanjanB    schedule 22.01.2019