Pythonでwebdriverを使用して外部JavaScriptにある関数を実行するにはどうすればよいですか?
JavaScript は、JavaScript の内部 DateTime オブジェクトを上書きして、単体テスト用に変更されたブラウザー時間を与えるために使用されます。私はこの目的のために sinonfaketimers.js を使用するのが好きです。(ただし、TimeShift.js などの代替手段も使用できます) リンク: http://sinonjs.org/docs/#clock、https://github.com/plaa/TimeShift-js
そこで、JavaScript 自体を呼び出しますが、それぞれの関数を呼び出す次の Python コードを作成しました。
driver = webdriver.Firefox()
driver.get("http://google.com")
driver.execute_script(open("./sinon_timers.js").read())
# some code here to test shift in time
driver.quit()
この問題を正しく理解している限り、これを機能させるために必要なことは、それぞれの JavaScript 関数を正しい引数で実行することだけです。次のような適切な文字列を作成することで、引数を渡すことができると思います。
driver.execute_script("function('" + argument_var + "');")
JavaScript sinon_timers.js 内の実際の関数は次のとおりです。
sinon.timers = {
setTimeout: setTimeout,
clearTimeout: clearTimeout,
setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
setInterval: setInterval,
clearInterval: clearInterval,
Date: Date
};
完全なスクリプトは、sinonjs.org にあります。
http://sinonjs.org/releases/sinon-timers-1.12.1.js
しかし、sinon_timers.js で関数 sinon.timers を呼び出す構文についてはよくわかりません。それ、どうやったら出来るの?
アップデート:
Sainath Motlakunta さんが解決策を提案しました。残念ながら、うまくいきません。しかし、パズルを解く一歩手前にいるのかもしれません:
driver = webdriver.Firefox()
driver.get("https://duckduckgo.com")
driver.execute_script(open("./sinon_timers.js").read()) # <- is this line important?
driver.execute_script("var clock = sinon.useFakeTimers(12345);")
driver.quit()
selenium.common.exceptions.WebDriverException: メッセージ: sinon が定義されていません
完全なトレースバック:
Traceback (most recent call last):
File "/path/sinonJS_test.py", line 47, in <module>
sinon_test()
File "/path/sinonJS_test.py", line 37, in sinon_test
driver.execute_script("var clock = sinon.useFakeTimers(12345);")
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 401, in execute_script
{'script': script, 'args':converted_args})['value']
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 173, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 166, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: sinon is not defined
この投稿には、まったく同じ質問をする有用な情報があるでしょうか?: https://sqa.stackexchange.com/questions/8838/faking-system-time-date-with-selenium-webdriver
スケッチされた提案されたソリューションは次のとおりです。
テスト実行中にモッキング フレームワークをリスト アイテムに挿入/追加する
JavaScript Executor を使用して Date オブジェクトをモックする
タイムゾーンを設定する
テストを実行する