如何将元素从外部移动/拖动到iframe

时间:2020-04-06 05:01:50

标签: javascript jquery python-2.7 selenium-webdriver iframe

我需要将元素从iframe外部移动到iframe中。我的元素面板不是iframe的一部分,但是我的画布在iframe中,并且想要将元素移入其中。

我尝试了以下代码:

 element_source = self._selenium.find_element(By.XPATH,
                                          '//div[@class="gjs-block-label"][contains(.,"Tooltip")]')
    element_target=self._selenium.find_element(By.CLASS_NAME,'gjs-frame')
    actions = ActionChains(self._driver)
    actions.drag_and_drop(element_source, element_target).perform()
    time.sleep(5)

问题似乎是我在移动元素之前必须切换到iframe,但是在这里我看不到这种可能性,因为drag_and_drop是组合方法,其中我的 element_source iframe和 element_target 是iframe本身。

因此,如果我在拖放之前切换,甚至找不到 element_source

这是我正在工作的演示页面: https://grapesjs.com/demo.html

在上面的演示中,左侧是iframe,右侧是元素集合。

2 个答案:

答案 0 :(得分:0)

我调查了该应用程序,在这种情况下,即使使用XPATH的drag_and_drop_by_offset也无济于事,因为这是已知的HTML 5 selenium-drag-issue。 您需要根据下一个解决方法创建自定义帮助程序: https://github.com/andywer/drag-mock,如果您将继续使用python-selenium绑定,请在execute_script的当前浏览器上下文中使用CSS选择器(除XPATH之外,没有其他选择器是稳定的)。

答案 1 :(得分:0)

使用@supputuri链接的答案中所建议的JS消息传递可能无法完全模拟实际用户执行的典型拖放操作。

一个可能的解决方案是尝试扩展Selenium ActionChains API并实现新的方法,这些方法将允许您在一个帧上开始拖动,切换到iframe并放到那里。我肯定知道API可以像这样进行扩展,但是无法说明实现此解决方案的可能性或简便性。

另一种选择是基于有关两个框架上元素的已知信息进行一些计算,以获取要放下元素的位置的偏移量,然后使用Actions API中的一些适当方法-drag_and_drop_by_offsetclick_and_holdmove_by_offsetmove_to_elementmove_to_element_with_offsetrelease的组合。

如果有时间,我将尝试其中的一些方法,并告诉您是否可行。