当前位置: 首页 > 知识库问答 >
问题:

Selenium拖放JQuery元素

巢靖
2023-03-14

我试图使用Selenium的Action类将JQuery嵌套可排序列表中的源元素拖放到另一个元素。我使用了标准的dragAndDrop方法,并将其分解为clickAndHold、moveToElement和release,但这两种方法都不适用。我甚至尝试使用源元素内部的子元素来拖动,但结果是一样的。

当我运行脚本时,测试返回为已通过,因此我知道正在找到元素,并且选择器有效。Selenium认为拖放操作有效,但当我观察测试时,我看不到任何操作。我已经与一些开发人员确认,我确实针对DOM而言要拖动的正确源元素。

编辑:我在执行操作之前尝试过使用build()方法,甚至通过Hibernate线程来减慢测试速度,但结果是一样的。

编辑2:我还添加了需要将源放入的目的地。我还应该提到源元素(拖动事件)创建了一个可排序的ghost对象,当用户手动将其拖动到目标元素中时,该对象将被复制到目标元素容器中。

这是我试图拖到的目标容器。

<div class="schedDayItem anytimeSection" data-bind="nestedSortable: { 
    foreach: AutoEvents, options: { animation: 600, group: 
   'autoevents', scroll: true, onStart: EnableDragging, onEnd: 
    DisableDragging } }" style="min-height: 60px; position: relative;
    cursor: pointer;"></div>

这是我要拖动的元素的父级。它是JQuery嵌套可排序列表:

<div class="listDayItem anytimeSection" style="font-size: 14px;" 
    data-bind="nestedSortable: { foreach: EventList, options: { animation:
    600, group: { name: 'draggbleevents', pull: 'clone', put: false }, 
    onEnd: $root.GetBaseEvents, sort: false } }">

下面是我试图移动的源元素,嵌套的sortables direct子元素:

<div class="draggableEventItem pointer" style="margin: 3px 0; border-
    radius: 3px;">

为了完整起见,我想移动源元素的内部子元素:

<div id="container" data-bind="class: EventType, style: { backgroundColor: 
    EventBackground }" style="background-color: white; border: 1px solid 
    #AAA; padding: 4px 0; border-radius: 3px;" class="border-left-red">

这是我试图在代码中做的事情:

    Actions action = new Actions(driver);
    //eventAlert is the element I am trying to move.
    //eventName is a string I am using to find the right element in the JQuery List.  One of the source elements inner children provide this string.

    List<WebElement>list = driver.findElements(eventAlert);
    for(WebElement we : list){
        if(we.getText().contains(eventName)){
            action.dragAndDrop(we, driver.findElement(eventElementTarget)).perform();
            break;
        }
    }

共有2个答案

景宏朗
2023-03-14

虽然我不知道如何让dragAndDrop方法在这个特定的问题上发挥作用,但我确实通过在Javascript中使用push操作找到了解决方法。我将继续进行实验,看看嵌套的可排序jQuery列表是否存在selenium缺陷,但目前,这种解决方法是可靠的。

下面我像以前一样创建了一个列表,但这次使用了一个计数器作为迭代设备。我正在搜索AutoSequenceItem,并将它们推送到作为目标容器的事件列表中。这种方法需要了解站点的实际Javascript,但如果与开发人员一起工作,在大多数情况下应该不会有问题。这只是一个可能的解决方法的示例,其他人的站点中不会有AutoSequenceItem等。

    List<WebElement>list = driver.findElements(eventListItem);
    int counter = 0;
    for(WebElement we : list){
        if(we.getText().contains(eventName)){
            js.executeScript("return AutonEdit.Main.AutoSequenceItems()[0]"
                    + ".AutoEvents.push(AutoEdit.Main.EventList()[" + counter +"]);");
            break;
        }
        counter++;
    }
汪耀
2023-03-14

尝试在perform()方法之前使用build()方法

action.dragAndDrop(we, driver.findElement(eventElementTarget)).build().perform();

我对一个jquery示例尝试了以下测试,该示例将从一个元素拖放到不同的元素,不确定这是否会有所帮助:

