Колесо прокрутки мыши с selenium webdriver, на элементе без полосы прокрутки?

Я пытаюсь управлять частью веб-карты сродни Google Maps, где увеличение/уменьшение выполняется прокруткой во время moused. В идеале я хотел бы иметь возможность сделать что-то вроде этого:

someElement.scroll(-50)

самые близкие методы, которые я видел в документации, были click и send_keys, но ни один из них не скроллинга. Я также попытался отправить свитки на страницу через Javascript, например driver.execute_script("scroll(0,-50)") Это, похоже, ничего не делает.

как я могу это сделать?

3 ответов


чтобы воспроизвести / протестировать колесо мыши, вам придется испустить mouseover, mousemove и wheel события в верхний элемент с инъекцией скрипта.

вот рабочий пример с Google Map:

from selenium import webdriver
from selenium.common.exceptions import WebDriverException

def wheel_element(element, deltaY = 120, offsetX = 0, offsetY = 0):
  error = element._parent.execute_script("""
    var element = arguments[0];
    var deltaY = arguments[1];
    var box = element.getBoundingClientRect();
    var clientX = box.left + (arguments[2] || box.width / 2);
    var clientY = box.top + (arguments[3] || box.height / 2);
    var target = element.ownerDocument.elementFromPoint(clientX, clientY);

    for (var e = target; e; e = e.parentElement) {
      if (e === element) {
        target.dispatchEvent(new MouseEvent('mouseover', {view: window, bubbles: true, cancelable: true, clientX: clientX, clientY: clientY}));
        target.dispatchEvent(new MouseEvent('mousemove', {view: window, bubbles: true, cancelable: true, clientX: clientX, clientY: clientY}));
        target.dispatchEvent(new WheelEvent('wheel',     {view: window, bubbles: true, cancelable: true, clientX: clientX, clientY: clientY, deltaY: deltaY}));
        return;
      }
    }    
    return "Element is not interactable";
    """, element, deltaY, offsetX, offsetY)
  if error:
    raise WebDriverException(error)

options = webdriver.ChromeOptions()
options.add_argument("--disable-infobars --disable-extensions --window-size=1366,768")
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.google.co.uk/maps")

# get element
elm = driver.find_element_by_css_selector("#scene > div.widget-scene > canvas")

# zoom in with mouse wheel
wheel_element(elm, -120)

# zoom out with mouse wheel
wheel_element(elm, 120)

в качестве альтернативы вы можете отправить Zoom shortucts, которые являются + / - с Google map:

# get element
elm = driver.find_element_by_css_selector("#scene > div.widget-scene > canvas")

# zoom in with shortcut
elm.send_keys("+")

# zoom out with shortcut
elm.send_keys("-")

на карте google есть кнопка увеличения/уменьшения масштаба. Вы можете использовать его вместо прокрутки мыши.

/ / нажать на увеличение

driver.find_element_by_id('widget-zoom-in').click()

//нажать на уменьшение

driver.find_element_by_id('widget-zoom-out').click()

вы можете попробовать его с классом PyRobot, сначала сосредоточиться на точках, на которых вы хотите выполнить увеличение/уменьшение, а затем использовать класс PyRobot для выполнения операции увеличения/уменьшения масштаба с помощью клавиш клавиатуры.