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

Java Selenium获取Div元素遇InvalidSelectorException问题求助

问题解决:Selenium定位带多类名的div元素

错误原因分析

你写的两个定位方式都有问题:

  1. By.className()报错:这个方法只能传入单个类名,HTML中class属性的空格是多个类的分隔符,你传入的flex h-10...是多个类名的组合,因此触发InvalidSelectorException。
  2. By.cssSelector()报错:CSS选择器中类选择器必须以.开头,你直接写类名且未转义特殊字符(如sm:h-16里的冒号),导致选择器格式非法。

另外明确:flex h-10 w-10...是多个独立的类名,不是单个类名。

正确定位方法

1. 最优方案:CSS选择器

用.拼接所有类名,注意转义带冒号的类(冒号是CSS特殊字符,需加反斜杠转义):

WebElement btn = driver.findElement(By.cssSelector(
    ".flex.h-10.w-10.items-center.justify-center.rounded-full.border-4.border-white.font-SFProBold.text-base.sm\\:h-16.sm\\:w-16.sm\\:text-xl"));

简化写法:不需要写全所有类,选几个能唯一标识元素的类组合即可,比如:

WebElement btn = driver.findElement(By.cssSelector(".border-4.border-white.font-SFProBold"));

2. 结合文本定位(XPath)

因为元素包含文本"Yes",可以用XPath结合类名定位,更直观:

WebElement btn = driver.findElement(By.xpath("//div[contains(@class, 'border-white') and text()='Yes']"));

3. 用className配合过滤(不推荐)

如果一定要用By.className(),只能选单个独特类名,再通过文本过滤:

List<WebElement> elements = driver.findElements(By.className("font-SFProBold"));
WebElement btn = elements.stream()
    .filter(e -> e.getText().trim().equals("Yes"))
    .findFirst()
    .orElseThrow(() -> new NoSuchElementException("目标元素未找到"));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:50:20