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

Selenium中如何实现鼠标悬停并校验Tooltip提示文本?

Tooltip控件悬停测试失败问题排查

问题描述

  • 测试需求:对Tooltip控件执行鼠标悬停操作,获取控件展示的提示文本
  • 故障现象:悬停操作未正常触发,无法获取到提示文本,导致对应测试用例执行失败

已尝试的实现方式

方式1:调用actions的mouseMove方法移动鼠标到目标元素触发操作

对应实现代码:

browser.actions()
.mouseMove(
  element(by.xpath('/html/body/app-root/div/main/ng-component/ngb-tabset/div/div/view-concepts-tab/div[1]/concept-view/div/dl/mat-accordion/mat-expansion-panel/div/div/div[4]/term-view/div/div[3]/div[1]/dl/mat-accordion/mat-expansion-panel/mat-expansion-panel-header/span[1]/mat-panel-description/dd/span')))
.click()
.perform();

text('On mouse hover')

该方式未成功触发Tooltip显示,无法拿到目标文本。

方式2:直接通过XPath定位元素后断言文本值

对应实现代码:

expect(element.all(by.xpath('/html/body/app-root/div/main/ng-component/ngb-tabset/div/div/view-concepts-tab/div/concept-view/div/dl/mat-accordion/mat-expansion-panel/div/div/div[2]/term-view/div/div[3]/div[1]/dl/mat-accordion/mat-expansion-panel/mat-expansion-panel-header/span[1]/mat-panel-description/dd/span'))).toEqual('On mouse hover');

该方式未触发悬停动作,Tooltip节点未完成渲染,无法匹配到目标文本。

问题进展与新报错

改用CSS选择器定位元素后仍未解决问题,运行时抛出错误:Expected [ ] to equal 'On mouse hover'.,对应代码如下:

expect(element.all(by.css('dd#A>span'))).toEqual('On mouse hover');

报错说明定位返回了空元素集合,未匹配到持有目标文本的DOM节点。

修复方案

  1. 修正悬停触发逻辑
    Tooltip为悬停触发的动态渲染元素,原有代码中多余的.click()操作会打断悬停状态,需移除;另外使用的绝对XPath路径层级过深,DOM节点索引轻微变动就会定位失效(两次编写的XPath中div索引分别为[1]、[2],已经出现层级不匹配问题),优先给Tooltip触发元素加专属定位标记(如data-testid="tooltip-trigger")提升定位稳定性。悬停逻辑参考:
    const tooltipTrigger = element(by.css('[data-testid="tooltip-trigger"]'));
    // 移动鼠标到触发元素,移除多余的click操作
    await browser.actions().mouseMove(tooltipTrigger).perform();
    // 加显式等待,等Tooltip渲染完成后再执行后续断言,避免取数时机过早
    await browser.wait(
      ExpectedConditions.textToBePresentInElement(element(by.css('.mat-tooltip')), 'On mouse hover'),
      3000,
      'Tooltip 3秒内未正常渲染'
    );
    
  2. 修正元素定位与断言逻辑
    原有代码使用element.all()获取元素集合,无法直接和字符串做相等断言,需取单个元素后读取文本再断言;另外Angular Material组件库的Tooltip默认渲染在body根节点下,并非嵌套在触发元素的子节点中,这是之前定位返回空数组的核心原因。断言逻辑参考:
    // 直接定位全局渲染的Tooltip节点(默认携带mat-tooltip类名)
    const tooltipContent = element(by.css('.mat-tooltip'));
    expect(await tooltipContent.getText()).toEqual('On mouse hover');
    
  3. 边缘场景兼容
    如果鼠标移动后仍未触发Tooltip,可以给mouseMove方法加元素内坐标偏移,确保鼠标落在触发元素的有效范围内,避免移动到元素边缘不触发交互:
    await browser.actions()
      .mouseMove(tooltipTrigger, {x: 5, y: 5}) // 偏移到元素内距边缘5px位置
      .perform();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:36:19