当前位置: 首页 > 知识库问答 >
问题:

Selenium Python-拖放不工作到字段中

司空劲
2023-03-14

我使用的是Selenium Webdriver的最新版本,我需要将一个元素拖放到CKeditor的anotation字段中,但它不是IFrame。根据我之前的测试,它通过机器人拖放功能与Java和Selenium2以及FF47一起工作。

现在,我需要使用最新版本的Selenium with Python3来执行此操作。我输入了这个经过验证的代码,它应该可以工作,但它会用带有拖动链接的holding元素卡住我的鼠标,所以剩下的测试将通过holding title链接,该链接不会被放入CKeditor,但当我模拟鼠标点击某个操作字段时,它将从操作中变为活动状态,但holding元素不会被放入。只有手动鼠标点击才能将链接放入anotation并重置鼠标保持。使用Ubuntu18.04 amd64 Firefox 70和GChrome 77进行测试,结果相同。

以下是代码:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Firefox()
driver.get(URL)
alink_from = driver.find_element_by_xpath(TITLE)
anotation_body = driver.find_element_by_xpath(TFIELD)
# 1. alternative
ActionChains(driver).drag_and_drop(alink_from, anotation_body).click(anotation_body).perform()
# 2. alternative
ActionChains(driver).click_and_hold(alink_from).move_to_element(anotation_body).release().click(anotation_body).perform()

还尝试了按回车键、双击鼠标、按偏移量移动、重置操作、切换到帧、Javascript单击——没有任何效果,仍然相同。有人能帮我做这个手术吗?鼠标仍在按住拖动的元素,直到测试结束,否则我将手动单击某个位置。

共有2个答案

施自明
2023-03-14

ActionChains按插入顺序执行操作:单击并按住元素,将其放入目标字段,然后单击此字段。如果该字段在单击后变为活动状态,请先执行

ActionChains(driver).click(anotation_body).drag_and_drop(alink_from, anotation_body).perform()
# or
anotation_body.click()
ActionChains(driver).drag_and_drop(alink_from, anotation_body).perform()
公冶弘壮
2023-03-14

好的,所以我主要用Javascript解决方案尝试了一切。尝试了使用元素或ID选择器模拟DragDrop,尝试了使用JQuery模拟DragDrop,尝试了为JQuery执行Async,但什么都没有发生。甚至在其他拖放情况下也尝试了这个,但它不起作用。

最近的解决方案是JS拖放,它拖动元素,但它不会拖放:https://ynot408.wordpress.com/2011/09/22/drag-and-drop-using-selenium-webdriver/

driver.execute_script(js + "simulate(arguments[0],'mousedown',0,0);",alink_from)
driver.execute_script(js + "simulate(arguments[0],'mousemove',arguments[1],arguments[2]);",alink_from,xto,yto)
driver.execute_script(js + "simulate(arguments[0],'mouseup',arguments[1],arguments[2]);",alink_from,xto,yto)

几个小时后,我终于用库PyAutoGUI找到了一个解决方案!但这需要获得不同的坐标,因为PyAutoGUI使用窗口坐标,Selenium使用浏览器坐标。问题是,您需要关注将被拖到目标中的目标元素,但它需要将鼠标移到目标上,然后单击“向上”到目标。

这个库也需要安装(例如在Ubuntu上):

sudo apt-get install python3-tk
pip3 install pyautogui

以下是代码:

import time
import pyautogui

height=driver.get_window_size()['height']
browser_navigation_panel_height = driver.execute_script('return window.outerHeight - window.innerHeight;')
xf = alink_from.location['x']
yf = alink_from.location['y']
act_y_from = yf%height
scroll_Y_from= yf/height
try:
    driver.execute_script("window.scrollTo(0, "+str(scroll_Y_from*height)+")")
except Exception as err:
    print("Exception")
pyautogui.moveTo(xf,act_y_from+browser_navigation_panel_height)

xto = anotation_body.location['x']
yto = anotation_body.location['y']
act_y_to = yto%height
scroll_Y_to = yto/height
pyautogui.dragTo(xto+1,act_y_to+browser_navigation_panel_height)
time.sleep(2)
pyautogui.mouseUp()
time.sleep(2)
pyautogui.click()
 类似资料:
  • 我在网格窗格中用两个ImageView做拖放测试。我的问题是,当我完成拖放并将目标imageview移动到源imageview并释放鼠标时,我错误地以显示“img2”中的图片而不是“img1”中的图片结束。当我注释掉“setOnDragExited”方法时,我最终得到了正确的图像“img1”,任何建议都将不胜感激。

  • 我在这里举了一个例子: http://jsfiddle.net/NQQL6/ 当我开始拖动链接时,购物车应该会变成绿色。当商品在购物车上拖动时,购物车应变为红色。 这有效,但前提是购物车是空的:| 如果其中有任何其他元素,似乎是在我将项目拖动到这些元素上时触发的。我如何防止这种情况发生? 我尝试将事件侦听器移动到元素并检查是的子级还是孙子级,但即使项目在购物车区域内,似乎也会在上随机触发,因此我的

  • 我正在尝试在我的Angular 6应用程序中添加拖放功能,我正在尝试使用Angular material。这是我想要使用的概述链接。我遵循了入门说明,但我无法使用“@angular/cdk/drag-drop”,我尝试安装了bellow软件包 npm安装-保存@角/材料@角/cdk@角/动画 和 npm安装--保存@angular/cdk 从'@角/cdk/拖放'导入{DragDropMoules

  • 编辑:FXML文件

  • 我只是做了一个简单的应用程序,包括FlowPane和一些有按钮的VBoxs。 主类是这样的。 这个画廊.class是扩展FlowPane的主要后台类。 而PlotterPanel就是VBox,有按钮,可以在图库中拖拽。 问题是,当我在图库中拖动绘图器面板时,它第一次就不能被拖动。我在第二次尝试后工作。当我开始拖动时,它显示了拖动框,但是当我尝试放在另一个节点上时,鼠标点显示x符号。但是当目标已经尝

  • 我已经在我的游戏中实现了拖放功能,但到目前为止,我只能“拖放”到硬编码的位置。如图所示: 我想要的是: 当船舶被丢弃时,它的x、y值(相对于GridPane)被保存,或者 飞船掉落到的细胞被保存。 我的setOnDragDropped事件在此处处理: 我觉得这应该是一个简单的鼠标悬停事件或类似的事情,但我不知道该怎么做。 编辑:下面类的完整代码: }