Selenium无法定位按钮弹出小窗口内元素的问题求助
问题:爬取诊所WhatsApp号码时无法定位元素
尝试从指定网站爬取诊所的WhatsApp号码,流程为:进入诊所详情页后点击id为view-whatsapp的按钮,弹出的窗口中存在类名为fs-text-2 whatsapp-click-stats的号码元素,但执行代码时抛出NoSuchElementException错误,无法定位该元素。
错误信息
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".fs-text-2 whatsapp-click-stats"}
问题原因
- 类名定位逻辑错误:
find_element_by_class_name仅支持单个类名输入,传入空格分隔的多个类名时,会被解析为CSS后代元素查找规则,导致定位失败。 - 未等待弹窗加载完成:点击按钮后弹窗需要渲染时间,直接查找元素会因元素未加载而报错。
- 隐式等待与显式等待冲突:代码中设置的
implicitly_wait(50)会与显式等待逻辑冲突,导致等待机制混乱。
解决方法
- 改用CSS选择器定位多类名元素:对于包含多个类名的元素,使用
By.CSS_SELECTOR,语法为.类名1.类名2(类名间用点连接,无空格)。 - 添加显式等待:点击按钮后,显式等待号码元素加载完成,确保元素可被正常定位。
- 优先使用显式等待:移除隐式等待设置,避免两种等待机制冲突。
修改后的代码
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 = "https://infoguia.com/bnom.asp?txt=clinicas&est=100" # 初始化Chrome驱动 driver = webdriver.Chrome(r'C:\Users\hamxa\Desktop\Chromdriver\chromedriver.exe') driver.get(url) # 等待诊所列表加载完成并获取元素 clinics = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".grey-btn-profile.fs-text-button-1.fw-bold")) ) # 遍历每个诊所获取WhatsApp号码 for clinic in clinics: clinic.click() try: # 等待WhatsApp按钮可点击并点击 whatsapp_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "view-whatsapp")) ) whatsapp_button.click() # 等待号码元素可见并获取文本 number_element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CSS_SELECTOR, ".fs-text-2.whatsapp-click-stats")) ) print(number_element.text) finally: driver.back() # 关闭浏览器驱动 driver.quit()
内容的提问来源于stack exchange,提问作者Hamza Waheed
相关产品推荐
相关产品推荐

