「表示」と「有効」の両方が表示されているが、実際には1つしか表示されていない場合に、2つの同一の要素を区別する
現在、ネイティブアプリのテストを自動化していますが、「ゴースト」要素に問題があります。「ゴースト要素」とは、コード内および技術的にはページ上にあるが、ユーザーには表示されない要素を意味します。
Androidを使用してテストしていますが、iOSでも問題が発生するかどうかわかりません。
簡単に言えば、要素Xをクリックしたいのですが、XとYが同じ仕様(同じテキスト、同じ要素タイプ/クラス)を共有しているため、ユーザーには表示されない要素Yをクリックすることになります。
「isDisplayed()」と「isEnabled()」を使用して要素Yを無視しようとしましたが、XとYの両方が表示されて有効になっているようです(実際にはXのみがユーザーに表示されます)。
一方がユーザーに表示され、もう一方が表示されないという事実を使用して、XとYを区別する方法はありますか?可能であれば、開発者にアプリのコードを変更するよう依頼したくありません。
それが役立つ場合は、アプリが「ゴースト要素」になってしまった方法は次のとおりです。
アプリはページ1を開き、ページ1には要素Yがあります
アプリはページ2、ページ2を開きますがページ1とは異なりますが、ページ1の要素Yと同じ要素Xがあります
現在は2ページにいますが、1ページは消えず、2ページの「後ろ」にあります。
私が見つかりました。これをしていることと同じ問題についてように見える人が、それを修正する方法についての解決策はありません。
PS:私はJavaを使用していますが、どの言語でも回答を受け付けます。
回答
UIには特定の階層があり、通常、オブジェクト階層には順序付けられた構造(XMLなど)があると思います。つまり、要素を追加するときは、ランダムな場所だけでなく、特定の場所にも追加します。通常、それは外側のコンテナの上部または下部のいずれかです。
したがって、次のような構造があると仮定します。
<app>
<page>
<element>bottom</element>
</page>
<page>
<element>top</element>
</page>
</app>
追加された新しいページが上部に追加されている場合は、次のコマンドでアクセスできます。 /app/page[1]/element
追加された新しいページが下部に追加されている場合は、次のコマンドでアクセスできます。 /app/page[last()]/element