2017-11-21 42 views
0

sikuliを使用している問題に直面しています。sikuliを使用して複数回使用される特定のドロップダウンアイテムをクリックしてください

添付のツールバーの画像では、同じドロップダウンメニューが3回異なる目的で使用されています。 sikuliを使用して、2番目のドロップダウンメニューをクリックします。

私は以下のコードを使用していますが、問題はコードを実行中に、最初のドロップダウンをクリックするだけです。

私のコードは次のとおりです。

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); 

enter image description here

enter image description here

任意の提案がどのようにこれを行うには?

ありがとうございました

答えて

1

、ベストプラクティスは、ピボットとして、周囲の要素を使用することです。あなたの場合、あなたがクリックしたい要素の同じ領域に別の一意の要素を持っていることが分かっているならば、その一意の要素を見つけてから、その固有の要素の周りで実際に必要な要素を検索することができます。

たとえば、あなたの場合、必要なドロップダウンメニューボタンのすぐ隣に青い下向き矢印があります。

ここ
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)を含めるだけで、正しい要素が実際に配置されていることを強調していますが、それを削除して、見つかった要素で何でもしてください。

+0

私はこれを試み、あなたに知らせるでしょう。 –

+0

はい、これは機能し、これは複数の同じタイプのアイテムを選択するための最良のソリューションです。 –

+0

あなたはgrow(50)についていくつかの詳細を追加できますか?これはbigBlueArrowPatternアイテムから50ピクセル左に見えるようなものですか? –

0

まず、その要素のアクセシビリティIDが必要です。その要素にAI(アクセシビリティID)がある場合その後、要素を繰り返し処理して、目的のインデックスにアクセスできます。

WindowsでAIを取得するには、Inspect(miscrosoftのAiツール)を使用できます.In 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; 
     } 
    } 
+0

もう一度質問をお読みください。 OPはAppiumではなくSikuliを使用しています。アクセシビリティIDはここでは役に立たない。 –

+0

もし彼が彼のプロジェクトの中で余分なツールを追加することができれば、それは彼にとってもっと役に立つかもしれません。 –

0

あなたは作り付けのfindAllとgetlastMatchesメソッドを使用して、あなたがしたいものをクリックすることができます。複数の同様のパターンを有するシナリオで

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

+0

あなたはそれをより明確にしてくださいできますか?私は言ったことを理解していない。 –

+0

基本的には、findAllメソッドを使用してすべてのドロップダウンを配列変数に格納し、それに応じて作業することができます。 – anish

+0

Iterator it = screen.findAll(AppConstant.IMAGE_DIR + "dropdown.png"); \t int i = 0; while(it。it。 \thasNext()){ \t \tのI ++。 。 \t(I == 2){ \t \t it.next()場合)(クリックしてください。 \t} \tのSystem.out.println(「********************* "+ I +" ************* ** ");これは同じことをやっている \t} –