代码之家  ›  专栏  ›  技术社区  ›  Helping Hands

元素在画布中不移动

  •  4
  • Helping Hands  · 技术社区  · 6 年前

    我想在画布中移动元素,但不知何故,它并没有发生。

    我试过的代码:

            Actions actions = new Actions(driver);
            actions.moveToElement(flowCanvas, 434, 177);
            actions.clickAndHold();
            actions.moveToElement(flowCanvas, 592 , 373);
            actions.release();
            actions.perform();
    

    我的xpath:

       @FindBy(xpath = "//div[@id='diagramDiv']//canvas")
        protected WebElement flowCanvas;
    

    https://gojs.net/latest/samples/panelLayout.html

    正在尝试移动以下元素:

    enter image description here

    4 回复  |  直到 6 年前
        1
  •  3
  •   Babl    6 年前

    基本上,问题在于所使用的坐标和所使用的bowser/web驱动程序实现。这个 W3C specification 表示动作命令偏移距图元的中心。但并非所有的web驱动程序实现都遵循这一点。所以基本上 moveToElement gecko驱动程序(Firefox)的x和y偏移量是从画布中心开始计算的,而Chrome驱动程序(Google Chrome)的坐标值是从左上角计算的。所以,如果你想要一个跨borwser的拖放支持,你需要这样的东西。

    WebDriver driver = getDriver();
    
    driver.get("https://gojs.net/latest/samples/panelLayout.html");
    WebElement flowCanvas = driver.findElement(By.xpath("//div[@id='myDiagramDiv']//canvas"));
    
    if(isGoogleChrome()){
        new Actions(driver)
       .moveToElement(flowCanvas, 100, 125).clickAndHold()
       .moveToElement(flowCanvas, 150, 175).release()
       .perform();
    } else if (isFireFox()){
        new Actions(driver)
        .moveToElement(flowCanvas, -50, -50).clickAndHold()
        .moveToElement(flowCanvas, 100, 100).release()
        .perform();
    }
    

    如您所见,对于firefox,您必须使用负值将鼠标从画布的中心移动到左上角元素,而对于chrome,您需要将鼠标向下和向右移动一点。

        2
  •  0
  •   Sanjay Bhimani    6 年前

    Actions builder = new Actions(driver);
    Action moveAction = builder.moveToElement(flowCanvas,434,177)  
                     .click()
                     .moveByOffset(592, 373) 
                     .doubleClick()
                     .build();
    moveAction.perform();
    
        3
  •  0
  •   Abhishek    6 年前

    我试着用Sikuli移动那个物体,效果很好。请检查下面的代码片段。

        Pattern p = new Pattern("Win/AboutScreen/Move.PNG");
        Region r1 = screen.exists(p);
        r1.hover();
        r1.mouseDown(Button.LEFT);
        r1.mouseMove(50, 50);
        r1.mouseUp(Button.LEFT); 
    

    hover(); 方法将找到屏幕并将鼠标悬停在其上。 mouseDown(Button.LEFT) 将保持按住左键并单击最后一个按钮 mouserMove(50,50)

    如果您使用的是Maven项目,那么安装Sikuli非常容易,只需添加一个简单的依赖项,您就完成了。

    希望这有帮助:)