如何在 Java Selenium 中正确通过多类名定位 div 元素
发布时间 - 2026-01-11 00:00:00 点击率:次.selenium 的 `by.classname()` 不支持复合类名,`by.cssselector()` 也不能直接传入空格分隔的类名字符串;需改用 css 选择器(以点连接多个类)或 xpath(使用 `contains(@class, ...)` 模糊匹配)来精准定位含 tailwind 风格多类名的 div 元素。
在使用 Java + Selenium 进行 Web 自动化测试时,遇到类似 Tailwind CSS 生成的多类名(如 flex h-10 w-10 items-center justify-center...)非常常见。但初学者常误将整个 class 属性值当作单个类名传给 By.className(),导致 InvalidSelectorException: Compound class names are not permitted —— 因为该方法仅接受单一、不带空格的类名(如 "flex"),不支持空格分隔的多个类。
同样,若直接将空格分隔的类名字符串传给 By.cssSelector()(如 "flex h-10 w-10..."),会触发 invalid selector 错误,因为 CSS 选择器中空格表示后代关系,而非“同时拥有这些类”。
✅ 正确做法如下:
✅ 方案一:CSS 选择器(推荐,性能更优)
将每个类名前加 .,用 . 连接(表示“同时具备所有这些类”):
WebElement btn = driver.findElement(By.cssSelector(
"div.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"
));⚠️ 注意:Tailwind 中的响应式类(如 sm:h-16)含冒号 :,在 CSS 选择器中需转义为 sm\:h-16(Java 字符串中写两个反斜杠)。
✅ 方案二:XPath(语义清晰,容错性高)
利用 contains(@class, ...) 进行子字符串匹配(注意:此方式不区分单词边界,慎用于类名易重叠场景):
WebElement btn = driver.findElement(By.xpath(
"//div[contains(@class, '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.xpath("//d
iv[contains(@class, 'flex') and contains(@class, 'rounded-full') and text()='Yes']"));
// 或结合父容器结构(更可靠)
WebElement btn = driver.findElement(By.cssSelector(
"div.fixed.bottom-5.right-5 > div.flex.rounded-full"
));? 关键总结:
- ❌ By.className("flex h-10 ...") → 错误:只允许单类名;
- ❌ By.cssSelector("flex h-10 ...") → 错误:这不是合法 CSS 选择器;
- ✅ By.cssSelector("div.flex.h-10.w-10...") → 正确:. 表示“具有该类”,连续写表示“同时具有”;
- ✅ By.xpath("//*[contains(@class, 'flex h-10 ...')]") → 正确:基于 class 属性值的模糊匹配;
- ? 建议优先使用 CSS 选择器(执行快、语法简洁),并在类名过长或动态时,转向结构化定位(如父子关系 + 文本内容)以增强脚本鲁棒性。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
网站制作价目表怎么做,珍爱网婚介费用多少?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
装修招标网站设计制作流程,装修招标流程?
文字头像制作网站推荐软件,醒图能自动配文字吗?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
如何撰写建站申请书?关键要点有哪些?
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
html如何与html链接_实现多个HTML页面互相链接【互相】
如何确保FTP站点访问权限与数据传输安全?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
高防服务器租用指南:配置选择与快速部署攻略
长沙做网站要多少钱,长沙国安网络怎么样?
如何快速重置建站主机并恢复默认配置?
bootstrap日历插件datetimepicker使用方法
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
iOS发送验证码倒计时应用
浅析上传头像示例及其注意事项
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
高端云建站费用究竟需要多少预算?
清除minerd进程的简单方法
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
Python3.6正式版新特性预览
开心动漫网站制作软件下载,十分开心动画为何停播?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
在线制作视频网站免费,都有哪些好的动漫网站?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
如何用已有域名快速搭建网站?
如何快速完成中国万网建站详细流程?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel如何记录自定义日志?(Log频道配置)
深圳网站制作的公司有哪些,dido官方网站?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
Laravel用户密码怎么加密_Laravel Hash门面使用教程
如何快速搭建高效简练网站?
手机网站制作与建设方案,手机网站如何建设?
如何挑选高效建站主机与优质域名?
Swift中switch语句区间和元组模式匹配
Laravel怎么在Blade中安全地输出原始HTML内容
JavaScript模板引擎Template.js使用详解


iv[contains(@class, 'flex') and contains(@class, 'rounded-full') and text()='Yes']"));
// 或结合父容器结构(更可靠)
WebElement btn = driver.findElement(By.cssSelector(
"div.fixed.bottom-5.right-5 > div.flex.rounded-full"
));