Физическое перемещение курсора к веб-элементу в Python

Я хотел бы физически переместить курсор на веб-элемент (а не имитировать его) и удерживать клавишу Shift и щелкнуть другой элемент по смещению.

У меня есть клавиша удержания и щелчок по второму элементу, используя pyautogui:

import pyautogui

pyautogui.keyDown('shift')
pyautogui.moveRel(0, 62)
pyautogui.click()
pyautogui.keyUp('shift')

Моя проблема заключается в физическом перемещении мыши к этому исходному веб-элементу, а затем выполнении приведенного выше кода. Pyautogui дает возможность перейти к абсолютным координаторам x,y, но в моем случае это не сработает, потому что меняется абсолютная позиция веб-элемента.

Любая идея, как я могу это сделать? желательно на питоне (pyautogui, селен и т. д.)?

Браузер - хром, а ОС - OS X.


person 12435432nm    schedule 16.03.2017    source источник
comment
Почему нельзя имитировать щелчок? Что вы пытаетесь сделать, удерживая клавишу Shift, открыть ссылку в новом окне?   -  person Al Sweigart    schedule 29.03.2017
comment
Я не пытаюсь открыть новое окно. На веб-странице есть таблица со списком некоторых устройств. Один из столбцов — идентификатор устройства (например, 1234). Иногда есть устройства с одинаковыми идентификаторами прямо под друг другом в столбце. Например. есть 3 строки со столбцом DeviceID, установленным на 1234. Я хочу выбрать записи с одним и тем же DeviceID. Вручную я нажимаю первый 1234, удерживаю клавишу Shift и нажимаю третий 1234. Проблема в том, что если я имитирую щелчок, определяя номер DeviceID (1234), всегда будет выбран первый 1234. Надеюсь, я разъяснил, чего я пытаюсь достичь.   -  person 12435432nm    schedule 29.03.2017
comment
[Это]:(imgur.com/FsW6rOB) — это таблица с выбранным элементом один. [ссылка]:(imgur.com/aGsCs9T) — место, где выбираются все элементы.   -  person 12435432nm    schedule 29.03.2017


Ответы (3)


(К сожалению, я могу говорить только о селене с этим)

Для этого вы можете использовать Selenium Actions, т.е. (пример C#)

new Actions(driver)
    .MoveToElement(element1)
    .KeyDown(Keys.Shift)
    .MoveByOffset(offset)
    .Click(element2)
    .KeyUp(Keys.Shift)
    .Perform();

Если вы используете Java, есть также (из того, что я читал) некоторая концепция робота для таких вещей, т.е. см. этот поток https://stackoverflow.com/a/12978079/3110529

person Dillanm    schedule 16.03.2017
comment
К сожалению, действия селена также имитируют это, они не будут делать то, о чем просит ОП; Глядя на класс Robot, он является частью пакета java.awt, поэтому, если он поможет, это, вероятно, будет работать только для локального выполнения, а не для удаленного JVM и доступа к нему) - person Todor Minakov; 17.03.2017
comment
@Todor Это чисто анекдотично и может быть не совсем то же самое, но у меня есть тест, который делает что-то подобное, то есть меню появляется только тогда, когда вы «наводите» курсор на другой элемент. Для этого я использую new Actions(Driver).MoveToElement(widget).Build().Perform();, это приводит к открытию всплывающего меню, а затем я могу получить доступ к параметрам внутри него. - person Dillanm; 17.03.2017
comment
Я не говорю, что это не запускает действие, наоборот, я также успешно использую его для наведения. Я говорю о том, что он физически не перемещает курсор, о чем просил ОП. Я сам не знаю как ему помочь, это моя активность на вопрос только в комментариях :) - person Todor Minakov; 17.03.2017
comment
@ Тодор, теперь я тебя понимаю; Я не собирался здесь спорить, извините! Надеюсь, ОП решит проблему. - person Dillanm; 17.03.2017

Мне кажется, что ImageHorizonLibrary из Eficode может быть вам полезен. Библиотека работает на Linux и Windows и перемещает мышь.

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

*** Settings ***
Library    ImageHorizonLibrary

*** Test Cases ***

Mouse Test
    Sleep    2Sec
    Move To    345     345
    Sleep    2Sec
    Move To    1800    720
person A. Kootstra    schedule 24.03.2017

Если вы хотите продолжать использовать PyAutoGUI, я бы рекомендовал использовать функцию распознавания изображений. Сделайте снимок экрана элемента на веб-странице и обрежьте его до элемента (используя MS Paint или даже онлайн-инструмент для обрезки).

Затем запустите:

>>> x, y = pyautogui.locateCenterOnScreen('croppedscreenshot.png')
>>> pyautogui.moveTo(x, y)
>>> pyautogui.keyDown('shift')
>>> pyautogui.click(x, y)
>>> pyautogui.keyUp('shift')

Это, конечно, хрупко и подвержено ошибкам. Он основан на том, что элемент виден на экране, и, скорее всего, не будет работать, если вы используете браузер, отличный от того, из которого был сделан снимок экрана.

Гораздо лучше использовать Selenium или другой подобный инструмент.

person Al Sweigart    schedule 28.03.2017
comment
На самом деле я изучил функцию распознавания изображений, но получаю сообщение об ошибке, похожее на то, что изображение не найдено: x, y = pyautogui.locateCenterOnScreen('test.png') TypeError: объект 'NoneType' не является итерируемым - person 12435432nm; 29.03.2017