Python Selenium NoSuchElementException,尽管元素在那里

Python Selenium NoSuchElementException although the element is there

提问人:Elias Petrat 提问时间:8/11/2023 最后编辑:Elias Petrat 更新时间:8/11/2023 访问量:48

问:

我试图建立一个网络爬虫,但我到了尝试选择一个 select-element() 的地步,但 Selenium 找不到该对象并抛出异常。

我使用了具有正确 XPATH 的find_element(100% 确定),但它不起作用。我试图通过它的名字找到它,但我认为 XPATH 是唯一适合我的东西。

完整的代码。问题是最后的选择

import data
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get(data.login_site)

username_input = driver.find_element(By.NAME, "_username")
username_input.send_keys(username)
password_input = driver.find_element(By.NAME, "_password")
password_input.send_keys(password)

login_button = driver.find_element(By.XPATH, "//button[@class='btn btn-primary']")
login_button.click()

plaene_button = driver.find_element(By.XPATH, "//a[@href='/iserv/plan/overview']")
plaene_button.click()

plaene_show = driver.find_element(By.XPATH, "//a[@href='/iserv/plan/show/Plan%20Schueler']")
plaene_show.click()

time.sleep(4)
drpdClass = Select(driver.find_element(By.XPATH, "/html/body/table/tbody/tr/td/form/table/tbody/tr/td[3]/span/nobr/select"))

time.sleep(10)

网站图片

python selenium-webdriver nosuchelementexception findelement

评论

0赞 Malcolm 8/11/2023
请将代码以文本形式放入问题中。
0赞 Saeed 8/11/2023
尝试类名。包括您的代码和网站链接
0赞 Elias Petrat 8/11/2023
它没有 classname 属性,而且该网站是我学校的私人网站,所以我恐怕无法提供它

答:

0赞 hamed danesh 8/11/2023 #1

也许元素会在您抓取页面后呈现。你有没有试过延迟你的抓取过程,看看它是否有效?

评论

0赞 Elias Petrat 8/11/2023
我延迟了 4 秒,还尝试了 10 秒,元素肯定加载了,但它不起作用
0赞 hamed danesh 8/11/2023
我相信你的 xpath 出了点问题,试着从 html 中逐个获取元素以选择它停止的位置。我认为你需要在你的xpath中有一堆索引(如td[0],.etc)
0赞 Elias Petrat 8/11/2023
我现在看到一个 iframe。我切换到它并尝试选择元素,但它不起作用
0赞 undetected Selenium 8/11/2023 #2

给定 html:

html

要识别 select 元素,您需要诱导 WebDriverWaitelement_to_be_clickable(),并且可以使用以下任一定位器策略

  • 使用CSS_SELECTOR

    drpdClass = Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.selectbox[name='element'][onchange^='doDisplayTimetable']"))))
    
  • 使用 XPATH

    drpdClass = Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@class='selectbox' and @name='element'][starts-with(@onchange, 'doDisplayTimetable')]"))))
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import Select