解决Selenium元素拖拽不生效Bug
解决Selenium元素拖拽不生效Bug
蔡坨坨转载请注明出处❤️
作者:测试蔡坨坨
原文链接:caituotuo.top/e8aa6c6f.html
你好,我是测试蔡坨坨。
前几天在使用Selenium进行元素拖拽操作时,发现Selenium自带的元素拖拽方法(dragAndDrop())不生效,网上的回答也是五花八门,比较混乱,尝试了以下几种方法均无法解决
。
方案1:通过dragAndDrop()方法将元素拖放到特定区域上——无效
1 | // 要拖拽的元素 |
方案2:通过dragAndDropBy()方法将元素进行指定像素位移,从而实现拖放到特定区域,该方法需要先找到元素的像素——无效
1 | new Actions(driver).dragAndDropBy(draggable,135, 40).build().perform(); |
方案3:先通过clickAndHold()方法点击并按住元素,然后使用moveByOffset()方法将元素拖拽到目标区域,再使用release()方法将按住的元素释放——无效
1 | new Actions(driver).clickAndHold(draggable).moveByOffset(400, 0).release().build().perform(); |
方案4:先通过clickAndHold()方法点击并按住元素,然后使用moveToElement()方法将元素拖拽到指定元素上,再使用release()方法将元素释放——无效
1 | new Actions(driver).clickAndHold(draggable).moveToElement(droppable).release(droppable).build().perform(); |
方案5:借助Robot类实现拖拽——无效
1 | Point coordinates1 = draggable.getLocation(); |
……
以上方案均未生效,具体表现为运行均无任何报错,但在应用程序中未发生拖放。
经过一顿操作,最终在「Selenium Drag and Drop Bug Workaround」上找到了问题原因及解决方案。
经了解,Selenium的拖放功能在某些情况下无效的错误已经存在多年。
原因是拖放功能包含三个动作:单击并按住(click and hold)、将鼠标移动到其他元素或位置(move mouse to other element/location)、释放鼠标(release mouse),问题在于最后一步释放鼠标的操作,当Webdriver API发送释放鼠标的请求时,在某些情况下它会一直按住它,所以导致拖放功能无效。
解决方法就是通过Webdriver API将JavaScript代码发送到浏览器,利用JavaScript模拟拖放操作,而不使用Webdriver自带的拖放方法。
其工作原理是将浏览器实例和CSS选择器找到的两个Web元素作为参数,然后在浏览器端执行JavaScript代码。
如果你是使用Python+Selenium技术栈实现的Web UI自动化,可以直接下载seletools(Selenium Tools,作者:Dmitrii Bormotov)包,并将它导入到需要执行拖放的地方,然后简单地调用它的drag_and_drop()方法即可。
1 | pip install seletools |
1 | from seletools.actions import drag_and_drop |
如果使用的是Java+Selenium技术栈,则可以使用以下代码实现:
1 | // 要拖拽的元素 |
以上就是在Python和Java中的解决方案,至于为什么不在Selenium中直接修改程序,而是创建单独的包来处理,以下是Dmitrii Bormotov的说法:
The drag and drop bug is a webdriver issue, so all you can do on the Selenium side is to simply perform the same workaround that I did. I spoke with David Burnes (core Selenium committer) about pushing that workaround into Selenium, but he said that it is not a good idea to have any workarounds in Selenium itself. That is why I had to create a separate package to help the test automation community with this problem.
大概的意思就是拖放错误是一个webdriver网络驱动问题,David Burnes(核心 Selenium 提交者)认为在Selenium中提供任何暂时避开网络的方法并不是一个好主意。