提问人:Elias Petrat 提问时间:8/11/2023 最后编辑:Elias Petrat 更新时间:8/11/2023 访问量:48
Python Selenium NoSuchElementException,尽管元素在那里
Python Selenium NoSuchElementException although the element is there
问:
我试图建立一个网络爬虫,但我到了尝试选择一个 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)
答:
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:
要识别 select 元素,您需要诱导 WebDriverWait 的 element_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
评论