0

Chrome.fileSystem.chooseEntry APIを使用してディレクトリを選択するChromeアプリケーションをテストするためのSeleniumスクリプトを作成しています。これを手動で行うとうまく動作します。私はセレンのスクリプトでこれを行うときには、私は戻って、このエラーを取得する:selenium + chrome.fileSystem.chooseEntry =無効な呼び出しページエラー

Unchecked runtime.lastError while running fileSystem.chooseEntry: Invalid calling page. This function can't be called from a background page.

セレン及びchooseEntryがうまく一緒に遊ぶようにする方法上の任意のアイデア?

最新のChromedriverに更新されましたが、運がまだありません。私もChromeOptionsを見ましたが、役に立つと思われるものは見られませんでした。 SeleniumとchooseEntryについて、インターウェブにはあまり言わないようです。私はChromeのバージョン51を使用しています。

私は、chooseEntryを使用する代わりに、テストのパス値を設定するために特別なjavascriptエントリポイントが必要になると思っています。しかし、テスト用に別々のコード実行パスを持たないことを強く望みます。誰もよりクリーンなソリューションを持っていますか?

EDITは:

chrome.fileSystem.chooseEntry({type:'openDirectory'},function(entry) { 
    chrome.fileSystem.getWritableEntry(entry,function(writeable_entry) { 
     console.log("got writeable entry"); 
    }); 
}, function(e) { errorHandler(e); }); 

EDIT#2:私は、特別なjavascriptのエントリポイントハックを行ってきたコメント投稿者の要求ごとに、ここに問題のあるコードです。 Manualモード(つまり、Seleniumで実行していないモード)では、chooseEntryを実行するコードを実行してから、retainEntry APIを使用してエントリIDを取得します。私はエントリIDを取得し、それをエントリに戻すためにrestoreEntry APIを呼び出すために、私のjavascriptにエントリポイントを追加しました。私は自分のコードを変更して、このエントリオブジェクトが設定されている場合は、chooseEntryを呼び出す代わりにファイルとして使用します。最後に、残りのスクリプトを実行する前に、restoreEntryエントリポイントを呼び出すようにSeleniumスクリプトを修正しました。

これは理想的ではありません。私のテストコードの実行パスは、私の実際の人間が実際にコントロールしているコードの実行パスとは多少異なるからです。しかし、少なくとも今はSeleniumスクリプトを使うことができます。もちろん、誰もがこの解決策を解決するための無頓着な方法を考えることができるなら、私はそれについて聞いてみたいと思います。

EDIT#3:Per Xanのコメントで、「拡張」から「Chromeアプリケーション」への用語を修正しました。

+0

コードの一部を提供できますか? – user2272115

+0

'chrome.fileSystem' **は拡張APIではありません**、Chromeアプリケーションでのみ使用できます。あなたは何を書いていますか? – Xan

+0

おっと、あなたは100%正しいです。私は、正しい用語を使用するために投稿を更新しました。これを指摘してくれてありがとう。 – codemonkey

答えて

0

私はこの恐ろしいハックしか提供できません。 OSXのChromeアプリケーションでは、フォルダのお気に入りを作成し、RobotのkeyPressを使用して、アプリケーションに必要な「お気に入り」のフォルダを選択して選択します。唯一可能な救済要因は、ファイルインターフェイスとの有効な/可能な実際の人間の対話を反映していることです。

private void selectOSXFolderFavorite(int favorite) { 

    // With an OSX file folder dialog open, Shift-Tab to favorites list 
    robot.keyPress(KeyEvent.VK_SHIFT); 
    robot.keyPress(KeyEvent.VK_TAB); 
    robot.keyRelease(KeyEvent.VK_TAB); 
    robot.keyRelease(KeyEvent.VK_SHIFT); 

    // move to the top of favorites list 
    int i = 40; 
    while (i-- > 0) { 
     robot.keyPress(KeyEvent.VK_UP); 
     robot.keyRelease(KeyEvent.VK_UP); 
    } 
    while (favorite-- > 0) { 
     robot.keyPress(KeyEvent.VK_DOWN); 
     robot.keyRelease(KeyEvent.VK_DOWN); 
    } 

    // Send an enter key to Select the selected folder 
    robot.keyPress(KeyEvent.VK_ENTER); 
    robot.keyRelease(KeyEvent.VK_ENTER); 
} 
+0

こんにちは恥ずかしい:)コードスニペットありがとう。残念ながら、ChromeのFileEntryオブジェクトまたはDirectoryEntryオブジェクトの1つが後で作業する必要があります。つまり、chooseEntry APIを使用して送り先を選択し、Entryオブジェクトを作成する必要があります。セレンの下で実行しているときにエラーをスローするchooseEntryです。 – codemonkey

関連する問題