code: def test_multi_row_copy(
      self, bokeh_model_page: BokehModelPage
  ) -> None:
      data = {
          "x": [1, 2, 3, 4],
          "y": [0, 1, 2, 3],
          "d": ["foo", "bar", "baz", "quux"],
      }
      source = ColumnDataSource(data)
      table = DataTable(
          columns=[
              TableColumn(field="x", title="x"),
              TableColumn(field="y", title="y"),
              TableColumn(field="d", title="d"),
          ],
          source=source,
      )
  
      text_input = TextInput()
      text_input.js_on_change(
          "value", CustomJS(code=RECORD("value", "cb_obj.value"))
      )
  
      page = bokeh_model_page(column(table, text_input))
  
      row = get_table_row(page.driver, table, 1)
      row.click()
  
      row = get_table_row(page.driver, table, 3)
      shift_click(page.driver, row)
  
      enter_text_in_element(
          page.driver,
          row,
          Keys.INSERT,
          mod=Keys.CONTROL,
          click=0,
          enter=False,
      )
  
      input_el = find_element_for(page.driver, text_input)
      enter_text_in_element(
          page.driver,
          input_el,
          Keys.INSERT,
          mod=Keys.SHIFT,
          enter=False,
      )
      enter_text_in_element(page.driver, input_el, "")
  
      results = page.results
  
      # XXX (bev) these should be newlines with a TextAreaInput but TextAreaInput
      # is not working in tests for some reason presently
      assert (
          results["value"] == "0\t1\t0\tfoo 1\t2\t1\tbar 2\t3\t2\tbaz"
      )
  
      assert page.has_no_console_errors()
  
file_path: bokeh/tests/integration/widgets/tables/test_copy_paste.py
imports: from __future__ import annotations
  import pytest
  from time import sleep
  from selenium.webdriver.common.keys import Keys
  from bokeh.layouts import column
  from bokeh.models import ColumnDataSource, CustomJS, DataTable, TableColumn, TextInput
  from tests.support.plugins.project import BokehModelPage
  from tests.support.util.selenium import RECORD, enter_text_in_element, find_element_for, get_table_row, shift_click
label_desc: Use image node_id 3 for calling the Test_DataTableCopyPaste obj's underlying member method code with example usage: obj.test_multi_row_copy(bokeh_model_page) without return types