ライブラリScreenshotのキーワードTake Screenshotで、log.htmlに画像が埋め込まれません

68 views
Skip to first unread message

小原増雄

unread,
Jun 5, 2016, 4:11:33 AM6/5/16
to Robot Framework 日本語ユーザグループ
私のRobot Framework環境は、Robot Frameworkをインストールして構築したものではなく、画面操作自動化ツールSikuliXにバンドルされたRobot Framework3.0を使っています。SikuliXのIDEで、Pythonのコードで以下のようなrobot.run()を呼び出して、Robot Frameworkを実行しています。(OSはWindows7です。)
robot.run(datasource, outputdir=wkdir)

【現象】
datasouceの中で、ライブラリScreenshotのキーワードTake Screenshotを呼び出しています。
スクリーンショット画像はwkdirに格納されているのですが、log.htmlの中にスクリーンショットの画像が組み込まれません。

robotのソースを追っていって、robot\output\librarylogger.pyの中の下記コードの部分が原因と判断しました。
if threading.currentThread().getName() in LOGGING_THREADS:
    LOGGER.log_message(Message(msg, level, html))

threading.currentThread().getName()はThread-nn(nnは数字)になっているのに対して、LOGGING_THREADS2つの値を持つリストで、値は'MainThread'と'RobotFrameworkTimeoutThread' の2つ。このためLOGGER.log_message(Message(msg, level, html))が実行されず、スクリーンショットの画像がlog.htmlに組み込まれない現象が発生していた。

【質問】
Pythonの説明書にもスレッド名はThread-nn(nnは数字)の形式と書いてあるので、librarylogger.pyで判定結果がTrueになるとは思えません。ライブラリScreenshotのキーワードTake Screenshotは有効なキーワードなのでしょうか?

Yasushi Masuda

unread,
Jun 5, 2016, 4:50:51 AM6/5/16
to Robot Framework 日本語ユーザグループ
小原さん

このキーワードは有効で、手元のWindows8 でも MacOS X でも、普通に pybot を動かすとスクリーンショットはログに表示されます。

小原さんの実行環境は Sikuli の下で python を動かしているようですので、 スクリーンショットの取得に割り当てられた実行スレッドに適切な名前のスレッドがなく、そのため write が呼ばれないのではないでしょうか。

librarylogger.write は、処理をしているのがメインスレッドの場合には threading.currentThread().getName() が MainThread を返すので、複数の子スレッドがログを書いてしまう対策として有効に働いています。


Yasushi Masuda

unread,
Jun 5, 2016, 5:09:18 AM6/5/16
to Robot Framework 日本語ユーザグループ
追伸。

手元に同じ環境がないので何ともなのですが、robot.run() を呼ぶ前に、以下のようにしてみてはいかがですか。

その1: Robot の実行スレッドを MainThread と名付ける

from threading import currentThread
currentThread().name = 'MainThread'


その2: 現在のスレッドをLOGGING_THREADSに追加する

from threading import curfrentThread
from robot.output import librarylogger 
librarylogger.LOGGING_THREADS = tuple(list(librarylogger.LOGGING_THREADS) + [currentThread().name])



小原増雄

unread,
Jun 5, 2016, 6:09:46 AM6/5/16
to Robot Framework 日本語ユーザグループ
Robot の実行スレッドを MainThread と名付ける方法でうまくいきました。
スレッドの名前は変更できるんですね、ありがとうございました。
Reply all
Reply to author
Forward
0 new messages