拖放操作不适用于硒,也不会显示任何错误

时间:2019-04-12 03:47:48

标签: selenium-webdriver drag-and-drop

我正在尝试从列表中拖放元素,用户需要单击省略号,然后将元素拖放到目标位置。我尝试了不同的方法,但是它不起作用,并且不会引发任何错误。我的测试用例也显示为通过,而没有执行拖放操作。

我希望将企业家拖放到Professor的位置,但是根本不起作用。

下面是相同的html

<div class="row role"><div class="col-sm-7 role-name">Entrepreneur</div><div class="col-sm-5"><!----><span class="one-glober"><!----><!----></span><i class="fa fa-bars pull-right drag-roles"></i></div></div>


<li id="2" draggable="false" class="active" style=""><div class="row role"><div class="col-sm-7 role-name">Professor</div><div class="col-sm-5"><!----><i class="fa fa-bars pull-right drag-roles"></i></div></div></li>

我尝试了以下方法,但没有一个起作用。

    @FindBy(xpath="//li[@id='2']//i[@class='fa fa-bars pull-right drag-roles']")
    private WebElement source;

    @FindBy(xpath="//li[@id='4']//i[@class='fa fa-bars pull-right drag-roles']")
    private WebElement destination;

    public CharacterRoleDragDropPage dragAndDrop() throws InterruptedException {

        wait.until(ExpectedConditions.invisibilityOf(loader));

        Actions action= new Actions(driver);
        //action.dragAndDrop(source, destination).build().perform();
        //action.clickAndHold(source).moveToElement(destination).release().build().perform();
        source.click();
        //action.clickAndHold(source).dragAndDropBy(source,0, 500).build().perform();
        //action.clickAndHold(source).moveByOffset(0, 500).moveToElement(destination).build().perform();    
        //action.clickAndHold(source).moveToElement(destination).release(source).build().perform();
        action.clickAndHold(source).dragAndDrop(source, destination).build().perform();
        return this;

    }

1 个答案:

答案 0 :(得分:1)

我也遇到了drag & drop的麻烦,并且想出了如果我将moveByOffsetpause结合使用的方法,它就会开始起作用。

您可以尝试以下代码:

new Actions(driver)
    .moveToElement(source)
    .pause(Duration.ofSeconds(1))
    .clickAndHold(source)
    .pause(Duration.ofSeconds(1))
    .moveByOffset(1, 0)
    .moveToElement(destination)
    .moveByOffset(1, 0)
    .pause(Duration.ofSeconds(1))
    .release().perform();