首页 > 解决方案 > Selenium (Java):dndScript() 方法未定义

问题描述

我正在尝试验证一位前同事的旧演示 Selenium 脚本是否仍然有效,但遇到了一个奇怪的错误。不幸的是,这位同事不再在附近进行咨询。首先,这是有问题的脚本,它应该将一个元素拖放到页面上的另一个元素上:

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Supplier;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import org.junit.Assert;
import org.junit.jupiter.api.Test;

public class DragNDrop {
    
    @Test
    public void testDragAndDropWithCheck() throws InterruptedException {
        
        System.setProperty("webdriver.gecko.driver","D:\\WebDriver\\geckodriver.exe");
        WebDriver driver=new FirefoxDriver();

        driver.get("https://the-internet.herokuapp.com/drag_and_drop");

        By css = By.cssSelector("div[id^=\"column-\"]");
        WebDriverWait wait = new WebDriverWait(driver, 10);
        
        Supplier<List<WebElement>> fetchComponents = () -> wait
                .until(ExpectedConditions.presenceOfAllElementsLocatedBy(css));
        /**
         * Starting check for element position
         */
        List<WebElement> startingCheck = fetchComponents.get();

        Assert.assertEquals("Starting - Draggable number does not match!", 2, startingCheck.size());
        Assert.assertEquals("Starting - A position does not match!", "A", startingCheck.get(0).getText());
        Assert.assertEquals("Starting - B position does not match!", "B", startingCheck.get(1).getText());

        int index = ThreadLocalRandom.current().nextInt(startingCheck.size());
        WebElement from = startingCheck.get(index);
        WebElement to = startingCheck.get(1 - index);

        JavascriptExecutor jse = (JavascriptExecutor) driver;

        jse.executeScript(
            dndScript() + "simulateDragAndDrop(arguments[0], arguments[1])",
            from,
            to);
        /**
         * Ending check for element position
         */
        List<WebElement> endingCheck = fetchComponents.get();

        Assert.assertEquals("Ending - Draggable number does not match!", 2, endingCheck.size());
        Assert.assertEquals("Ending - A position does not match!", "A", endingCheck.get(1).getText());
        Assert.assertEquals("Ending - B position does not match!", "B", endingCheck.get(0).getText());
    }

}

问题出在这部分:

jse.executeScript(
    dndScript() + "simulateDragAndDrop(arguments[0], arguments[1])",
    from,
    to);

Eclipse 突出显示 dndScript() 并抛出消息:

对于 DragNDrop 类型,方法 dndScript() 未定义

我首先认为这是由于缺少导入,所以我去谷歌搜索,但我找不到任何信息。我能找到的最多的是一些对“RichFaces”的引用,但我找不到任何进一步的说明(可能是我自己的错——我绝不是 Selenium/Java 专家)。

关于这个函数的故事以及如何在这个脚本中正确实现它的任何想法?

标签: seleniumselenium-webdrivergeckodriver

解决方案


它不太可能与缺少的导入(可能是静态的)有关。由于这只是一个方法名称,因此可能存在三种情况:

  1. 这是一些不同类范围内的静态方法,过去是通过静态导入导入的
  2. 这是必须在当前类的范围内实现的方法
  3. 这是必须在父类范围内实现的方法

您目前拥有的原因是您当前班级的代码从那时起发生了变化。如果您从版本控制中获取此代码,则需要检查修订历史记录。

有几个可能的故事似乎是可能的:

  • 当前类的范围内有一个方法,然后它被移动了一些父类。出于某种原因,有人忘记在extends当前类中添加关键字。
  • 父类范围内有一个方法。在那之后,有人决定打破类之间的关系并忘记将该方法移动到您当前的类。
  • 在一些不同的类中有静态方法。它被导入到当前类作为static import. 然后有人将该类加载到 IDE 并且没有将该“不同的类”添加到项目的类路径中。然后他们应用了“组织导入”功能,从您当前的课程中删除了损坏的导入。

推荐阅读