WebDriver click() と JavaScript click() の比較 質問する

WebDriver click() と JavaScript click() の比較 質問する

物語:

StackOverflow では、Selenium WebDriver の「クリック」コマンドで要素をクリックできないが、スクリプトを実行して JavaScript クリックで回避できるというユーザーの報告を見ました。

Python の例:

element = driver.find_element_by_id("myid")
driver.execute_script("arguments[0].click();", element)

WebDriverJS/Protractor の例:

var elm = $("#myid");
browser.executeScript("arguments[0].click();", elm.getWebElement());

質問:

通常の WebDriver クリックが機能しないのに、「JavaScript 経由」のクリックが機能するのはなぜですか? これは正確にはいつ発生し、この回避策の欠点は何ですか (ある場合)?

私は個人的に、なぜこの回避策を実行する必要があるのか​​、またそれがどのような問題を引き起こす可能性があるのか​​を完全に理解せずに、この回避策を使用しました。

ベストアンサー1

反対に、現在受け入れられている回答示唆されているように、WebDriver でクリックすることと JavaScript でクリックすることの違いに関しては、PhantomJS に特有のものは何もありません。

違い

2 つの方法の本質的な違いはすべてのブラウザに共通しており、非常に簡単に説明できます。

  • ウェブドライバー:WebDriver がクリックすると、実際のユーザーがブラウザを使用したときに何が起こるかをできる限りシミュレートしようとします。「クリックしてください」と書かれたボタンである要素Aと、div透明だがzIndexAを完全に覆うように寸法が設定されている要素Bがあるとします。次に、WebDriverにAをクリックするように指示します。WebDriverはクリックをシミュレートし、Bがクリックを受け取ります。初めなぜでしょうか? B が A をカバーしているため、ユーザーが A をクリックしようとすると、B が最初にイベントを取得します。A が最終的にクリック イベントを取得するかどうかは、B がイベントを処理する方法によって異なります。いずれにせよ、この場合の WebDriver の動作は、実際のユーザーが A をクリックしようとしたときと同じです。

  • JavaScript: ここで、JavaScript を使用して次の操作を実行するとしますA.click()このクリック方法では、ユーザーが A をクリックしようとしたときに実際に何が起こるかは再現されません。JavaScript はclickイベントを A に直接送信し、B はイベントを取得しません。

WebDriver クリックが機能しないのに、JavaScript クリックが機能するのはなぜですか?

上で述べたように、WebDriver は実際のユーザーがブラウザーを使用しているときに何が起こるかをできる限りシミュレートしようとします。実際のところ、DOM にはユーザーが操作できない要素が含まれている可能性があり、WebDriver ではこれらの要素をクリックできません。前述した重複するケースの他に、非表示の要素はクリックできないことも意味します。Stack Overflow の質問でよく見られるケースは、DOM にすでに存在するが、他の要素が操作されたときにのみ表示される GUI 要素を操作しようとしているというものです。これはドロップダウン メニューで時々発生します。メニュー項目を選択する前に、まずドロップダウンを表示するボタンをクリックする必要があります。メニューが表示される前に誰かがメニュー項目をクリックしようとすると、WebDriver は拒否し、要素を操作できないと表示します。その後、JavaScript を使用してこれを実行しようとすると、可視性に関係なくイベントが要素に直接配信されるため、機能します。

クリックに JavaScript を使用する必要があるのはいつですか?

Seleniumをアプリケーションのテストこの質問に対する私の答えは"ほとんどは決してない"。概して、Selenium テストはユーザーがブラウザで行う操作を再現する必要があります。ドロップダウン メニューを例にとると、テストではまずドロップダウンを表示するボタンをクリックし、次にメニュー項目をクリックします。ボタンが非表示になっている、またはボタンがメニュー項目を表示できないなどの理由で GUI に問題がある場合は、テストは失敗し、バグが検出されます。JavaScript を使用してクリックすると、自動テストでこれらのバグを検出できなくなります。

「ほとんどない」と言ったのは、JavaScript を使用する方が合理的である例外が存在する可能性があるからです。ただし、そのような例外は非常にまれです。

Seleniumをスクレイピングサイトであれば、ユーザーの動作を再現しようとすることはそれほど重要ではありません。したがって、JavaScript を使用して GUI をバイパスすることはそれほど問題ではありません。

おすすめ記事