簡単な答え: HTML 要素に ID を追加します。
Web サイトが機能するためにこれらの属性は必要ありませんが、テスターの作業が非常に楽になります。
Knockout.js と Selenium を広範囲に使用する大規模な ASP.NET MVC 4 アプリケーションが作成されたプロジェクトで、まったく同じ問題が発生しました。フォーム要素については、ASP.NET MVC ユーティリティ メソッドを使用して、データ バインド式と組み合わせて出力 HTML を生成しました。ASP.NET MVC は、バッキング モデルに基づいて一意の NAME および ID 属性を自動的に生成します。
ただし、テーブルをレンダリングし、フォームまたはダイアログを表示する必要がある他のすべてのケースでは、これらの HTML 要素に ID 属性を追加することになりました。考えてみれば、これは要件の論理的な結果です。レイアウト (HTML) と動作 (JS) を結び付けるために ID と NAME が必要なくなるため、Knockout は素晴らしいです。ただし、Selenium などの他のフレームワークでは、これらの ID が存在する必要があります。
はい、複雑で肥大化した XPATH 式を使用して回避できます。しかし、これはテストの保守性を劇的に低下させます。私の経験では、ID を数百の HTML 要素に追加するのに 1 日もかからず、テスターの生産性が大幅に向上しました。
HTML をできるだけ少なくして、機能的な Web サイトを開発するのはよいことかもしれません。しかし、これによってウェブサイトがテストできなくなってしまうと、得るものよりも失うものが大きくなります。テスト容易性は機能要件ではありませんが、重要ではないという意味ではありません。