2009-05-03 13 views
9

私はセレンのサーバー&のpythonクライアントを使ってウェブサイトから画像を保存しようとしています。 私は画像のURLを知っていますが、ドキュメント自体であるとき、または現在のブラウザセッションに埋め込まれているときに、保存するコードを見つけることができません。セレンとファイアフォックスで画像を保存

私が今までに見つけた回避策は、ページのスクリーンショットを保存することです(これを行うための2つのセレンメソッドがあります)が、元のイメージが必要です。

私はメニューのオプションなどをクリックして気にしませんが、私はどのように見つけられませんでした。

おかげ

+0

それは長いですが、私は解決策を見つけましたか? – johnjohn

+0

いいえ、私は.. –

+0

私はこれのための解決策を持っています。私はSeleniumのuserscript.jsを拡張しました。 userpref.jsでスクリーンショットをキャプチャするFirefoxの権利を拡張し、Scott Szretterと同様のものを使用して画面をキャプチャし、画像データをサーバに送信しました。 – powtac

答えて

-1

どのようにページのスクリーンショットを取った後、画像URLに行くとは? Firefoxは画像をフルスクリーンで表示します。私はセレンを使用していない

+0

これは私の現在の回避策です。 –

0

...この情報がお役に立てば幸いですが、あなたはちょうどない理由画像のURL、知っている場合:

from urllib import urlretrieve 

urlretrieve(url, filename) 

ファイル名にURLを保存します。あなたが望むこの方法行うには 詳細

+4

イメージの保存はセッションによって異なります。最初のセレンの理由は、実際の環境でのテストです。 サーバーは実際にURLを取得しますが、配信する画像を決定する前に、セッションに関連する環境変数の多くを解析します。 –

+0

それから、セレンからクッキーを入手し、urllib2を使ってリクエストに渡すこともできますか? –

+3

セッションは単なるクッキー以上のものであり、urrlib2を模倣することはSelenium RCを模倣することを意味します。なぜ、私は最初にセレンを使用しますか? –

3

here(実際にコンテンツを取り込むためには、ブラウザに送られた)あなたはSelenium RCののプロキシコードを(ProxyHandler.javaを参照)を変更する必要があり、上にローカルにファイルを保存したいですディスクを並行して実行し、応答をブラウザに送り返します。

+0

それは...面白いです。しかし、それはすべてのファイルを保存するでしょう、そして、私は少しのJavaを学ぶことは言うまでもなく、どのファイルがどの時点に属しているのかを推測しなければなりません。しかし、それは可能な解決策です。 –

2

私は同じタスクを達成しようとしていましたが、私が撮ったかった画像は私のモニター(壁紙)のサイズでした。キャプチャスクリーンショットの回避策は私のためには機能しませんでした。私はそれをする方法を考え出しました...

私はセレクトして、私が望むページに行くようにしました。(これはすべてのセッションに役立ちます) 次に、 "Workspace Macro"というプログラムを使ってループしましたセレンの仕事を通して。

http://www.tethyssolutions.com/product.htm - 彼らは試し版を持っています。これは30回実行すると思っています。

だから、ここで進行です:

  • スタートFirefoxの
  • オープンセレンおよび負荷テストケース
  • はそれを開始するが、すぐにそれを一時停止します。
  • 記録セレンの「ステップ」を押し、マクロは、その後、Firefoxのウィンドウにオーバーになり、クリックするファイル - >保存し、その後、
  • マクロx回実行記録を停止する、と...ページを保存
  • 利益??次に、例えばbase64エンコードすることができる -

乾杯

5

私はデータに変換し、次いで、キャンバスに画像を置くコードを発見しました。私の考えは、セレンのevalコマンドを使用してこれを呼び出すことでしたが、私のテストではtoDataURLはセキュリティエラー1000を投げています。そのエラーがなければ解決策に近いと思われます。

var data, canvas, ctx; 
var img = new Image(); 
img = document.getElementById("yourimageID"); 
canvas = document.createElement('canvas'); 
canvas.width = img.width; 
canvas.height = img.height; 
ctx = canvas.getContext("2d"); 
ctx.drawImage(img, 0, 0); // everything works up to here 
data = canvas.toDataURL(); // this fails *** 
var base64Img = data.replace(/^data:image\/(png|jpg);base64,/, ""); 

いくつかの調査を行っていますが、画像が別のドメインからのものである場合、toDataURLを使用することはできません。しかし、私はページを保存してこのコードを試してみても、画像そのものとこのスクリプト以外のすべてを取り除いていました。例えば

(index.htmlを):

<html><head></head><body> 
<img src="local/hard/disk/img.jpg" id="yourimageID"> 
<script> 
// script from above 
</script> 
</body></html> 

img.jpgとのindex.htmlはまだセキュリティエラー1000年を取得し、ローカルにFirefoxでページを開いて、ローカルに保存されます!

+0

本当に素晴らしいアイデアです!セキュリティブロックをバイパスする方法を見つけましたか? – johnjohn