【问题标题】:How to Find Exact match of an Image in Sikuli with Java如何使用 Java 在 Sikuli 中查找图像的精确匹配
【发布时间】:2019-08-09 22:02:25
【问题描述】:

我是 Sikuli 的新手,正在尝试自动化 Citirx 应用程序。需要帮助

我正在尝试在屏幕中选择用户角色,该屏幕有多个角色,因此我需要向下滚动屏幕并搜索特定角色并单击该角色。

我已捕获需要在代码下方选择和使用的特定角色的图像。在第二张图片中,我用红色突出显示了我需要选择的角色

下面是代码:

创建一个方法:

 public static boolean clipExist(Screen screen, String clip )
 {
        Match m = screen.exists(clip);
         if(m != null)
      {
              return true;
        }
       else
       {
          return false;
       }
   }

使用方法:

        while(! clipExist(screen, "C:\\Users\\Satish_D1\\workspace\\Sikuli Demo\\Images\\DownArrow.PNG"))       
    {           
       screen.wheel(1 , 3);     
       if(clipExist(screen, "C:\\Users\\Satish_D1\\workspace\\Sikuli Demo\\Images\\Roles\\UK\\ENTP\\GEDIS_SALES_SUPPORT_ORL_CPF2.0_UK_ENTP.PNG"))
       {
        screen.doubleClick("C:\\Users\\Satish_D1\\workspace\\Sikuli Demo\\Images\\Roles\\UK\\ENTP\\GEDIS_SALES_SUPPORT_ORL_CPF2.0_UK_ENTP.PNG",0);
        break;
       }
      }

【问题讨论】:

  • 您的问题/问题到底是什么?
  • 简单:我需要向下滚动屏幕以找到特定图像并单击图像。
  • 是的,但是是什么阻止你这样做呢?您的代码不起作用,或者您不知道如何做某事?
  • 我使用的上述代码没有按预期工作。首先它检查图像,由于图像不可用,它滚动页面,但预期的图像仍然不存在,但我的代码去并单击其他图像并继续这是错误的。
  • 您必须提供更多信息。如果您的脚本行为与您的预期不同,请说明原因。如果您遇到错误/异常,请将它们添加到您的问题中。除非您详细解释,否则无法回答您的问题。

标签: sikuli sikuli-script sikuli-ide


【解决方案1】:

图像识别默认使用 0.7 的相似度(参见description of Patterns in SikuliX Documentation)。这意味着 SikuliX 会寻找“非常相似”的图像。由于方法similar,您可以指定模式识别的相似性,或者在您的情况下使用方法exact。 在您的方法clipExist 中,您应该替换图像的名称:

    Match m = screen.exists(clip);

作者:

    Match m = screen.exists(Pattern(clip).exact())

【讨论】:

    【解决方案2】:

    SikuliX 1.1 似乎在查找屏幕上的文本时遇到了一些问题,但识别有效。您可能希望逐屏扫描整个文本屏幕并拆分行。接下来将每一行与所需的角色进行比较,并保存相似度。选择相似度最大的行。在 Python/Jython 中,difflib 模块中有一个特殊的函数。 similarity = difflib.SequenceMatcher(None, string_a, string_b)

    【讨论】:

    • Sikuli 中的文本识别目前普遍不可靠。所有版本都是如此。
    【解决方案3】:

    以下是您可以做的替代方案。

    第一种选择:捕获滚动条

    1. 捕获滚动条中的向下箭头
    2. 当您到达滚动条的末端时捕获图像。图片包含滚动进度和滚动条的向下箭头
    3. 点击向下箭头,直到找到 (2) 的图像

    此方法有一个缺点,即当项目数是动态的时,(2) 的视觉外观会有所不同,尤其是滚动进度。但是,这可以通过仅捕获滚动进度的下部和箭头来欺骗。请注意,您的鼠标可能会在(3)中遇到困难,因为当它被鼠标覆盖时,您可能找不到(2)。为了解决这个问题,每次单击向下箭头时,您可以在检查 (2) 之前将鼠标悬停一点。这是完整的脚本:

    down_arrow = "downarrow.png"
    complete_scroll = "completescroll.png"
    
    while not exists(complete_scroll):
        click(down_arrow)
        hover(Location(300, 200))
    

    第二种选择,使用键盘(向下键)

    单击要滚动的项目中的任意位置,并为您拥有的项目数输入一些类型(Key.DOWN)。如果您有动态的项目数,您可以为任何始终大于您的项目数的数字执行 type(Key.DOWN) 。这是要执行的脚本

    inside_item = "inside.png"
    
    for n in range(10000):
        type(Key.DOWN)
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      我使用“s”作为屏幕类引用。因此,一旦我们得到一张图片,我们就会设置相同的区域,然后是您想要点击的所需图片

      public static void main(String args[])
      {
          Match m = s.find("IMAGE");
          Region r = new Region(m.x+11, m.y+22,12,12);
          r.click(); 
          s.find("ENTPIMAGE.PNG");
          r.click("ENTPIMAGE.PNG");
      }  
      

      【讨论】:

        猜你喜欢
        • 2019-03-12
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-13
        相关资源
        最近更新 更多