如何解决selenium的dragAndDrop失效的问题

这篇具有很好参考价值的文章主要介绍了如何解决selenium的dragAndDrop失效的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个问题烦恼了快2天,网上的回答很混乱,那些乱七八糟的回答往往让人误入歧途,终于在这个找到了问题明确的原因和解决方案,请参照下面的网站

Selenium Drag and Drop Bug Workaround

您是否遇到过众所周知的 Selenium问题,即 拖放手势在某些情况下不适用于 Selenium ?这个错误已经存在多年。

介绍

拖放 是当一个元素被拖到某个其他元素或位置之上时的一个动作。Selenium有一个错误,使该操作无法进行,并且已经存在多年。

问:是什么导致拖放问题?

答案:此手势包含 3 个动作:单击并按住、将鼠标移动到其他元素/位置、释放鼠标。问题都与最后一个动作(释放鼠标)有关。当 Selenium 向 webdriver API 发送请求以释放鼠标时,在某些情况下它会一直按住鼠标。

解决方法

通过 webdriver API向浏览器发送JavaScript代码。因此代码使用JavaScript模拟拖放操作,而不是 webdriver 方法。

问:为什么不将修复程序包含在Selenium包中?

答:拖放 错误是一个webdriver问题, 因此您在Selenium方面所能做的就是简单地执行与我相同的解决方法。我与David Burnes(Selenium 核心提交者)讨论了将该变通办法推入Selenium的问题,但他说在Selenium 本身中提供任何变通办法并不是一个好主意。这就是为什么我必须创建一个单独的包来帮助测试自动化社区解决这个问题。

py程序在这里 

Selenium - HTML5 drag and drop · GitHub
 

把上面的js改编成groovy(java)如下 ,并加上了对elementUI的特殊对应

        WebElement From = driver.findElement(By.xpath("//table[@class='el-table__body']//tr[1]"));
        WebElement To = driver.findElement(By.xpath("//div[@class='el-tree-node__content' and descendant::span[text()='未分類']]"));
		
new Actions(driver)
                .clickAndHold(From)
                .perform();

final String java_script = """
var args = arguments,
callback = args[args.length - 1],
source = args[0],
target = args[1],
offsetX = (args.length > 2 && args[2]) || 0,
offsetY = (args.length > 3 && args[3]) || 0,
delay = (args.length > 4 && args[4]) || 1;

if (!source.draggable) throw new Error('Source element is not draggable.');

var doc = source.ownerDocument,
win = doc.defaultView,
rect1 = source.getBoundingClientRect(),
rect2 = target ? target.getBoundingClientRect() : rect1,
x = rect1.left + (rect1.width >> 1),
y = rect1.top + (rect1.height >> 1),
x2 = rect2.left + (rect2.width >> 1) + offsetX,
y2 = rect2.top + (rect2.height >> 1) + offsetY,
dataTransfer = Object.create(Object.prototype, {
  _items: { value: { } },
  effectAllowed: { value: 'all', writable: true },
  dropEffect: { value: 'move', writable: true },
  files: { get: function () { return undefined } },
  types: { get: function () { return Object.keys(this._items) } },
  setData: { value: function (format, data) { this._items[format] = data } },
  getData: { value: function (format) { return this._items[format] } },
  clearData: { value: function (format) { delete this._items[format] } },
  setDragImage: { value: function () { } }
});

target = doc.elementFromPoint(x2, y2);
if(!target) throw new Error('The target element is not interactable and need to be scrolled into the view.');
rect2 = target.getBoundingClientRect();

emit(source, 'dragstart', delay, function () {
var rect3 = target.getBoundingClientRect();
x = rect3.left + x2 - rect2.left;
y = rect3.top + y2 - rect2.top;
emit(target, 'dragenter', 1, function () {
  emit(target, 'dragover', delay, function () {
	target = doc.elementFromPoint(x, y);
	emit(target, 'drop', 1, function () {
	  emit(source, 'dragend', 1, callback);
});});});});

function emit(element, type, delay, callback) {
var event = doc.createEvent('DragEvent');
event.initMouseEvent(type, true, true, win, 0, 0, 0, x, y, false, false, false, false, 0, null);
Object.defineProperty(event, 'dataTransfer', { get: function () { return dataTransfer } });
element.dispatchEvent(event);
win.setTimeout(callback, delay);
}
"""
((JavascriptExecutor)driver).executeScript(java_script, From, To, null, null, 101);

下面这段代码的意思是在拖动前先clickAndHold这个元素,在elementui中,拖放前draggable属性才会从"false"变成"true",clickAndHold的目的就是让draggable属性变成"true",否则js会出错。

