复杂 jQuery UI 上的拖放失败

软件测试 网络驱动程序
2022-02-02 22:43:15

使用 Selenium Webdriver 的 Python 绑定,我无法使用ActionChains.drag_and_drop(). (它确实适用于一个简单的示例。)

我的测试表明它release(target)失败了,而不是click_and_hold(source). 我的问题的 PasteBin 示例可在此处获得。

当事情在 WebDriver 中不起作用时,我感到有些无能为力。我应该如何调试这个?

2个回答

如果是 ChromeDriver,我也有同样的问题。原来你必须在两者之间插入一个虚拟拖动操作,如下所示:

        Actions builder = new Actions(GuiOps.driver);

        // Click and hold fromElem
        builder = builder.ClickAndHold(fromElem);

        // If this is Chrome, insert a tiny move-by-offset call.
        // See http://code.google.com/p/chromium/issues/detail?id=92312 for more details.
        if (driver is OpenQA.Selenium.Chrome.ChromeDriver)
        {
            builder = builder.MoveByOffset(1, 1);
        }

        // Then move to the target and release:
        builder.MoveToElement(toElem, offsetX, offsetY).Release().Build().Perform();

我看到你正在使用 chromeDriver。还有更多未解决的问题:“Drag-and-drop with ChromeDriver”“Python Selenium WebDriver drag-and-drop”所以如果你找不到问题,也许此时它无法解决,那么我建议尝试使用不同的浏览器运行测试。

与往常一样,您应该 100% 确定drag_and_drop您为方法提供了正确的参数。我看到你检查能见度,但为了确保我推荐两件事:

  • sleep(15)之前actionChains.drag_and_drop我仅将 sleep 方法用于调试目的。如果它适用于长时间睡眠,则意味着 waitForElement 或 waitForPageLoad 等方法的实现不正确(需要改进)。
  • drag_and_drop在将源和目标对象用作参数之前,在控制台中打印出有关源和目标对象的信息。尝试打印出标签 nameidclass或确保使用正确元素的东西。

您提到了基于 Web 应用程序的基于 UI 的复杂 jQuery 方法,这意味着它可以具有诸如在鼠标悬停时更改 DIV 背景之类的功能。它甚至可以更改 DIV 元素类名称、大小或其他 css 属性,这些属性会使您的drag_and_drop目标对象与开始拖动它之前不同。您可以尝试调试鼠标悬停时目标元素发生的情况,move_to_element打印出有关 mouse_on_target 元素对象的信息,并与 target_before_mouse_on 对象进行比较。即使对象 mouse_on_target 没有更改父元素上的某些内容也可以更改。InvalidElementStateException在这种情况下,当我尝试使用此类元素时,Java 会引发特殊异常。但是我不知道python在提到的情况下如何反应。您可以尝试使用手动输入目标坐标进行测试drag_and_drop_by_offset (参见文档)使用这种方法,您至少会知道它在哪个位置尝试发布目标。