1

OSXのPythonスクリプト内でスクリーンショットを撮ることができる必要があります(これをタイトルとタグに入れることが十分に明確でなかった場合は、vncセッションの)。リモートシステムは、私が他の目的で使用しているvncサーバーをすでに実行しており、最終的には一般的なデスクトップオペレーティングシステムの全範囲をカバーするため、他のソリューションではなく、vncを引き続き使用したいと思います。

ヘッドレスで実行されるため、テストサーバーでvncウィンドウを開いていませんvncdotoolを使用してみましたが、シェルアウトする必要はありません。Twistedではリアクターを再起動できないため、制御フローを模倣しようとすると問題が発生しますが、実行したままにするとメインスレッドがブロックされます。リアクターを別のスレッドまたはプロセスで実行しようとすると問題が発生するようです...

誰かアイデアはありますか?

4

5 に答える 5

1

コメントを読んだ後、実際にやりたいことは、フラッシュゲームを実行しているリモートWebブラウザのスクリーンショットを撮ることだと思われます。

...そして、これらのリモートWebブラウザーをテストするためにSeleniumを使用しています。

...セレンにスクリーンショットを撮ってもらいませんか?

http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/TakesScreenshot.html

于 2012-06-26T12:05:18.680 に答える
1

セレンを使用してスクリーンショットを撮る、tangentStormの提案に基づいて構築します。これを試してみてください。開いてsrc/Selenium2Library/keywords/_screenshot.py24〜30行目を見てください。

     background leaking when the page layout is somehow broken.
     """
     path, link = self._get_screenshot_paths(filename)
     self._current_browser().save_screenshot(path)

     # Image is shown on its own row and thus prev row is closed on purpose
     self._html('</td></tr><tr><td colspan="3"><a href="%s">'

行を削除しself._current_browser().save_screenshot(path)、その場所に直接追加します

if hasattr(self._current_browser(), 'get_screenshot_as_file'):
    self._current_browser().get_screenshot_as_file(path)
else:
    self._current_browser().save_screenshot(path)

したがって、全体としては次のようになります。

    background leaking when the page layout is somehow broken.
    """
    path, link = self._get_screenshot_paths(filename)
if hasattr(self._current_browser(), 'get_screenshot_as_file'):
    self._current_browser().get_screenshot_as_file(path)
else:
    self._current_browser().save_screenshot(path)
    # Image is shown on its own row and thus prev row is closed on purpose
    self._html('</td></tr><tr><td colspan="3"><a href="%s">'

次に、セレンを使用してスクリーンショットを撮ってみてください。

参照:修正

于 2012-06-27T15:44:39.287 に答える
0

私はOSX用のPythonでこれを行うライブラリを知りません。

ただし、スクリーンショットを取得するには、他に少なくとも3つの方法があります。

  1. jythonのjava.awt.Robotクラスを使用します。(twistedを除いて、おそらくjythonでは実行されません。)
  2. AppleのScreenSnapshotの例をCythonに移植し、それをpythonモジュールにコンパイルします。(もちろん、Cでも同じことができますが、Cythonの方がはるかに楽しくなります。)
  3. サーバーをwin32に移動できる場合、またはパラレルを介してMacでwin32を実行できる場合は、PythonImagingLibraryのImageGrabモジュールを使用できます。

ただし、OSへのシェルアウトが依然として最も簡単な答えだと思います。すべてを単一のプロセスで実行しようとするのではなく、2つのプロセスを実行するだけです。メインのツイストプロセスと、スレッドなどを使用する他のサーバーです。

次に、スクリーンショットを撮りたいときにメッセージをやり取りします。これは、単純なソケット接続で行うことができます(ツイストサーバーに別のハンドラーを記述し、スクリーンショットサーバーをクライアントとして接続するだけです)...

私の場合、メッセージパッシングを処理するためにRabbitMQのようなAMQPサーバーを使用する可能性がありますが、それはあなたがしていることにはやり過ぎかもしれません。

于 2012-06-23T02:08:29.437 に答える
0

コードによっては、を使用して、ファイルパスまたはインスタンス(または必要なもの)deferToThreadへの呼び出しを実行して返すことができる場合があります。screencapturepil.Image

http://twistedmatrix.com/documents/current/core/howto/gendefer.html#auto5の例を使用すると、次のようになります...

from subprocess import call
import tempfile
from twisted.internet import reactor, threads
import Image ## pip install pil


## Blocking code that takes the screenshot and saves to file
def take_screenshot():
    tmp_file_path = tempfile.mktemp(suffix='.png')
    # os.system('screencapture %s' % tmp_file_path)
    retcode = call(['screencapture', tmp_file_path])
    if retcode < 0:
        img = Image.open(tmp_file_path)
        return img
    else:
        return None


## Callback fired by the deferToThread
def do_something_with_screenshot(img):
    print img.filename, img.format, img.size, img.mode
    reactor.stop() ## just here for this example


def run():
    # get our Deferred which will be called with the largeFibonnaciNumber result
    d = threads.deferToThread(take_screenshot)
    # add our callback to print it out
    d.addCallback(do_something_with_screenshot)


if __name__ == '__main__':
    run()
    reactor.run()
于 2012-06-24T11:20:28.483 に答える
0

おそらく、robotframeworkまたはSeleniumにCaptureScreenSensetalkコマンドをEggplantDriveに送信するように説得することができます。

TestPlantフォーラムの「スクリーンショットを撮る」の投稿では、このコマンドについて言及しています

于 2012-06-27T01:00:03.703 に答える