单击使用 sikuli 多次使用的特定下拉项

Click on specific drop down item which are used multiple times using sikuli

我在使用 sikuli 时遇到问题。

在所附的工具栏图片中,我有三个相同的下拉菜单用于不同的目的。使用 sikuli 我想点击第二个下拉菜单。

我正在使用下面的代码,但问题是 运行 代码,它只点击第一个下拉菜单。

我的代码是:

Screen screen = new Screen();

    // Create object of Pattern class and specify the images path

    Pattern image = new Pattern(AppConstant.IMAGE_DIR+"toolbar.png");
    Pattern image2 = new Pattern(AppConstant.IMAGE_DIR+"import-button.png");
    Pattern image3 = new Pattern(AppConstant.IMAGE_DIR+"dropdown.png");
    //screen.wait(image.exact(), 10000);
    screen.find(image);
    screen.find(image2);
    screen.find(image3);

有什么建议吗?

谢谢

首先,您需要该元素的辅助功能 ID。如果该元素具有 AI(辅助功能 ID)。然后您可以遍历元素并访问所需的索引。

要在 windows 中获取 AI,您可以使用 Inspect(miscrosoft 的 Ai 工具)。在 mac 中,您可以使用 Appium 获取 AI。

如果您有权访问您的开发人员源代码,您也可以在那里找到 Api。

ELSE:您可以使用下面的代码。希望对您有所帮助。

      Iterator <Match> matches  = screen.findAll("dropdown.png"); // s is screen
      Pattern pButton = new Pattern("dropdown.png");


      while (matches.hasNext()) {

        Match m = matches.next(); 
        i++;
        if(i==3) {

            screen.click(m); // click on drop-down
            Thread.sleep(1000);
            break;
        }   
    }

您可以使用内置的 findAll 和 getlastMatches 方法,然后单击您想要的那个。

icons = findAll(image3) mm = list(getLastMatches()) click(mm[2])

在有多个相似模式的场景中,最佳做法是以周围元素为支点。在您的情况下,如果您知道在要单击的元素的同一区域中有另一个唯一元素,则可以先找到该唯一元素,然后在该唯一元素周围搜索您实际需要的元素。

例如,在您的情况下,蓝色向下箭头就在您需要的下拉菜单按钮旁边。所以你可以这样做:

ImagePath.setBundlePath("C:\someDir\sikulipatterns"); //This is to avoid supplying directory for each pattern
Screen screen = new Screen();

Pattern bigBlueArrowPattern = new Pattern("bigBlueArrow.png");
Pattern dropDownPattern = new Pattern("dropDownArrow.png");

Region bigBlueArrowPatternRegion = screen.find(bigBlueArrowPattern);
bigBlueArrowPatternRegion.grow(50).find(dropDownPattern).highlight(1);

这里,50是要在区域周围添加的边距,所以基本上是在蓝色箭头周围扩展区域。我包含 highlight(1) 只是为了强调确实找到了正确的元素,但您应该删除它并对找到的元素做任何您想做的事情。