@Test
public void testDropAndDrag() throws InterruptedException {
    driver.get("http://www.elated.com/res/File/articles/development/javascript/jquery/drag-and-drop-with-jquery-your-essential-guide/card-game.html");
    Actions act = new Actions(driver);
    WebElement card1 = driver.findElement(By.id("card1"));
    WebElement card1Drop = driver.findElement(By.className("ui-droppable"));
    act.dragAndDrop(card1,card1Drop).perform();
    Thread.sleep(5000);
}

更新:我可以用这个网站上的例子重现你所经历的情况:http://jqueryui.com/sortable/#connect-清单

如果你看一下来源,我正在抓取id以获取

我更改了列表,以获取所有

@Test
public void testDropAndDrag() throws InterruptedException {
    driver.manage().window().maximize();
    driver.get("http://jqueryui.com/sortable/#connect-lists");

    Actions act = new Actions(driver);
    WebElement iframeElement = driver.findElement(By.cssSelector("iframe.demo-frame"));
    driver.switchTo().frame(iframeElement);
    List<WebElement> list1 = driver.findElements(By.cssSelector("ul > li.ui-state-default"));
    WebElement list2 = driver.findElement(By.id("sortable2"));
    for(WebElement item : list1){
        System.out.println(item.getText());
        if(item.getText().equals("Item 1")){
            System.out.println(item.getText());
            act.dragAndDrop(item,list2).perform();
            break;
        }
    }
    Thread.sleep(1000);
}
 类似资料:
  • 问题内容: 我针对其运行的网站位于内部服务器上,因此无法提供链接,但是我可以发布一些单击“显示元素”时显示的相关代码。 有五个与此相关的元素: 组1 学生 移动1 组2 移动2 此页面显示学生组,并允许用户在组之间拖动学生。每个组都有一个移动元素。棘手的部分是,仅当用户将学生元素拖到该组上时,任何给定组的“移动”按钮才会显示,而该学生并非来自该组。 目的是将学生转移到新的小组中,然后再移回原来的小

  • 问题内容: 我有一个页面使用jQuery拖放,并且我想使用Selenium为此过程构建一个相对健壮的测试套件。 查看Selenium时,我发现它在jQuery插件上有一个 拖放 命令,例如:FullCalendar,但是当我使用Selenium IDE尝试记录“拖放”时,没有任何记录的事件。 因此,我应该尝试使用jQuery选择器来定位事件吗? 由于以下操作无效(针对示例页面上的“ 12p午餐”

  • 问题内容: 我无法使用Python WebDriver绑定进行拖放。我正在Mac OS X上使用Google Chrome和Firefox。这里有一个线程,那里有人遇到类似问题。 我尝试使用: 您是否设法使Python WebDriver拖放工作? 问题答案: 为了给出更新的答案,我已经验证了它现在确实可以在Mac上运行。 参考

  • 我试图执行拖放操作使用selenium网络驱动程序和红宝石,我尝试了以下选项: 选项1:基于http://rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium/WebDriver/Element#drag_and_drop_on-实例法 备选案文2: 备选案文3: 当我或代码能够单击对象,即它能够找到元素,但由于某种原因不能拖放。以上拖放选项都不

  • 在本节中,您将学习如何在Selenium WebDriver中执行像拖放这样的复杂操作。 在继续本节之前,先了解一些有关拖放操作的概念。 Selenium WebDriver拖放操作 要执行复杂的用户交互,例如拖放,在Selenium WebDriver中有一个类。 使用类,首先构建一系列复合事件,然后使用Action(一个代表单个用户交互的接口)执行它。 在这里使用的类的一些方法是 - - 单击

  • 我正在使用本机拖放html5 api开发拖放界面。我们已经在其他部分使用了jQuery拖动,但是它在这个特定部分的表现很差,所以我们使用原始的JavaScript。 本质上,标记看起来像这样... 我为“dragstart”创建一个addEventListener并运行以下函数 它将我的类完美地应用于原始元素,但我似乎不能移动原始元素。浏览器创建克隆/幽灵图像...我看到你可以创建自己的图像显示,