1

如何在 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

建议的解决方案是:

  1. 列表项在测试运行期间注入/添加模拟框架

  2. 使用 JavaScript Executor 模拟 Date 对象

  3. 设置时区

  4. 运行测试

4

0 回答 0