selenium NoSuchElementException при попытке заполнить имя пользователя - PullRequest
0 голосов
/ 06 мая 2020

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

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException
from pathlib import Path
import selenium.webdriver.support.ui as ui

download_path = Path("mypath")

options = Options()
options.add_experimental_option("prefs", {
    "download.default_directory": str(download_path),
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "safebrowsing.enabled": True
})
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\chromedriver.exe",options=options)
wait = ui.WebDriverWait(driver, 10)
def schwabLogin():
    driver.get("https://www.schwab.com/public/schwab/client_home")
    login = driver.find_element_by_name("LoginId")
    login.clear()
    login.send_keys("fakeuser")
    login.submit()
    wait.until(lambda driver: driver.find_element_by_id('login-passwd'))
    pwd = driver.find_element_by_name("Password")
    pwd.send_keys("fakepass")
    driver.find_element_by_id("LoginText").click()

schwabLogin()

это ошибка, которую я получаю:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="LoginId"]"}

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

На странице присутствует iframe, поэтому вам нужно сначала переключиться на этот iframe, а затем работать с элементами.
Вы можете сделать это так:

def schwabLogin():
    driver.get("https://www.schwab.com/public/schwab/client_home")

    #Switch to iframe here
    driver.switch_to.frame(driver.find_element_by_id('lms-home'))


    login = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "LoginId")))
    login.click()
    login.send_keys("fakeuser")
    pwd = driver.find_element_by_name("Password")
    pwd.click()
    pwd.send_keys("fakepass")
    driver.find_element_by_id("LoginText").click()

Вам нужно добавьте следующий импорт:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
1 голос
/ 06 мая 2020

Я проверил https://www.schwab.com/public/schwab/client_home, и кажется, что поле ввода идентификатора входа не загружается сразу в дерево DOM, когда браузер загружает страницу.

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

Не могли бы вы подождать, прежде чем искать элемент:

driver.get ("https://www.schwab.com/public/schwab/client_home") DRIVER WAIT login = driver .find_element_by_name ("LoginId")

Selenium wait: https://selenium-python.readthedocs.io/waits.html

Надеюсь, это решит вашу проблему :)

...