Python 中的 Selenium:“NoSuchElementException:消息:没有这样的元素:无法找到元素”

问题描述 投票:0回答:5

我尝试在第一个 id 块中输入“abc”,在第二个密码块中输入“cdef”。

但是,底部的错误代码出现了。

from selenium import webdriver
driver.get('http://sugang.korea.ac.kr')

我添加了隐式等待,以防止代码在页面完全加载之前执行。

driver.implicitly_wait(30)

添加用户名和密码的代码如下:

driver.find_element_by_name('id').send_keys('abc')
driver.find_element_by_name('pw').send_keys('cdef')

但是我收到以下错误:

NoSuchElementException:消息:没有这样的元素:无法定位元素:{“method”:“id”,“selector”:“id”}

python selenium selenium-webdriver frame webdriverwait
5个回答
11
投票

当 Web 驱动程序看不到您尝试执行操作的元素时,通常会出现“没有此类元素”异常。

原因可能是:

  1. 您的 ID 或名称或 XPath 或 CssSelector 可能是错误的。

  2. 您的元素可能位于 iframe 内,因此 Web 驱动程序无法看到或检测到它。 通过Selenium和python切换到iframe

  3. 您的元素可能位于影子根内部。 (参见这个问题

  4. 您的元素需要一段时间才能出现在 UI 上,因此您可以使用显式等待来解决此问题。参见5。等待


3
投票

用户名密码字段位于

frame
内,因此您必须:

  • 诱导 WebDriverWait 以使所需的 框架可用并切换到它
  • 诱导 WebDriverWait 使所需的元素可点击
  • 您可以使用以下解决方案:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Firefox(executable_path=r'C:\\Utility\\BrowserDrivers\\geckodriver.exe')
    driver.get("http://sugang.korea.ac.kr")
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"firstF")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.input_login[name='id']"))).send_keys('abc')
    driver.find_element_by_css_selector("input.input_login[name='pw']").send_keys("cdef")
    
  • 浏览器快照:

sugang_korea_ac_kr


1
投票

添加显式等待

from selenium.webdriver.support import expected_conditions as EC

userNameElement= WebDriverWait(driver, 2).until(
EC.presence_of_element_located((By.NAME, "id"))
userNameElement.send_keys('abc')

pwdElement= WebDriverWait(driver, 2).until(
EC.presence_of_element_located((By.NAME, "pwd"))
pwdElement.send_keys('cdef')

在这里,我希望您的定位器是正确的。


1
投票

它位于您需要先切换到的框架中。另外,尽可能使用 ids,因为它们更快。

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

url ="http://sugang.korea.ac.kr"
driver = webdriver.Chrome()
driver.get(url)
WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.CSS_SELECTOR,'[name=firstF]')))
driver.switch_to.frame(driver.find_element_by_css_selector('[name=firstF]'))
WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.ID,'id'))).send_keys('abc')
driver.find_element_by_id('pw').send_keys('def')
driver.find_element_by_id('loginButton').click()

0
投票

您尝试访问的站点没有带有标签名称 id 的元素。仔细检查该网站。

<input name="id">

如果输入有id值,试试这个;

driver.find_element_by_id("id")

使用示例:

HTML:

<div class="form-group">
    <input class="form-control" name="username">
</div>
<div class="form-group">
    <input class="form-control" name="password" type="password">
</div>
<button id="btn-login"  type="submit">Enter</button>

Python:

username = driver.find_element_by_name("username")
password = driver.find_element_by_name("password")

username.send_keys("your_username")
password.send_keys("your_password")

driver.find_element_by_id("btn-login").click()
© www.soinside.com 2019 - 2024. All rights reserved.