我需要将元素从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,右侧是元素集合。
答案 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_offset
或click_and_hold
,move_by_offset
,move_to_element
,move_to_element_with_offset
和release
的组合。
如果有时间,我将尝试其中的一些方法,并告诉您是否可行。