如果在动作链开始执行之前不存在其中一个必需元素,是否可以在selenium中创建一个动作链?
例如,我正试图在硒中进行拖放。问题在于,只有在发生拖拽时才会存在跌落的目标。拖放的直观解决方案似乎正在做:
source = driver.find_element(...)
target = driver.find_element(...)
ActionChains(driver).drag_and_drop(source, target)
这不起作用,因为在拖动开始之前target
不存在。
我尝试过按照以下方式做的事情:
source = driver.find_element(...)
drag_and_drop = ActionChains(driver)
drag_and_drop.click_and_hold(source)
drag_and_drop.move_by_offset(10, 10)
drag_and_drop.perform()
target = driver.find_element(...)
drag_and_drop.move_to_element(target)
drag_and_drop.release()
drag_and_drop.perform()
这也行不通。似乎鼠标在第一次执行后被释放,这将导致目标消失。这似乎表明需要单个perform()
调用的动作链。我已经尝试过研究,看看是否有任何方法可以在需要动作链的步骤时懒洋洋地找到元素,但我找不到任何方法来做到这一点。
有没有办法在selenium中实现这样的目标?
答案 0 :(得分:1)
这实际上是一个误诊问题的案例。根问题实际上在于selenium当前不支持本机HTML5拖放,这在this answer中有更好的解释。因此,无论所需元素是否存在,所给出的例子都不会用于此目的,即使它们看起来应该如此。
由于在操作链的开头不存在元素的问题,解决方案实际上是将其分解为多个perform()
次调用的部分,如第二个示例所示。同样,在多个perform()
调用不起作用的问题中得出的结论是不准确的,是误解真实问题的结果。