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
相关产品推荐
相关产品推荐

