0

我一直在与SikuliX合作尝试一些 ATDD。当只有使用它时,该代码运行良好。然而,将下面的代码转移给其他人只会适得其反,不管我对代码的评论有多好。

int numOfTries;
while (!isFinishStage && numOfTries != 3) {
                numOfTries++;
                try {
                    temp = new Pattern("imgs/img1.png").similar(0.9f);
                    s.wait(temp, 1);
                    s.find(temp);
                    s.hover(temp);
                    isFinishStage = true;
                    break;
                }catch (FindFailed ff1) {
                    try {
                    temp = new Pattern("imgs/img2").similar(0.5f);
                    s.wait(temp, 1);
                    s.find(temp);
                    s.hover(temp);
                    isFinishStage = true;
                    break;
                } catch (FindFailed ff2) {
             try{
                    temp = new Pattern("imgs/img3");
                    s.wait(temp, 1);
                    s.find(temp);
                    s.click(temp);
                } catch (FindFailed ff3) {
                    continue;
             }
        }
    }
}

FindFailed一旦图案/图像无法与屏幕上的任何内容匹配(相似性只是调整容差级别),就会引发异常。对于它正在自动化的当前 GUI,有三种可能的场景(这段代码发挥作用的地方)

  1. 屏幕 A 弹出
  2. 屏幕 B 弹出
  3. 1 或 2 都不是,而是弹出“下一个”

因此我们检查Screen A,如果没有,我们检查Screen B,如果没有,我们检查Next,如果没有,重复循环直到我们超过尝试次数——意味着测试失败。

以 Sikuli 的工作方式或至少我一直在解释它的方式,您将不得不通过多个try-catch语句执行各种循环,这似乎有点不妥。

PS:上述代码背后的想法是让它工作。如果有任何歧义,请告诉我,以便我澄清。

4

3 回答 3

1

我希望你在讲座后阅读软件原理并让你的代码变得干净:

10 条面向对象的设计原则

在此之后,您应该了解 DRY 和 KISS 原则等基础知识,这些原则应该很好地体现在您发布的代码中。

于 2015-07-14T14:08:09.047 回答
1

就是这样:

String [] patterns = {
    "imgs/img1",
    "imgs/img2",
    "imgs/img3"
};

float [] similarities = {
    0.9f,
    0.5f,
    0.1f
};

for(int i=0; i<patterns.length; i++) {
    String str = patterns[i];
    try {     
        float sim = 0.1; // default
        try {
            sim = similarities[i];
        } catch (IndexOutofBoundsException e) {;}     
        temp = new Pattern(str).similar(sim);
        s.wait(temp, 1);
        s.find(temp);
        s.hover(temp);
        if(i != patterns.length - 1){ // Different last case
            isFinishStage = true;
            break;
        }
    } catch (FindFailed ff) {
        continue;
    }
}
于 2015-07-14T14:14:40.630 回答
1

以下代码(我认为)等同于您的代码:

int numOfTries;
while (!isFinishStage && numOfTries < 3) {
    numOfTries++;
    if (tryPattern(s, "imgs/img1.png", 0.9f) ||
        tryPattern(s, "imgs/img2", 0.5f)) {
        isFinishStage = true;
    } else {
        // Note that the third "attempt" is inconsistent with
        // the others because you don't set isFinishedStage.
        tryPattern(s, "imgs/img3", 1.0f)
    }
}

private boolean tryPattern(SomeClass s, String path, float similarity) {
    try {
        Pattern temp = new Pattern(path);
        if (similarity != 1.0f) {
            temp = temp.similar(similarity);
        }
        s.wait(temp, 1);
        s.find(temp);
        s.hover(temp);
        return true;
    } catch (FindFailed ff) {
        return false;
    }
}
于 2015-07-14T14:22:43.423 回答