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

Selenium无法定位workera.ai页面class对应元素的问题排查

问题根因
  • 首要原因是By.CLASS_NAME选择器用法完全错误。Selenium原生的By.CLASS_NAME定位方法仅支持传入单个class值,不支持传入空格分隔的多类组合字符串。你代码中传入的"sc-jNHgKk hrMhpT"、"styled__SBase-sc-cmjz60-0 styled__SPrimary-sc-cmjz60-1 kSmXiJ hwoYMb sc-fKVqWL eOjNfz"都是多个class拼接的内容,直接传入会被Selenium当作单个类名匹配,必然找不到元素。这也是为什么bs4能解析到元素、Selenium找不到的核心原因——bs4解析HTML字符串时对class的匹配逻辑支持多类查询,和Selenium的CLASS_NAME定位逻辑完全不同,和反爬拦截没有关系。
  • 你代码注释里也标注了,这些sc-、styled__开头的类名是前端CSS-in-JS编译生成的动态类名,不同构建版本、不同会话下类名的随机后缀会发生变化,硬编码全量类名本身就极不稳定,哪怕修正选择器用法,后续也很容易因为类名更新定位失败。
  • 该平台确实存在前端反爬检测机制,但你当前的报错不属于被拦截的情况:如果真的被Selenium特征检测拦截,页面要么跳验证、要么不渲染核心内容,你通过page_source拿到的HTML里根本不会存在目标元素,和你补充的bs4可正常解析的现象矛盾。
修复方案
  • 替换错误的定位逻辑,废弃By.CLASS_NAME匹配多类元素的写法,改用CSS选择器或XPath,同时尽量不要硬编码动态类名:
    1. 定位分页总题数元素时,优先用元素文本特征、固定类名前缀匹配,不要写全动态类名
    2. 定位操作按钮时,优先匹配按钮的固定基础类名、元素属性(如type、role、可见文本),不要把随机生成的类名全部写进选择器
      修正后的核心代码示例:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    for skill in skill_sets:
        wd.get(skill)
        # 替换固定sleep为显式等待,最多等20秒,元素加载完成立刻执行后续逻辑,避免无效等待
        wait = WebDriverWait(wd, 20)
        # 匹配class包含固定前缀sc-jNHgKk的元素,忽略后面动态变化的类名
        # 如果类名前缀也发生变化,可以改用文本特征定位,稳定性更高
        # num_ele = wait.until(EC.presence_of_element_located((By.XPATH, "//*[contains(normalize-space(text()), 'of')]")))
        num_ele = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "[class*='sc-jNHgKk']")))
        num = int(num_ele.text.split('of')[1].strip())
        print(num)
        # 匹配按钮固定的两个基础类名,忽略后面随机生成的动态类名
        button = wd.find_elements(By.CSS_SELECTOR, ".styled__SBase-sc-cmjz60-0.styled__SPrimary-sc-cmjz60-1")
        print(len(button))
        # 加等待避免请求过快触发风控
        time.sleep(2)
    
  • 补全反爬特征隐藏逻辑,仅靠启动参数不足以完全绕过检测,初始化driver后增加CDP脚本覆盖navigator.webdriver标识:
    wd = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=option)
    # 页面加载前注入脚本覆盖自动化标识
    wd.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
    })
    
  • 爬取过程中控制访问频率,不要连续快速切换页面,避免触发平台的行为风控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:01:02