Stack Overflow の広大な範囲をナビゲートしているときに、Selenium WebDriver を使用したファイル アップロードに関して多くの疑問が浮上しました。しかし、多くのソリューションは、数え切れないほどのユーザーを困惑させてきた特定のシナリオに対処できていません。
次の状況を考えてみましょう:
私は、次のように、sendKeys を使用してファイル パスを指定することを提案する回答を見つけました。以下:
<code class="java">WebElement fileInput = driver.findElement(By.name("uploadfile")); fileInput.sendKeys("C:/path/to/file.jpg");</code>
ただし、このアプローチではウィンドウ ハンドルがアクティブ化されないため、それ以上の操作は不可能になります。
Zamzar と Uploadify: 異なるアプローチ
Zamzar のような Web サイトの場合、前述のソリューションはシームレスに動作します。指定された入力フィールドにファイル パスを入力するだけで、アップロード プロセスは意図したとおりに進みます。
対照的に、Uploadify には、より困難な課題が提示されます。ファイル アップロード コンポーネントは Flash オブジェクトであり、WebDriver 互換の API がありません。これは、ファイル選択のために開く後続のウィンドウを直接制御できないことを意味します。
ブラインド タイピングをロボット クラスに依存する
カーソルが通常、 Flash 要素をクリックした後のファイル名入力フィールドでは、Robot クラスを使用して「ブラインド」入力戦略を採用できます。これには、以下に示すように、ファイル パスを入力するためのキーストロークをシミュレートする必要があります。
<code class="java">driver.findElement(By.id("SWFUpload_0")).click(); Robot r = new Robot(); r.keyPress(KeyEvent.VK_C); // C r.keyRelease(KeyEvent.VK_C); r.keyPress(KeyEvent.VK_COLON); // : (colon) r.keyRelease(KeyEvent.VK_COLON); r.keyPress(KeyEvent.VK_SLASH); // / (slash) r.keyRelease(KeyEvent.VK_SLASH); // etc. for the whole file path r.keyPress(KeyEvent.VK_ENTER); // confirm by pressing Enter in the end r.keyRelease(KeyEvent.VK_ENTER);</code>
Flash に対する型破りなアプローチ
最後の手段として、型破りな手法を検討できます。 Flash アプリケーションのソース コードの変更。 ExternalInterface を通じて内部メソッドを公開し、WebDriver からの JavaScript 呼び出しを利用することで、Flash アプリと間接的に対話できます。ただし、このアプローチには技術的な専門知識が必要であり、すべてのシナリオに適用できるわけではありません。
以上がSelenium WebDriver でファイル アップロードのジレンマに対処する方法: sendKeys が失敗する理由と代わりに何をすべきか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。