gkd-kit/gkd

疑似bug: matches字段中包含多个选择器时无法触发点击

Closed this issue · 4 comments

一些验证

  • 搜索检查是否已经存在请求相同功能的问题/讨论,以避免重复创建问题
  • GKD 默认不包含任何规则, 如果您想要自定义规则, 您可以 查看文档
  • 1.我确认知晓并同意维护者直接关闭不符合 issue 规范的问题
  • 2.我确认知晓并同意维护者直接关闭不符合 issue 规范的问题
  • 3.我确认知晓并同意维护者直接关闭不符合 issue 规范的问题
  • 我已确保提供下列的日志和BUG描述及其复现步骤, 否则我同意维护者直接关闭问题

日志文件-无论什么问题不包含日志将会被直接关闭

log-1712303078944.zip

BUG描述(文字/截图/视频)

APP版本:1.7.3

按API docs里的描述,规则中的matches字段可以是包含多个选择器的IArray
https://gkd.li/api/interfaces/RawRuleProps#matches

但以下规则无法触发点击事件(快照节点满足key: 0的第一条选择器):

{
  id: 'com.zhihu.android',
  name: '知乎',
  groups: [
    {
      key: 1,
      name: '分段广告-推荐页-问题广告卡片',
      activityIds: 'com.zhihu.android.app.ui.activity.MainActivity',
      rules: [
        {
          key: 0,
          matches: [
            '@ImageView[id=`com.zhihu.android:id/menu`] < FrameLayout - * > TextView[text^=`广告`]',
            '@ImageView < ViewGroup -3 TextView[text^=`广告`]',
          ],
          snapshotUrls: 'https://i.gkd.li/import/14881985',
        },
        {
          key: 1,
          quickFind: true,
          matches:
            '@ViewGroup[clickable=true] <3 ViewGroup < ViewGroup -n ViewGroup > ViewGroup > TextView[text=" 的广告"]',
        },
        {
          key: 90,
          preKeys: [0],
          quickFind: true,
          matches: [
              '@FrameLayout[clickable=true] >3 TextView[text="屏蔽该内容"][id="com.zhihu.android:id/tv_content"]',
              '@LinearLayout[clickable=true] >3 TextView[text="不感兴趣"][id="com.zhihu.android:id/title"]',
          ],
        },
        {
          key: 91,
          preKeys: [1],
          quickFind: true,
          matches:
            '@FrameLayout > LinearLayoutCompat[id="com.zhihu.android:id/ll_container"] >2 TextView[text="内容不感兴趣"][id="com.zhihu.android:id/tv_content"]',
        },
      ],
    },
  ],
}

如果将matches改为只有一条选择器,则可以正确触发点击事件:

{
  id: 'com.zhihu.android',
  name: '知乎',
  groups: [
    {
      key: 1,
      name: '分段广告-推荐页-问题广告卡片',
      activityIds: 'com.zhihu.android.app.ui.activity.MainActivity',
      rules: [
        {
          key: 0,
          matches: '@ImageView[id=`com.zhihu.android:id/menu`] < FrameLayout - * > TextView[text^=`广告`]',
          snapshotUrls: 'https://i.gkd.li/import/14881985',
        },
        {
          key: 1,
          quickFind: true,
          matches:
            '@ViewGroup[clickable=true] <3 ViewGroup < ViewGroup -n ViewGroup > ViewGroup > TextView[text=" 的广告"]',
        },
        {
          key: 90,
          preKeys: [0],
          quickFind: true,
          matches: '@LinearLayout[clickable=true] >3 TextView[text="不感兴趣"][id="com.zhihu.android:id/title"]',
        },
        {
          key: 91,
          preKeys: [1],
          quickFind: true,
          matches:
            '@FrameLayout > LinearLayoutCompat[id="com.zhihu.android:id/ll_container"] >2 TextView[text="内容不感兴趣"][id="com.zhihu.android:id/tv_content"]',
        },
      ],
    },
  ],
}

请问这是matches的特性还是一个bug?

期望行为(文字/截图/视频)

包含多个选择器的matches字段在满足其中一个选择器时可以正常触发点击事件

实际行为(文字/截图/视频)

包含多个选择器的matches字段在满足其中一个选择器时无法触发点击事件

https://gkd.li/api/interfaces/RawRuleProps#matches 的注释是

一个或者多个合法的 GKD 选择器, 如果每个选择器都能匹配上节点, 那么点击最后一个选择器的目标节点

image

https://i.gkd.li/import/14881985 中并不能选择到 @ImageView < ViewGroup -3 TextView[text^='广告']

image

不满足 如果每个选择器都能匹配上节点 这个条件

https://gkd.li/api/interfaces/RawRuleProps#matches 的注释是

一个或者多个合法的 GKD 选择器, 如果每个选择器都能匹配上节点, 那么点击最后一个选择器的目标节点

image

https://i.gkd.li/import/14881985 中并不能选择到 @ImageView < ViewGroup -3 TextView[text^='广告']

image

不满足 如果每个选择器都能匹配上节点 这个条件

我之前的理解是:当二者都能匹配时,点击最后一个选择器的目标节点;当其中一种匹配时,使用匹配的那个选择器。
看来是我理解错了,感谢解惑

你说的那种叫 anyMatches 我还没考虑支持

因为它可以通过多个 rule 的单个 matches 去实现

因为它可以通过多个 rule 的单个 matches 去实现

但是的确精简了规则代码