Java 元素在画布中不移动

Java 元素在画布中不移动,java,selenium-webdriver,gojs,Java,Selenium Webdriver,Gojs,我想在画布中移动元素,但不知何故,它并没有发生 我试过的代码: Actions actions = new Actions(driver); actions.moveToElement(flowCanvas, 434, 177); actions.clickAndHold(); actions.moveToElement(flowCanvas, 592 , 373); actions.release();

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

我试过的代码:

        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;
我正在尝试的URL:
https://gojs.net/latest/samples/panelLayout.html

我正在使用SeleniumWebDriver和Java。我并没有在上面的代码中得到任何错误,但它也不会移动元素

正在尝试移动以下元素:


尝试操作和操作组合

Actions builder = new Actions(driver);
Action moveAction = builder.moveToElement(flowCanvas,434,177)  
                 .click()
                 .moveByOffset(592, 373) 
                 .doubleClick()
                 .build();
moveAction.perform();

基本上,问题在于所使用的坐标和所使用的bowser/web驱动程序实现。状态为动作命令偏移距图元的中心。但并非所有的web驱动程序实现都遵循这一点。因此,gecko驱动程序(Firefox)的
moveToElement
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,您需要将鼠标向下和向右移动一点。

我尝试使用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); 
您需要在某个位置保存一个屏幕截图,并提及路径<代码>悬停()mouseDown(Button.LEFT)将保持按住鼠标左键,最后一个
mouserMove(50,50)
将移动元素到坐标

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


希望有帮助:)

它不会移动,伙计。这些数字(offsetX和offsetY)应该在什么坐标系中?您使用的X值似乎太大,无法操纵图中四个节点的左上角节点。@WalterNorthwoods-您能告诉我如何获得要移动的控件的精确坐标吗?描述GoJS图中的坐标系
myDiagram.nodes.first()。位置在文档坐标中<代码>myDiagram.transformDocToView(myDiagram.nodes.first().location)
在视口坐标中生成一个点。嘿,非常感谢您的回答。你们能告诉我你们是怎么得到这些元素的坐标的吗?我已经在chrome中为x和y安装了一些扩展,但它显示了其他坐标,请检查:显然,工具的坐标不正确,因为工作div定义为400px上的400px,因此无法将502作为任何坐标。我正在使用Firefox开发工具中的标尺。但是,您可以通过执行myDiagram.transformDocToView(myDiagram.nodes.first().location)来获得chrome的坐标它将返回第一个节点的左上角坐标,以便您可以在执行单击操作之前添加5或10 px,以确保您单击了该节点。@Babl-我正在尝试在一个包含两个画布的页面上进行拖放操作,从一个画布拖到另一个画布,但无法将元素移出第一个画布。有什么想法/建议吗?@misha需要一个你正在做什么的例子,没有代码就帮不上忙示例我的朋友谢谢,但我的画布有500多个控件,我无法用500个截图来移动每个控件