Python3使用Selenium定位网站按钮报NoSuchElementException问题求助
问题原因
find_element_by_class_name方法仅支持传入单个类名,你传入了4个用空格分隔的类名,Selenium会将整段字符串识别为单个类名进行匹配,自然无法找到元素。从报错信息中自动生成的CSS选择器.send-button jm-button ng-binding ng-scope也能看出,系统将这段内容识别为了非法的后代选择器,完全不符合匹配逻辑。- 你复制类名时因为HTML换行导致多输入了空格,把
ng-scope错写成了ng- scope,进一步导致匹配失败。 - 该站点使用Angular框架开发,元素是动态渲染的,页面加载完成后可能存在元素渲染延迟,直接查找也可能触发找不到元素的报错。
解决方案
方法1:使用CSS选择器匹配多个类名
将多个类名用.连接,作为CSS选择器的参数,同时修正类名的空格错误:
# 替换原代码中查找按钮的行 input_fname = driver.find_element_by_css_selector(".send-button.jm-button.ng-binding.ng-scope") # 执行点击 input_fname.click()
方法2:使用Xpath匹配(结合按钮文本更精准)
直接匹配按钮的希伯来语文本,避免类名变动导致的匹配失败:
input_fname = driver.find_element_by_xpath('//button[normalize-space(text())="המשך"]') input_fname.click()
方法3:添加显式等待(推荐,稳定性最高)
先导入等待相关的依赖,设置最长等待时间,直到元素可点击后再执行操作,避免动态渲染导致的匹配失败:
# 导入依赖,放在代码开头 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 替换原查找按钮的代码 wait = WebDriverWait(driver, 10) input_fname = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[normalize-space(text())="המשך"]'))) input_fname.click()
补充说明:如果你使用的是Selenium 4.0及以上版本,旧的
find_element_by_*方法已被废弃,推荐统一使用find_element方法指定查找方式,例如:# CSS选择器写法 input_fname = driver.find_element(By.CSS_SELECTOR, ".send-button.jm-button.ng-binding.ng-scope")
内容的提问来源于stack exchange,提问作者newGIS
相关产品推荐
相关产品推荐

