_clock.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # Copyright (c) Microsoft Corporation.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. import datetime
  15. from typing import TYPE_CHECKING, Dict, Union
  16. if TYPE_CHECKING:
  17. from playwright._impl._browser_context import BrowserContext
  18. class Clock:
  19. def __init__(self, browser_context: "BrowserContext") -> None:
  20. self._browser_context = browser_context
  21. self._loop = browser_context._loop
  22. self._dispatcher_fiber = browser_context._dispatcher_fiber
  23. async def install(self, time: Union[float, str, datetime.datetime] = None) -> None:
  24. await self._browser_context._channel.send(
  25. "clockInstall",
  26. None,
  27. parse_time(time) if time is not None else {},
  28. )
  29. async def fast_forward(
  30. self,
  31. ticks: Union[int, str],
  32. ) -> None:
  33. await self._browser_context._channel.send(
  34. "clockFastForward",
  35. None,
  36. parse_ticks(ticks),
  37. )
  38. async def pause_at(
  39. self,
  40. time: Union[float, str, datetime.datetime],
  41. ) -> None:
  42. await self._browser_context._channel.send(
  43. "clockPauseAt",
  44. None,
  45. parse_time(time),
  46. )
  47. async def resume(
  48. self,
  49. ) -> None:
  50. await self._browser_context._channel.send("clockResume", None)
  51. async def run_for(
  52. self,
  53. ticks: Union[int, str],
  54. ) -> None:
  55. await self._browser_context._channel.send(
  56. "clockRunFor",
  57. None,
  58. parse_ticks(ticks),
  59. )
  60. async def set_fixed_time(
  61. self,
  62. time: Union[float, str, datetime.datetime],
  63. ) -> None:
  64. await self._browser_context._channel.send(
  65. "clockSetFixedTime",
  66. None,
  67. parse_time(time),
  68. )
  69. async def set_system_time(
  70. self,
  71. time: Union[float, str, datetime.datetime],
  72. ) -> None:
  73. await self._browser_context._channel.send(
  74. "clockSetSystemTime",
  75. None,
  76. parse_time(time),
  77. )
  78. def parse_time(
  79. time: Union[float, str, datetime.datetime],
  80. ) -> Dict[str, Union[int, str]]:
  81. if isinstance(time, (float, int)):
  82. return {"timeNumber": int(time * 1_000)}
  83. if isinstance(time, str):
  84. return {"timeString": time}
  85. return {"timeNumber": int(time.timestamp() * 1_000)}
  86. def parse_ticks(ticks: Union[int, str]) -> Dict[str, Union[int, str]]:
  87. if isinstance(ticks, int):
  88. return {"ticksNumber": ticks}
  89. return {"ticksString": ticks}