单击使用 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)
只是为了强调确实找到了正确的元素,但您应该删除它并对找到的元素做任何您想做的事情。
我在使用 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)
只是为了强调确实找到了正确的元素,但您应该删除它并对找到的元素做任何您想做的事情。