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

使用Selenium无法定位微软以色列职位页面的“查看详情”按钮求助

解决微软职位网站“See details”按钮定位失败的问题

问题根源

你之前的定位方式存在两个核心问题:

  1. 动态生成的类名:css-470这类class是前端框架自动生成的,刷新页面或网站更新后会随机变化,无法作为稳定定位标识。
  2. 脆弱的绝对XPATH:你用的XPATH层级过深,完全依赖页面固定结构,只要网站调整布局(哪怕只是一个div的层级变动),定位就会失效,而且这个路径只指向单个按钮,无法匹配所有“See details”按钮。

另外,presence_of_all_elements_located仅检查元素是否存在于DOM中,不确保元素可见,这也可能导致超时——元素虽然加载了,但还没渲染到可视区域。

修正方案

以下是几种稳定可靠的定位方式,结合更合理的等待条件:

1. 基于按钮文本定位(最直接)

利用“See details”固定文本定位,配合normalize-space处理文本中的空格:

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

options = webdriver.ChromeOptions()
# 可选:添加配置优化爬取体验
options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
options.add_argument("--blink-settings=imagesEnabled=false")

driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 20)

try:
    driver.get("https://jobs.careers.microsoft.com/global/en/search?lc=Israel&l=en_us&pg=1&pgSz=20&o=Relevance&flt=true&ref=cms")
    
    # 先处理cookie弹窗(如果存在)
    try:
        accept_cookie = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Accept all cookies')]")))
        accept_cookie.click()
    except:
        pass
    
    # 等待所有"See details"按钮可见
    buttons = wait.until(EC.visibility_of_all_elements_located(
        (By.XPATH, "//button[normalize-space(text())='See details']")
    ))
    
    print(f"成功定位到 {len(buttons)} 个按钮")
    
    # 示例操作:遍历按钮并点击
    # for btn in buttons:
    #     btn.click()
    #     # 处理详情页后返回列表页
    #     driver.back()
    #     # 重新等待按钮加载(返回后DOM会刷新)
    #     buttons = wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//button[normalize-space(text())='See details']")))
    
finally:
    driver.quit()

2. 结合职位卡片上下文定位(更精准)

如果页面存在其他相似文本的按钮,可以结合职位卡片的父元素缩小范围:

buttons = wait.until(EC.visibility_of_all_elements_located(
    (By.XPATH, "//div[contains(@class, 'job-card')]//button[normalize-space(text())='See details']")
))

3. 利用元素属性定位(如果按钮有固定属性)

检查按钮的HTML结构,若存在data-*这类固定属性(比如data-job-id),可以直接用属性定位:

buttons = wait.until(EC.visibility_of_all_elements_located(
    (By.XPATH, "//button[@data-job-id]")
))

额外注意事项

  • 微软职位网站可能有反爬机制,建议添加合理的请求间隔,避免频繁操作被限制。
  • 若页面采用懒加载(滚动到底部才加载更多职位),需要模拟滚动操作触发加载:
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 等待新内容加载
wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'job-card')][last()]")))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:23:31