You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium点击Google Jobs显示描述按钮遇ElementNotInteractableException

问题:Selenium操作Google Jobs时无法点击展开描述按钮,抛出ElementNotInteractableException

尝试用Selenium导出Google Jobs上的职位完整描述,但点击展开按钮时触发ElementNotInteractableException,已尝试定位mCs3Sb和jJP9Pc类名元素,均无效。已知使用API是更优方案,但仍希望通过Selenium实现。

原代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

url = 'https://www.google.com/search?q=data+analyst+jobs+near+London&rlz=1C1ONGR_en-GBGB977GB977&oq=data+&gs_lcrp=EgZjaHJvbWUqBggBEEUYOzIGCAAQRRg5MgYIARBFGDsyBggCEEUYOzIGCAMQRRg7MgYIBBBFGDwyBggFEEUYPDIGCAYQRRg8MgYIBxBFGDzSAQg2MTU4ajBqMagCALACAA&sourceid=chrome&ie=UTF-8&ibp=htl;jobs&sa=X&ved=2ahUKEwj63MCW6qGEAxX3VfEDHbJDATkQutcGKAF6BAgeEAU#htivrt=jobs&fpstate=tldetail&htichips=date_posted:today&htischips=date_posted;today&htidocid=gR8sURIPiiVZDY-HAAAAAA%3D%3D'
driver = webdriver.Chrome()
driver.get(url)

# Rejecting cookies
driver.implicitly_wait(1)
reject_button = driver.find_element(by=By.CSS_SELECTOR, value="button")
reject_button.click()

# Applying filter for listings in past 24 hours
driver.implicitly_wait(1)
driver.get(url)

# Showing the full job description (where the problem arises)
driver.implicitly_wait(2)
show_desc_button = driver.find_element(By.CLASS_NAME, 'mCs3Sb') 
#not interactable
show_desc_button.click()

解决方案

核心问题分析:

  1. 隐式等待时间过短,元素未完全加载或可交互就执行点击
  2. Google Jobs的类名是动态生成的,会随时变化,依赖类名定位不可靠
  3. 重复调用driver.get(url)会重置页面状态,丢失之前的操作
  4. 按钮可能不在可视区域内,导致无法交互

修改后的代码:

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
from selenium.common.exceptions import TimeoutException

url = 'https://www.google.com/search?q=data+analyst+jobs+near+London&rlz=1C1ONGR_en-GBGB977GB977&oq=data+&gs_lcrp=EgZjaHJvbWUqBggBEEUYOzIGCAAQRRg5MgYIARBFGDsyBggCEEUYOzIGCAMQRRg7MgYIBBBFGDwyBggFEEUYPDIGCAYQRRg8MgYIBxBFGDzSAQg2MTU4ajBqMagCALACAA&sourceid=chrome&ie=UTF-8&ibp=htl;jobs&sa=X&ved=2ahUKEwj63MCW6qGEAxX3VfEDHbJDATkQutcGKAF6BAgeEAU#htivrt=jobs&fpstate=tldetail&htichips=date_posted:today&htischips=date_posted;today&htidocid=gR8sURIPiiVZDY-HAAAAAA%3D%3D'
driver = webdriver.Chrome()
driver.get(url)

try:
    # 精准定位并点击cookie拒绝按钮,支持中英文界面
    reject_button = WebDriverWait(driver, 5).until(
        EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), '拒绝') or contains(text(), 'Reject')]"))
    )
    reject_button.click()
except TimeoutException:
    print("未找到cookie拒绝按钮,跳过")

try:
    # 滚动到职位描述区域,确保按钮在可视范围内
    desc_section = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'YgLbBe'))
    )
    driver.execute_script("arguments[0].scrollIntoView(true);", desc_section)
    
    # 通过按钮文本定位,避开动态类名的问题
    show_desc_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), '查看完整描述') or contains(text(), 'Show full description')]"))
    )
    show_desc_button.click()
    print("成功展开职位描述")
    
    # 获取并打印完整描述
    full_description = WebDriverWait(driver, 5).until(
        EC.visibility_of_element_located((By.CLASS_NAME, 'vNsFBe'))
    ).text
    print("\n=== 完整职位描述 ===")
    print(full_description)
except TimeoutException as e:
    print(f"操作超时:{str(e)}")
finally:
    driver.quit()

关键优化点:

  • 显式等待替代隐式等待:精准等待元素进入可点击/可见状态,避免过早操作
  • XPath文本定位:Google的动态类名易变,用按钮文本定位更稳定,兼容中英文界面
  • 滚动到元素:执行JS脚本将描述区域滚动到可视范围,解决元素遮挡或不可见问题
  • 移除重复页面加载:原URL已包含筛选条件,无需重新调用driver.get(url)
  • 异常处理:捕获超时异常,避免脚本直接崩溃,同时输出错误信息

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:08:13