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

Playwright Java:如何用正则匹配等待元素不含指定文本?

问题分析与解决方法

首先,你用:text-matches("!Loading...")的写法是错误的,Playwright的文本匹配选择器不支持这种直接加!的否定语法,而且选择器结构也有问题——#headerMessage :text-matches(...)是找#headerMessage的后代元素里匹配文本的,而实际Loading...应该是#headerMessage自身的文本,所以空格要去掉。

可行的解决方式

方式1:使用正则表达式匹配非Loading文本

正确的否定正则写法应该用反向预查,确保元素文本不是Loading...,同时要去掉选择器里的空格,让文本匹配作用在#headerMessage本身:

Frame frame = page.frame("tf_content")
    .waitForSelector("#headerMessage:text-matches('^((?!Loading\\.\\.\\.).)*$')")
    .ownerFrame();

注意:正则里的.需要转义成\\.,因为.在正则中是通配符;同时用单引号包裹正则,避免和Java的双引号冲突。

方式2:等待元素隐藏(更推荐)

相比文本匹配,直接等待#headerMessage元素隐藏(或者其包含的Loading文本消失)更直观可靠,Playwright提供了waitForSelector的隐藏状态选项:

// 等待#headerMessage元素隐藏
page.frame("tf_content").waitForSelector("#headerMessage", new WaitForSelectorOptions().setState(State.HIDDEN));
Frame frame = page.frame("tf_content");

或者如果#headerMessage不会隐藏,只是文本变化,可等待元素文本不等于Loading...:

Frame frame = page.frame("tf_content");
frame.waitForCondition(() -> !"Loading...".equals(frame.locator("#headerMessage").textContent()));

你之前写法的错误点

  • 选择器结构错误:#headerMessage :text-matches(...)中的空格表示后代元素,若Loading...是#headerMessage自身的文本,应该去掉空格写成#headerMessage:text-matches(...)。
  • 否定语法错误::text-matches不支持直接在字符串前加!表示否定,需要用正则的反向预查语法实现非匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:50:32