code: def test_rangexy(page, port):
      hv_scatter = Scatter([1, 2, 3]).opts(active_tools=["box_zoom"])
  
      rangexy = RangeXY(source=hv_scatter)
  
      pn_scatter = HoloViews(hv_scatter)
  
      serve_and_wait(pn_scatter, port=port)
      page.goto(f"http://localhost:{port}")
  
      hv_plot = page.locator(".bk-events")
  
      expect(hv_plot).to_have_count(1)
  
      bbox = hv_plot.bounding_box()
      hv_plot.click()
  
      page.mouse.move(bbox["x"] + 100, bbox["y"] + 100)
      page.mouse.down()
      page.mouse.move(bbox["x"] + 150, bbox["y"] + 150, steps=5)
      page.mouse.up()
  
      expected_xrange = (0.32844036697247725, 0.8788990825688077)
      expected_yrange = (1.8285714285714285, 2.3183673469387758)
      wait_until(
          lambda: rangexy.x_range == expected_xrange
          and rangexy.y_range == expected_yrange,
          page,
      )
  
file_path: holoviews/holoviews/tests/ui/bokeh/test_callback.py
imports: import time
  import numpy
  import pytest
  import panel
  from panel.pane.holoviews import HoloViews
  from panel.tests.util import serve_and_wait, wait_until
  import holoviews
  from holoviews import Curve, DynamicMap, Scatter
  from holoviews.streams import BoundsXY, Lasso, RangeXY
label_desc: Use image node_id 3 for calling a global function with example usage: test_rangexy(page, port) without return types