new Actions(driver)
                .clickAndHold(From)
                .perform(); 


 文章来源地址https://www.toymoban.com/news/detail-618675.html

到了这里,关于如何解决selenium的dragAndDrop失效的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Selenium登录页面点击登录页面没有跳转问题(click()失效)

    对于一般的登录界面的登录按钮用xpath定位元素再点击就可以进入页面,但是如果登录不是一个按钮而是一张图片,这时我们该怎么定位并登录成功呢? 比如下面这个登录,并不是按钮而是一个div,div里面放了图片 一开始我用了xpath定位,但是结果就是不报错也没有跳转到登录

    2024年02月08日
    浏览(32)
  • selenium:如何解决打开网页加载时间过长导致的超时问题

    selenium打开网页后,即使页面已经加载出来可以操作了,但是浏览器地址栏旁边还是在转圈,后面的代码也一直无法往下执行。其实大部分原因是由于静态文件加载太慢或者外链的CDN挂了导致的。 selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from render

    2024年02月15日
    浏览(49)
  • 微信|QQ扫码登录网页版二维码失效问题解决方案 网站无法访问PC网页版如何解决 安卓软件历史版本下载 FV fooview悬浮球帮助教程

           1. 手机端浏览器登录网页的同时再用微信或者QQ扫码登录出现二维码失效问题如何解决?                   2.部分网站无法访问PC网页版如何解决?请看方案 目录 前言 1.方案 2.方案       使用Edge安卓浏览器访问电脑版网页 1.操作       1.1小米浏览器+微信(应用

    2023年04月08日
    浏览(42)
  • Selenium 自动化测试如何优雅的解决图片验证码问题

    说到自动化测试那一定避不开登陆注册页面,而大多数情况下这两个简单的页面都存在一个小困难就是验证码,以前我的解决办法都是在测试环境粗暴的写死一个万能验证码,或者给程序一个10秒钟的线程阻塞,手动输入验证码以跳过这个步骤。这样就可以不那么优雅的实现

    2024年02月14日
    浏览(34)
  • 解决Kali数字签名失效问题

    更新Kali仓库源:打开终端并运行以下命令来更新Kali仓库源: sudo apt-get update 这将更新仓库源并将Kali系统中的软件包与其仓库中的软件包同步。 更新软件包:运行以下命令来更新所有软件包: sudo apt-get upgrade 这将更新Kali系统中的所有软件包,并修复可能导致数字签名失效的

    2024年02月06日
    浏览(34)
  • 解决安卓studio代码自动提示失效问题

    我的android studio 从刚开始就没有代码自动提示 很困饶 后来也是通过上网搜寻找到解决方法 把它记录下来希望可以帮到更多的人吧 解决方法: 从File中找到 ➡️ Settings ➡️ AppearanceBehavior➡️ SystemSettings ➡️Android SDK(这边如果有多个SDK的话,保留一个即可),可以多下几个看

    2024年02月12日
    浏览(31)
  • 项目部署后,前端vue代理失效问题解决

    title:工作日记,前段后分离项目,在部署时遇到的问题,Vue项目打包成dist文件之后放在服务器上,通过运行java-jar包,在application.yml中引入静态资源的方式访问前端。如下图所示: 问题1 :前端页面是可以访问到了,但是后端访问不到,在本地中运行就可以。 首先前端我在

    2024年02月03日
    浏览(28)
  • 【前端】vscode javascript 代码片段失效问题解决

    1. 文件--首选项--用户代码片段-vue.json : 添加    在category.vue 文件空白处输入h ,可以显示用户片段  在script中使用失败  问题原因和解决: 在script使用的代码片段写在 javacript.json 中才能使用 VScode-Vue-用户代码片段无效 - Code World        

    2024年01月25日
    浏览(40)
  • 解决VMWare虚拟机复制粘贴功能失效问题

    假设在Windows系统中安装了,VMWare虚拟机软件,然后,在VMWare虚拟机软件中安装了Ubuntu虚拟机,我们就经常需要把Windows系统中的文件或软件复制粘贴到Ubuntu虚拟机中。但是,这个功能有时候会莫名其妙地失效,严重影响虚拟机的使用。这个问题的解决方法是,在Ubuntu终端窗口

    2024年02月11日
    浏览(31)
  • 解决SpringBoot项目中@RestControllerAdvice全局异常失效问题

    使用@RestControllerAdvice添加了全局异常,但没有生效 方式1:@ExceptionHandler 所在类没有被Spring管理 因为 @SpringbootApplication默认扫描本包和子包,为了防止 全局异常类未被扫描到,建议在启动类上加上包扫描 方式2:AOP process() 没有异常抛出,自然不会被拦截掉。检查项目中的切面

    2024年02月09日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包