【问题标题】:Physically moving cursor to a Web Element in Python在 Python 中将光标物理移动到 Web 元素
【发布时间】:2017-08-08 03:22:20
【问题描述】:

我想将光标物理地移动到一个网络元素(不是模拟它)并按住 shift 键并单击另一个元素的偏移量。

我有按住 shift 键并点击第二个元素,使用 pyautogui:

import pyautogui

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

我的问题是将鼠标物理移动到该原始网络元素,然后执行上述代码。 Pyautogui 提供了移动到绝对 x,y 协调器的选项,但在我的情况下它不起作用,因为 Web 元素的绝对位置发生了变化。

知道我该怎么做吗?最好在 python 中(pyautogui、selenium 等)?

浏览器是 chrome,操作系统是 OS X。

【问题讨论】:

  • 为什么不能模拟点击?您想通过按住 shift 键在新窗口中打开链接来做什么?
  • 我不想打开一个新窗口。网页中有一个表格列出了一些设备。其中一列是设备 ID(例如 1234)。有时,列中会出现具有相同 ID 的设备。例如。有 3 行的 DeviceID 列设置为 1234。我想选择具有相同 DeviceID 的条目。手动单击第一个 1234,按住 shift 键,然后单击第三个 1234。问题是如果我通过识别 DeviceID 号(1234)来模拟单击,则始终会选择第一个 1234。希望我已经澄清了我想要实现的目标。
  • [This]:(imgur.com/FsW6rOB) 是选择了第一项的表格。 [link]:(imgur.com/aGsCs9T) 是选择所有项目的位置。

标签: python selenium selenium-chromedriver robotframework pyautogui


【解决方案1】:

(不幸的是,我只能和这个谈硒)

您可以为此使用 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

【讨论】:

  • 遗憾的是硒动作也“模拟”了它,他们不会做 OP 要求的;查看 Robot 类,它是 java.awt 包的一部分,所以如果它成功了,那可能只适用于本地执行,而不适用于远程无 JVM 并访问它)
  • @Todor 这纯粹是轶事,可能并不完全相同,但我有一个类似的测试,即仅当您将光标“移动”到另一个元素上时才会出现菜单。为此,我使用new Actions(Driver).MoveToElement(widget).Build().Perform(); 这会导致悬停菜单打开,然后我可以访问其中的选项。
  • 我并不是说它不会触发动作,相反,我也成功地使用它来悬停。我要说的是它不会物理移动光标,这是 OP 所要求的。我自己不知道如何帮助他,我的这个问题的活动只在 cmets :)
  • @Todor 我现在知道你了;我不打算在那里争论,对不起!希望 OP 可以解决问题。
【解决方案2】:

在我看来,Eficode 中的 ImageHorizonLibrary 可能对您有用。该库可在 Linux 和 Windows 上运行并移动鼠标。

以下是两步鼠标移动的示例脚本。图书馆也有许多点击选项Keywords,因为这似乎是合乎逻辑的下一步操作。

*** Settings ***
Library    ImageHorizonLibrary

*** Test Cases ***

Mouse Test
    Sleep    2Sec
    Move To    345     345
    Sleep    2Sec
    Move To    1800    720

【讨论】:

    【解决方案3】:

    如果你想继续使用 PyAutoGUI,我建议使用图像识别功能。截取网页中的元素并将屏幕截图裁剪为元素(使用 MS Paint 甚至在线裁剪工具)。

    然后运行:

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

    当然,这是脆弱且容易出错的。它依赖于屏幕上可见的元素,如果您使用的浏览器与屏幕截图不同,则可能无法正常工作。

    使用 Selenium 或其他类似工具会更好。

    【讨论】:

    • 我实际上查看了图像识别功能,但我收到一个错误,听起来好像没有找到图像:x, y = pyautogui.locateCenterOnScreen('test.png') TypeError: ' NoneType' 对象不可迭代
    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    相关资源
    最近更新 更多