7

I like to run Webdriver tests with altered time and time zone. I see two approaches ahead:

1) Using a mocking library like SinonJS or TimeShift.js.

2) Using system libraries like libfaketime/faketime.

While the former might be "cleaner" I also doubt it is usable at all with webdriver, as I do not see a way to actually inject a mocked DateTime object into a webdriver test. (In my understanding just creating a mocked DateTime Object from a JavaScript file would not alter the real -global- one still allowing the browser to access the real JavaScript DateTime routine.

About the latter approach I am not sure either, whether one could limit the system-wide fake time to JavaScript processes only to not mess up things like time stamps in logs or server synchronization. Further I did not found any way to change the time zone in the respective documentation.

Can anybody share their experience with mocking browser time in Selenium tests? Is there any good solution to what I am looking for? Can you in that case sketch the implementation steps?

Links: http://sinonjs.org/ https://github.com/plaa/TimeShift-js

1

In Selenium features the server and client are running in separate processes. Therefore when mocking time with a tool like Timecop, the browser controlled by Selenium will still see the unmocked system time.

Simple case: Synchronizing the client’s time with the mocked server’s time

= render "layouts/sinon" # the card attached partial Advanced case Synchronizing the client’s time with the mocked server’s time

Include this partial in your layout and the Selenium browser will automatically be synchronized to a time mocked with Timecop:

  • if defined?(Timecop) && Timecop.top_stack_item
    • unix_millis = (Time.now.to_f * 1000.0).to_i
    • if defined?(MOCKED_CLIENT_TIME_OFFSET) && MOCKED_CLIENT_TIME_OFFSET
    • unix_millis = ((Time.now + MOCKED_CLIENT_TIME_OFFSET.hours).to_f * 1000.0).to_i :javascript sinon.useFakeTimers(#{unix_millis}); Transposing the client’s time relative to the server’s time

This allows you to test scenarios where the server and client are in different timezones. To do this, use the following steps:

When I am a client in a timezone 8 hours behind the server's timezone # transpose the time When I am a client in the server's timezone # reset the time Step definitions

When /^I am a client in a timezone (\d+) hours behind the server's timezone$/ do |hours_behind| overwrite_constant "MOCKED_CLIENT_TIME_OFFSET", -(hours_behind.to_i) end

When /^I am a client in the server's timezone$/ do overwrite_constant "MOCKED_CLIENT_TIME_OFFSET", 0 end

Not the answer you're looking for? Browse other questions tagged or ask your own question.