注:「クリック」をエンドユーザーのクリックと呼びましょう。「jsクリック」はJS経由のクリックです
通常のWebDriverクリックが機能しないのに「JavaScript経由」をクリックすると機能するのはなぜですか?
これが発生するケースは2つあります。
I. PhamtomJSを使用している場合
次に、これはの最も一般的な既知の動作ですPhantomJS
。たとえば、一部の要素はクリックできないことがあり<div>
ます。これはPhantomJS
、ブラウザのエンジンをシミュレートするために最初に作成されたためです(最初のHTML + CSS->計算CSS->レンダリングなど)。ただし、エンドユーザーの方法(表示、クリック、ドラッグ)として操作されるわけではありません。したがってPhamtomJS
、エンドユーザーとのやり取りでは部分的にしかサポートされません。
JS CLICKが機能する理由 どちらのクリックについても、それらはすべて平均クリックです。これは、と銃のようなものである1バレルと2つのトリガー。1つはビューポートから、もう1つはJSから。PhamtomJS
ブラウザのエンジンのシミュレーションに優れているため、JSクリックは完全に機能するはずです。
II。「クリック」のイベントハンドラが悪い時期にバインドするようになりました。
たとえば、 <div>
同じ結果になる可能性があります。クリックイベントハンドラーがないときにWebdriverJSが要素をクリックしようとするため、クリックは機能しません。
JS CLICKが機能する理由 Jsクリックは、ブラウザーにjsを直接挿入するようなものです。2つの方法で可能
フィストはdevtoolsコンソールを介して行われます(はい、WebdriverJSはdevtoolsのコンソールと通信します)。
2つ目は、<script>
タグを直接HTMLに挿入することです。
ブラウザごとに、動作は異なります。しかし、とにかく、これらの方法はボタンをクリックするよりも複雑です。クリックはすでに存在するものを使用しており(エンドユーザーのクリック)、jsクリックはバックドアを通過します。
そしてjsの場合、クリックは非同期タスクのように見えます。これは、「ブラウザ非同期タスクとCPUタスクスケジューリング」のちょっと複雑なトピックに関連しています(しばらく読んでから、記事を再度見つけることはできません)。要するに、jsクリックはCPUのタスクスケジューリングのサイクルを待つ必要があり、クリックイベントのバインド後は少し遅く実行されるため、これは主に結果として生じます。
(要素がクリック可能な場合とそうでない場合がある場合、このケースを知ることができます。)
正確にこれが起こっているのはいつですか、そしてこの回避策(もしあれば)の欠点は何ですか?
=>上記のように、どちらも1つの目的を意味しますが、どの入口を使用するかについてです。
- クリック:ブラウザのデフォルトで提供されているものを使用しています。
- JSクリック:バックドアを通過しています。
=>パフォーマンスに関しては、ブラウザーに依存しているため、言うのは難しいです。しかし、一般的に:
- クリック:CPU実行タスクのスケジュールリストでより高速ではなく、より高い位置にのみ署名することを意味します。
- JSクリック:遅いという意味ではなく、CPUタスクのスケジュールリストの最後の位置にサインインしただけです。
=>欠点:
- クリック:PhamtomJSを使用している場合を除き、マイナス面はないようです。
- JSクリック:健康に非常に悪い。ビューにないものを誤ってクリックする可能性があります。これを使用するときは、要素がそこにあり、エンドユーザーの視点として表示およびクリックできることを確認してください。
PSはあなたが解決策を探しているなら。
- PhantomJSを使用していますか?代わりにChromeヘッドレスを使用することをお勧めします。はい、UbuntuでChromeをヘッドレスに設定できます。ThingはChromeと同じように実行されますが、PhantomJSのようにビューがなくバグが少ないだけです。
- PhamtomJSを使用していませんが、それでも問題がありますか?分度器のExpectedConditionを使用することをお勧めします
browser.wait()
(詳細はこれを確認してください)
(短くしたいのですが、結局ひどいです。理論に関連するものはすべて説明が複雑です...)