使用Python Selenium无法点击无ID的NerdWallet搜索按钮怎么办?
解决方案
问题分析
By.CLASS_NAME不支持同时传入多个类名,你传入的"_1_LcAp _2nYXVh _1J48pr"是三个类名,会导致元素定位失败。- 未等待元素完全加载并处于可交互状态,直接执行点击操作可能因元素未渲染完成而失败。
修正步骤
替换元素定位方式:使用
CSS_SELECTOR或XPATH定位多类名元素:- CSS_SELECTOR 格式:
.class1.class2.class3(类名前加.,无空格) - XPATH 格式:
//button[contains(@class, '_1_LcAp') and contains(@class, '_2nYXVh') and contains(@class, '_1J48pr')]
- CSS_SELECTOR 格式:
添加显式等待:使用
WebDriverWait等待元素可点击,确保元素完成渲染后再执行操作,比time.sleep更高效可靠。
修正后的代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC options = Options() options.add_experimental_option("detach", True) web = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) web.get('https://www.nerdwallet.com/?trk=nw_gn_5.0') Name = "credit card" # 等待搜索按钮加载并点击打开搜索框 search_toggle = WebDriverWait(web, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="global-nav"]/div[2]/div[1]/button')) ) search_toggle.click() # 等待搜索框加载并输入内容 search_input = WebDriverWait(web, 10).until( EC.visibility_of_element_located((By.ID, "searchInput")) ) search_input.send_keys(Name) # 等待绿色搜索按钮加载并点击 search_submit = WebDriverWait(web, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "._1_LcAp._2nYXVh._1J48pr")) ) search_submit.click()
额外提示
- 如果CSS_SELECTOR定位仍失败,可尝试通过按钮的其他属性定位,比如按钮的文本(若存在):
# 按按钮文本定位示例 search_submit = WebDriverWait(web, 10).until( EC.element_to_be_clickable((By.XPATH, '//button[text()="Search"]')) ) - 检查页面是否存在iframe或弹窗遮挡元素,若有需先切换iframe或关闭弹窗。
内容的提问来源于stack exchange,提问作者Kayton
相关产品推荐
相关产品推荐

