【问题标题】:Selenium ActionChains when a required element does not exist yet所需元素尚不存在时的 Selenium ActionChains
【发布时间】:2015-12-14 17:56:05
【问题描述】:

如果在动作链开始执行之前所需元素之一不存在,是否可以在 selenium 中创建动作链?

例如,我正在尝试在 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 中实现这样的目标?

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    这其实是一个误诊的案例。根本问题实际上在于 selenium 目前不支持原生 HTML5 拖放,这在this answer 中有更好的解释。因此,无论是否存在所需的元素,给出的示例都不适用于该目的,即使它们看起来应该如此。

    由于在动作链的开头不存在元素的问题,解决方案实际上是通过多个perform() 调用将其分解为多个部分,如第二个示例所示。同样,在多次perform() 调用不起作用的问题中得出的结论是不准确的,并且是误解了真正问题的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-29
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2019-12-08
      • 2017-06-27
      相关资源
      最近更新 更多