「表示」と「有効」の両方が表示されているが、実際には1つしか表示されていない場合に、2つの同一の要素を区別する

Aug 21 2020

現在、ネイティブアプリのテストを自動化していますが、「ゴースト」要素に問題があります。「ゴースト要素」とは、コード内および技術的にはページ上にあるが、ユーザーには表示されない要素を意味します。

Androidを使用してテストしていますが、iOSでも問題が発生するかどうかわかりません。

簡単に言えば、要素Xをクリックしたいのですが、XとYが同じ仕様(同じテキスト、同じ要素タイプ/クラス)を共有しているため、ユーザーには表示されない要素Yクリックすることになります

「isDisplayed()」と「isEnabled()」を使用して要素Yを無視しようとしましたが、XとYの両方が表示されて有効になっているようです(実際にはXのみがユーザーに表示されます)。

一方がユーザーに表示され、もう一方が表示されないという事実を使用して、XとYを区別する方法はありますか?可能であれば、開発者にアプリのコードを変更するよう依頼したくありません。

それが役立つ場合は、アプリが「ゴースト要素」になってしまった方法は次のとおりです。

  1. アプリはページ1を開き、ページ1には要素Yがあります

  2. アプリはページ2、ページ2を開きますがページ1とは異なりますが、ページ1の要素Yと同じ要素Xがあります

  3. 現在は2ページにいますが、1ページは消えず、2ページの「後ろ」にあります。

私が見つかりました。これをしていることと同じ問題についてように見える人が、それを修正する方法についての解決策はありません。


PS:私はJavaを使用していますが、どの言語でも回答を受け付けます。

回答

1 AlexeyR. Aug 21 2020 at 20:37

UIには特定の階層があり、通常、オブジェクト階層には順序付けられた構造(XMLなど)があると思います。つまり、要素を追加するときは、ランダムな場所だけでなく、特定の場所にも追加します。通常、それは外側のコンテナの上部または下部のいずれかです。

したがって、次のような構造があると仮定します。

<app>
  <page>
    <element>bottom</element>
  </page>  
  <page>
    <element>top</element>
  </page>  
</app>

追加された新しいページが上部に追加されている場合は、次のコマンドでアクセスできます。 /app/page[1]/element

追加された新しいページが下部に追加されている場合は、次のコマンドでアクセスできます。 /app/page[last()]/element