Python中的Webdriver - 从外部脚本执行函数

时间:2014-12-10 20:56:18

标签: javascript python selenium sinon timecop

如何在python中使用webdriver执行位于外部JavaScript中的函数?

JavaScript用于覆盖JavaScripts内部DateTime对象以提供 改变浏览器时间进行单元测试 我喜欢将sinonfaketimers.js用于此目的。 (但也会选择替代品 像TimeShift.js) 链接:http://sinonjs.org/docs/#clockhttps://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:消息:未定义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

草拟的提议解决方案是:

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

  2. 使用JavaScript执行程序

  3. 模拟Date对象
  4. 设置时区

  5. 运行测试

0 个答案:

没有答案