Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中将光标实际移动到Web元素_Python_Selenium_Selenium Chromedriver_Robotframework_Pyautogui - Fatal编程技术网

在Python中将光标实际移动到Web元素

在Python中将光标实际移动到Web元素,python,selenium,selenium-chromedriver,robotframework,pyautogui,Python,Selenium,Selenium Chromedriver,Robotframework,Pyautogui,我想实际地将光标移动到一个web元素(而不是模拟它),按住shift键并按偏移量单击另一个元素 我已获得按住shift键并使用pyautogui单击第二个元素: import pyautogui pyautogui.keyDown('shift') pyautogui.moveRel(0, 62) pyautogui.click() pyautogui.keyUp('shift') 我的问题是将鼠标实际移动到原始web元素,然后执行上述代码。Pyautogui提供了移动到绝对x,y坐标的选项

我想实际地将光标移动到一个web元素(而不是模拟它),按住shift键并按偏移量单击另一个元素

我已获得按住shift键并使用pyautogui单击第二个元素:

import pyautogui

pyautogui.keyDown('shift')
pyautogui.moveRel(0, 62)
pyautogui.click()
pyautogui.keyUp('shift')
我的问题是将鼠标实际移动到原始web元素,然后执行上述代码。Pyautogui提供了移动到绝对x,y坐标的选项,但是在我的例子中它不起作用,因为web元素的绝对位置发生了变化

你知道我该怎么做吗?最好使用python(pyautogui、selenium等)

浏览器是chrome,操作系统是OSX。

(不幸的是,我只能用这一个来代表selenium)

您可以为此使用Selenium操作,即(示例为C#)

如果你在使用Java,那么(从我所读到的内容来看)也有一些机器人的概念,比如说,看看这个线程,我觉得from可能对你有用。该库在Linux和Windows上工作,并移动鼠标

下面是两步鼠标移动的示例脚本。该库还有许多单击选项,这似乎是合乎逻辑的下一步操作

*** Settings ***
Library    ImageHorizonLibrary

*** Test Cases ***

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

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

然后运行:

>>> x, y = pyautogui.locateCenterOnScreen('croppedscreenshot.png')
>>> pyautogui.moveTo(x, y)
>>> pyautogui.keyDown('shift')
>>> pyautogui.click(x, y)
>>> pyautogui.keyUp('shift')
当然,这是脆弱和容易出错的。它依赖于屏幕上可见的元素,如果您使用的浏览器与制作屏幕截图的浏览器不同,则可能无法工作


使用Selenium或其他类似工具是一个更好的主意。

遗憾的是,Selenium actions也“模拟”了它,他们不会按照OP的要求去做;看看Robot类,它是java.awt包的一部分,所以如果它真的这样做了,那么它可能只对本地执行有效,而不是在没有JVM和访问它的远程环境中。)@Todor这纯粹是轶事,可能不完全相同,但我有一个做类似事情的测试,即,仅当您将光标“移动”到另一个元素上时,菜单才会出现。为此,我使用
新操作(驱动程序).MoveToElement(小部件).Build().Perform()这会导致悬停菜单打开,然后我可以访问其中的选项。我并不是说它不会触发操作,相反,我也成功地使用它进行悬停。我想说的是,它不会实际移动光标,而这正是OP所要求的。我自己也不知道如何帮助他,我对这个问题的反应只是在评论中:)@Todor我现在就了解你;对不起,我不想在那里给人留下争论的印象!希望OP能解决这个问题。为什么你不能模拟一下点击呢?按住shift键,在新窗口中打开链接,你想做什么?我不是想打开新窗口。网页中有一个表列出了一些设备。其中一列是设备ID(例如1234)。有时,在列中的每个设备的正下方都有相同ID的设备。例如,有3行DeviceID列设置为1234。我想选择具有相同设备ID的条目。手动单击第一个1234,按住shift键,然后单击第三个1234。问题是,如果我通过标识设备ID号(1234)来模拟单击,那么将始终选择第一个1234。希望我已经澄清了我想要实现的目标。[此]:()是选中项目1的表。[链接]:()是选择所有项目的地方。我实际上查看了图像识别功能,但我得到一个错误,听起来好像没有找到图像:x,y=pyautogui.locateCenterOnScreen('test.png')TypeError:'NoneType'对象不可编辑
>>> x, y = pyautogui.locateCenterOnScreen('croppedscreenshot.png')
>>> pyautogui.moveTo(x, y)
>>> pyautogui.keyDown('shift')
>>> pyautogui.click(x, y)
>>> pyautogui.keyUp('shift')