python - 拖放什么都不做

我完全没有运气让 ActionChains 操作在 Chrome 中工作,特别是 drag_and_drop,而且我没有找到任何解决方法。

在我的例子中,我正在处理这样一个问题,即只有将元素拖入特定字段后才会显示数据表。如果我尝试使用 ActionChains 执行此操作,程序将什么都不做并挂起。

这是在 python 中使用 selenium。

我使用的是 Chrome 版本 75.0.3770.100

下面是一段示例代码,可以重现这种情况:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

import time
import re

### Start Process
# create a new Chrome session
driver = webdriver.Chrome()
driver.implicitly_wait(30)
driver.maximize_window()
driver.get('https://www.w3schools.com/html/html5_draganddrop.asp')


dragged = driver.find_element_by_xpath('//*[@id="drag1"]')
dropped = driver.find_element_by_xpath('//*[@id="div2"]')
ActionChains(driver).drag_and_drop(dragged, dropped).perform()

此代码应该只是将 Logo 从左侧框拖到右侧,但它什么也不做。

编辑:这是在 shell 中返回的内容:

 DevTools listening on ws://127.0.0.1:54994/devtools/browser/a9093d6c-8ee0-4140-84fe-dd3009412fbc
 [14976:20964:0710/120727.552:ERROR:ssl_client_socket_impl.cc(947)] handshake failed; returned -1, SSL error code 1, net_error -100
 [14976:20964:0710/120727.576:ERROR:ssl_client_socket_impl.cc(947)] handshake failed; returned -1, SSL error code 1, net_error -100
 Press any key to continue . . . [14976:20964:0710/120736.634:ERROR:ssl_client_socket_impl.cc(947)]
 handshake failed; returned -1, SSL error code 1, net_error -100

最佳答案

@pcalkins 知道了!这是工作代码!我只是将声明变量的字符串中的最后一行移动到函数调用中,以便我可以在不同情况下更改它。非常感谢!

from selenium import webdriver

#javaScript function to drag and drop
simulateFunction = str("function simulateDragDrop(sourceNode, destinationNode) {\n" +
"    var EVENT_TYPES = {\n" +
"        DRAG_END: 'dragend',\n" +
"        DRAG_START: 'dragstart',\n" +
"        DROP: 'drop'\n" +
"    }\n" +
"\n" +
"    function createCustomEvent(type) {\n" +
"        var event = new CustomEvent(\"CustomEvent\")\n" +
"        event.initCustomEvent(type, true, true, null)\n" +
"        event.dataTransfer = {\n" +
"            data: {\n" +
"            },\n" +
"            setData: function(type, val) {\n" +
"                this.data[type] = val\n" +
"            },\n" +
"            getData: function(type) {\n" +
"                return this.data[type]\n" +
"            }\n" +
"        }\n" +
"        return event\n" +
"    }\n" +
"\n" +
"    function dispatchEvent(node, type, event) {\n" +
"        if (node.dispatchEvent) {\n" +
"            return node.dispatchEvent(event)\n" +
"        }\n" +
"        if (node.fireEvent) {\n" +
"            return node.fireEvent(\"on\" + type, event)\n" +
"        }\n" +
"    }\n" +
"\n" +
"    var event = createCustomEvent(EVENT_TYPES.DRAG_START)\n" +
"    dispatchEvent(sourceNode, EVENT_TYPES.DRAG_START, event)\n" +
"\n" +
"    var dropEvent = createCustomEvent(EVENT_TYPES.DROP)\n" +
"    dropEvent.dataTransfer = event.dataTransfer\n" +
"    dispatchEvent(destinationNode, EVENT_TYPES.DROP, dropEvent)\n" +
"\n" +
"    var dragEndEvent = createCustomEvent(EVENT_TYPES.DRAG_END)\n" +
"    dragEndEvent.dataTransfer = event.dataTransfer\n" +
"    dispatchEvent(sourceNode, EVENT_TYPES.DRAG_END, dragEndEvent)\n" +
"}; ")

### Start Process
# create a new Chrome session
driver = webdriver.Chrome()
driver.implicitly_wait(30)
driver.maximize_window()
driver.get('https://www.w3schools.com/html/html5_draganddrop.asp')

#call javascript dragdrop function
#here, drag1 and div2 are the page-specific IDs of the item to drag and the place to drop it, respectively.
driver.execute_script(simulateFunction + "var toDrag =document.getElementById('drag1'); var toDrop = document.getElementById('div2'); simulateDragDrop(toDrag, toDrop);")

https://stackoverflow.com/questions/56975681/

相关文章:

c# - Visual Studio 2019 不在 Mac 上强调错误

angular - 自动滚动 onkeydown 即使没有必要

java - Avro 1.9.0 无法编译生成的 java 代码,错误消息为 : cannot f

sql-server - 如何查找从今天开始的同一工作日值的过去 4 周

spring - 无法解析 OpenID 配置 spring boot(安全)java.net.Co

r - 从 R Survey 包运行 svymean 时,我可以得到 unwtd.count 吗?

python - 在多处理模块中使用 Pool 修改全局变量

laravel - 安装后如何使用 npm 包 (chart.js)?

reactjs - 如何将 MenuItem 用作 NavLink?

angular - 上传 PUT 请求由 Angular ServiceWorker 发送两次