使用 by.text 进行排毒子字符串匹配

Posted

技术标签:

【中文标题】使用 by.text 进行排毒子字符串匹配【英文标题】:Detox Substring Match Using by.text 【发布时间】:2021-07-22 01:16:23 【问题描述】:

我正在尝试按文本选择一个元素,但实际文本会发生变化,因为它包含当前时间戳。有没有办法在不对 getAttributes() 进行子字符串搜索的情况下选择它?我不能使用 getAttributes,因为我们还将在 android 上进行测试。

我正在使用的选择:

await expect(element(by.text("James has initiated the chatbot: ShallowFaqChatbot"))).toBeVisible();

元素:

  
      hittable: true,
      activationPoint:  x: 153.5, y: 14.75 ,
      normalizedActivationPoint:  x: 0.5, y: 0.5 ,
      elementFrame:  y: 9, x: 9, width: 307, height: 29.5 ,
      enabled: true,
      elementBounds:  y: 0, x: 0, width: 307, height: 29.5 ,
      layer: '<CALayer: 0x600002b907c0>',
      safeAreaInsets:  right: 0, top: 0, left: 0, bottom: 0 ,
      visible: true,
      elementSafeBounds:  y: 0, x: 0, width: 307, height: 29.5 ,
      label: 'James has initiated the chatbot: ShallowFaqChatbot - 11:08 am',
      className: 'RCTTextView',
      frame:  y: 473, x: 34, width: 307, height: 29.5 ,
      text: 'James has initiated the chatbot: ShallowFaqChatbot - 11:08 am'
  

您可以看到它具有我要查找的文本的属性文本,但是由于“- 11:08 am”,detox 无法抓取它。

【问题讨论】:

【参考方案1】:

很遗憾,Detox 不支持正则表达式匹配器:https://github.com/wix/Detox/issues/1441。

这里最简单的解决方法是将testID 添加到元素并在其上进行匹配。

await expect(element(by.id("James has initiated the chatbot: ShallowFaqChatbot"))).toBeVisible();

您无需使用.and 来进行此匹配。这不是一个理想的解决方案,但由于 testID 会被隐藏起来,这应该是适合您的情况的有效解决方案。

【讨论】:

【参考方案2】:

您可以尝试使用detox "and" matcher

为此,您必须设置元素的testID。 现在,假设您的元素的testIDsuper_text_field

如果您想检查此元素是否包含“某物”之类的特定文本,您可以使用以下解决方法:

await expect(element(by.id('super_text_field').and(by.text('something')))).toBeVisible()

当然,这种解决方法有其局限性和假设,但我希望它适用于您的情况!

【讨论】:

问题是 by.text 仍然会进行完全匹配,因此使用带有 by.id 元素的 'and' 匹配器无济于事。 不幸的是,我认为 detox 无法进行模式匹配:( 相反,您可以尝试以下解决方法:(1) 您可以将组件重构为两个较小的组件,然后提取这个“时间”部分进入第二个。确保第一个有testID。然后你可以检查第一个是否有你想要的文本。(2)尽量确保“时间”部分是固定的。我我很确定您可以控制它,因此请尝试确保将其设置为“21:37”。然后您将能够进行全文匹配

以上是关于使用 by.text 进行排毒子字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中控制警报使用排毒?

排毒:使用多个元素匹配器会导致错误

使用后缀树进行近似子串匹配

正则表达式

高速掌握Lua 5.3 —— 字符串库

Sqlite FTS5:使用 Trigram Tokenizer 进行子字符串匹配