Python中的Selenium:“NoSuchElementException: Message: no such element: Unable to locate element”

7

我尝试在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: Message: no such element: Unable to locate element: {"method":"id","selector":"id"}

5个回答

10
'没有这样的元素'异常通常发生在Web驱动程序无法看到您要执行操作的元素时。
原因可能是:
1. 您的ID、名称、XPath或CssSelector可能不正确。 2. 您的元素可能位于iframe中,因此Web驱动程序无法看到或检测到它。请参阅Selenium和Python中的iframe切换。 3. 您的元素需要一些时间才能出现在UI上,因此您可以使用显式等待来解决此问题。请参阅5. 等待

3

用户名密码字段位于一个框架内,因此您需要:

  • Induce WebDriverWait for the desired frame to be available and switch to it.
  • Induce WebDriverWait for the desired element to be clickable.
  • You can use the following solution:

    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")
    
  • Browser Snapshot:

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')

在这里,我期望你的定位器是正确的。


文件“<ipython-input-7-29d0ea4b437a>”,第14行 pwdElement.send_keys('cdef') 语法错误:无效的语法 pwdElement.send... - JAE_RYONG
它是否通过了第一个块,即添加用户名? - Chintamani Manjare
@youngyoung 可能是复制粘贴引用代码时出了问题。请尝试手动添加引用。 - Chintamani Manjare

1

这段代码在一个框架中,您需要先切换到该框架。尽可能使用id,因为它们更快。

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接