Java Selenium获取Div元素遇InvalidSelectorException问题求助
问题解决:Selenium定位带多类名的div元素
错误原因分析
你写的两个定位方式都有问题:
- By.className()报错:这个方法只能传入单个类名,HTML中class属性的空格是多个类的分隔符,你传入的
flex h-10...是多个类名的组合,因此触发InvalidSelectorException。 - 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
相关产品推荐
相关产品推荐

