2017-09-26 8 views
2

Apache PDFBoxを使用してテキストを読み込み、テストスイートの一部として検証できるように、私のローカルに.pdfをダウンロードしようとしています。私は既にFirefoxからpdfをダウンロードするためのコードをURLを使って見つけました。私が作業しているPDFは機密文書であるため、URLで公開されるのではなく、代わりにPDFビューア内にポップアップウィンドウとして読み込まれます。ブラウザにPDFビューアをロードした後、誰かがFirefoxのPDFビューア内のダウンロードボタンを押す方法を知っていますか?それは要素を見つけることができないと言うと残念ながら、これは動作しませんSelenium WebDriver with Firefoxをダウンロードする

(new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("download"))); 
driver.findElement(By.id("download")).click(); 

enter image description here

私は「ダウンロード」=要素のidでそれを見て試してみました。誰でも回避策を知っていますか?

更新:私が説明したポップアップウィンドウはiframe要素でした。これにより、「ダウンロード」要素を見つけることができなくなった。 @ 4M01のswitchTo()答えで修正されました。

答えて

1

あなたが述べたように、

ではなく、あなたがドライバオブジェクトのswitchTo()方法を使用して、異なるウィンドウ間の切り替え処理する必要がポップアップウィンドウ

としてPDFビューアの中にロードされました。

以下のコードは問題なく問題なく動作し、ダウンロードアイコンをクリックすることができます。

public class FirefoxPDFTest { 
     WebDriver driver; 

    @BeforeClass 
    void Setup(){ 
     System.setProperty("webdriver.gecko.driver", "C:\\Automation\\Selenium\\drivers\\geckodriver.exe"); 
     driver = new FirefoxDriver(); 
     driver.manage().window().maximize(); 
    } 

    @Test 
    void downloadPDF(){ 
     driver.get("http://www.pdf995.com/samples/pdf.pdf"); 
     waitTillPageLoad(); 
     driver.findElement(By.id("download")).click(); 
    } 



    private void waitTillPageLoad(){ 
     new WebDriverWait(driver, 30).until(driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete")); 
    } 


    @AfterClass 
    void tearDown(){ 
     driver.close(); 
     driver.quit(); 
    } 

} 
+0

私はあなたの場合、最初にポップアップブラウザにスイッチ()してから、Firefoxブラウザにあるダウンロードアイコンをクリックしなければならないことを理解しました。それをしても、すぐにPDFがダウンロードされることはありません。あなたは、PDFを直接ダウンロードするのに役立ついくつかの設定をしなければなりません。これらの設定は@zsbappaによって言及されています。 – Amol

+0

また、要素が見つからないため、Seleniumは例外をスローしていました。実際に要素*を見つけるのに挑戦はありませんが、あなたの機密文書が開かれたポップアップウィンドウに切り替えていません。 – Amol

+1

申し訳ありませんが、私が気づいたときに私のコメントを削除しました。あなたの答えは私の問題を解決しました!私は、ファイルを保存したり開いたりするかどうかを尋ねた後、OKボタンを押すロボットを作成しましたが、それは魅力的でした。その後もswitchTo.defaultContent()を必ず実行していなければなりません。私は、 "browser.helperApps.neverAsk.saveToDisk"の設定を変更してロボットを作成する必要はないと思います。 –

1

だけダウンロードボタンをクリックするために、次のコードを使用します。

driver.findElement(By.xpath("//button[@id='download']")).click(); 

    Thread.sleep(8000); 

    Robot robot = new Robot(); 

    robot.keyPress(KeyEvent.VK_ENTER); 
    robot.keyRelease(KeyEvent.VK_ENTER); 
+0

残念ながら、あなたが示唆しているように、それはfindElementを直接見つけることができません。理由は、それがiframeの中にあったため、 "download"要素(idまたはxpathによる)が見つからないからです。 Driver.switchTo().frame( "nameOfMyFrame")を実行した後、driver.switchTo()。defaultContent()を実行する必要がありました。だから私の場合、このfindElement戦略はうまくいきません。ロボットのものはうまく働いていましたが! –

1

我々はwebdriverをを使用してFirefoxブラウザの設定とFirefoxのプロファイル設定を使用してFirefoxブラウザでのダウンロードのポップアップを処理することができます。

ステップ1:Firefoxブラウザで設定を更新します。

Firefoxブラウザを開き、[ツール] - > [オプション]に移動します。 [アプリケーション]にナビゲートします。 アクションタイプをPDFの[ファイルを保存]に設定します。

ステップ2:FirefoxProfile

File downloadsDir = new File(""); 

// Set Preferences for FirefoxProfile. 
FirefoxProfile profile = new FirefoxProfile(); 
profile.setPreference("browser.download.folderList", 2); 
profile.setPreference("browser.download.dir", downloadsDir.getAbsolutePath()); 
profile.setPreference("browser.download.manager.alertOnEXEOpen", false); 
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", 
     "application/msword, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream"); 
profile.setPreference("browser.download.manager.showWhenStarting", false); 
profile.setPreference("browser.download.manager.focusWhenStarting", false); 
profile.setPreference("browser.download.useDownloadDir", true); 
profile.setPreference("browser.helperApps.alwaysAsk.force", false); 
profile.setPreference("browser.download.manager.alertOnEXEOpen", false); 
profile.setPreference("browser.download.manager.closeWhenDone", true); 
profile.setPreference("browser.download.manager.showAlertOnComplete", false); 
profile.setPreference("browser.download.manager.useWindow", false); 
profile.setPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false); 
profile.setPreference("pdfjs.disabled", true); 

// Initialize the FireFoxDriver instance. 
FirefoxDriver webDriver = new FirefoxDriver(profile); 

ステップ3使用してFireFoxDriverを初期化します。ダウンロードのPDFアイコンをクリックしたスクリプトを実行スクリプト

を実行します。

結果:PDFファイルがダウンロードされ、ダウンロードポップアップは表示されません。

+0

ステップ1では、手動ではなくJavaコード内で自動的にこれを達成しようとしています。これは可能ですか?私の[research](https://stackoverflow.com/questions/12146403/disable-firefox-save-as-dialog-selenium)は、あなたの "browser.helperApps.neverAsk.saveToDisk" setPreferenceメソッドでこれを変更できるはずだと言っていますこれはうまくいきません。 –

+0

コードを適用して手動で設定する必要がないことを願っています。 – zsbappa

+0

助けがあれば回答を受け入れるのを忘れないでください。 – zsbappa

関連する問題