HarmonyOS鸿蒙Next中Hypium控件属性查找如何使用正则表达式

HarmonyOS鸿蒙Next中Hypium控件属性查找如何使用正则表达式 Hypium版本6.0.7.202

我们在尝试使用Hypium对bilibili进行控制,当我们尝试在app中切换分辨率时,我们发现分辨率控件是一个Text类型的属性,且其值随着当前分辨率变化,共有以下取值[“480P 标清”, “720P 准高清”, “1080P 高清”, “4K 超高清”],因此我们想要通过BY选择器的模糊匹配方式进行点击。在查阅文档后,BY选择器支持通过传入MatchPattern.REGEXP进行正则匹配,但是我们尝试了多种写法的正则表达式,均无法找到控件。

以下是我们尝试的写法,不管是什么写法,返回值都是None

comp = self.driver.find_component(BY.text(r"^(480P|720P|1080P|4K|HDR)$",MatchPattern.REGEXP))
comp = self.driver.find_component(BY.text(r"^(480P|720P|1080P|4K|HDR)[\s\S]*$",MatchPattern.REGEXP))
comp = self.driver.find_component(BY.text(r"(480P|720P|1080P|4K|HDR).*",MatchPattern.REGEXP))
comp = self.driver.find_component(BY.text(r"^(480P 标清|720P 准高清|1080P 高清|4K 超高清)$",MatchPattern.REGEXP))

我们尝试在相同页面直接使用以下代码,可以成功点击控件

comp = self.driver.find_component(BY.text("480P 标清"))

是否有使用正则表达式进行匹配的相关示例代码,因为后续我们有非常多使用正则表达式进行控件点击的场景


更多关于HarmonyOS鸿蒙Next中Hypium控件属性查找如何使用正则表达式的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

开发者您好,您可以把

r"^(480P|720P|1080P|4K|HDR)$"

中间括号去掉,这样就可以匹配到了。

示例代码如下:

comp = self.driver.find_component(BY.text(r"^480P|360P|720P|1080P|4K|HDR$", MatchPattern.REGEXP))

更多关于HarmonyOS鸿蒙Next中Hypium控件属性查找如何使用正则表达式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,Hypium框架支持使用正则表达式查找控件属性。通过By类结合regex方法,可在自动化测试中匹配控件属性值。例如,使用By.regex("text", "正则表达式")来定位文本属性符合特定模式的控件。这适用于动态变化的属性值场景,如部分文本匹配。

在HarmonyOS Next的Hypium框架中,使用正则表达式进行控件查找时,关键在于理解BY.text()方法对MatchPattern.REGEXP的处理方式。根据你的描述,问题可能出在正则表达式的构造与控件实际文本的匹配逻辑上。

你提供的正则表达式(如r"^(480P|720P|1080P|4K|HDR)$")旨在精确匹配“480P”等纯分辨率字符串。然而,控件的完整文本是“480P 标清”这类包含空格和中文字符的字符串。因此,^$锚点会导致匹配失败,因为文本首尾并非纯分辨率。

更有效的做法是使用更宽松的正则表达式来匹配包含这些分辨率关键词的文本。例如,可以尝试移除首尾锚点,并允许匹配后续任意字符:

comp = self.driver.find_component(BY.text(r"480P|720P|1080P|4K|HDR", MatchPattern.REGEXP))

这个表达式会匹配包含任意指定分辨率关键词(如“480P”)的文本,无论其前后是否有其他字符(如“标清”)。它更符合你描述的控件文本结构。

如果上述方法仍不生效,可能需要检查Hypium框架对正则表达式的具体实现支持。某些情况下,框架可能默认使用全字符串匹配而非搜索匹配。此时,可以尝试在表达式中添加.*来明确匹配模式:

comp = self.driver.find_component(BY.text(r".*(480P|720P|1080P|4K|HDR).*", MatchPattern.REGEXP))

这确保了正则表达式会匹配任何包含分辨率关键词的字符串。

此外,建议在调试时先使用find_components()(复数形式)来验证匹配结果,确认正则表达式是否能匹配到控件列表,再进一步操作。例如:

comps = self.driver.find_components(BY.text(r"480P|720P|1080P|4K|HDR", MatchPattern.REGEXP))
print(f"找到 {len(comps)} 个匹配控件")

这有助于确认正则表达式是否有效,以及匹配到的控件数量。

总结:在Hypium中使用正则表达式时,确保表达式与控件完整文本匹配,避免过度限制的锚点,并通过调试方法验证匹配结果。对于你提到的场景,匹配分辨率关键词(而非完整固定字符串)的正则表达式通常更可靠。

回到顶部