如何在 python 中使用 webdriver 执行位于外部 JavaScript 中的函数?
JavaScript 用于覆盖 JavaScript 的内部 DateTime 对象,以便为单元测试提供更改的浏览器时间。为此,我喜欢使用 sinonfaketimers.js。(但也可以使用 TimeShift.js 等替代方案)链接:http ://sinonjs.org/docs/#clock ,https ://github.com/plaa/TimeShift-js
所以我编写了以下 python 代码,它调用 JavaScript 本身而不是相应的函数:
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: Message: sinon is not defined
完整追溯:
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 对象
设置时区
运行测试