Selenium Webdriver将鼠标移动到Point

时间:2012-10-19 12:39:19

标签: java selenium selenium-webdriver

我目前正在尝试将光标移动到一个点(org.openqa.selenium.Point),该点是通过检查实时图表上标记的出现而设置的,我可以从中获取没有详细信息但可以找到X和Y坐标。

如何移动鼠标悬停在所述点以打开基础JavaScript菜单?

当前代码

//finds marker on the current web page

Point image = page.findImage("C:\\Pictures\\marker.png") ;

//move mouse to this x,y location 

driver.getMouse().mouseMove((Coordinates) image);

这不起作用,因为Point无法转换为org.openqa.selenium.interactions.internal.Coordinates

9 个答案:

答案 0 :(得分:15)

恕我直言,你应该注意Robot.class

如果你想在物理上移动鼠标指针,你需要采用不同的方法使用Robot类

  Point coordinates = driver.findElement(By.id("ctl00_portalmaster_txtUserName")).getLocation();
  Robot robot = new Robot();
  robot.mouseMove(coordinates.getX(),coordinates.getY()+120);

Webdriver提供文档坐标,其中Robot类基于屏幕坐标,因此我添加了+120来补偿浏览器标题。
屏幕坐标:这些是从用户计算机屏幕左上角开始测量的坐标。你很少得到坐标(0,0)因为它通常在浏览器窗口之外。关于您想要这些坐标的唯一时间是您希望将新创建的浏览器窗口定位在用户单击的位置。 在所有浏览器中,这些都在event.screenXevent.screenY窗口坐标:这些是从浏览器内容区域左上角开始测量的坐标。如果窗口垂直或水平滚动,则与文档的左上角不同。这很少是你想要的。 在所有浏览器中,这些都在event.clientX和event.clientY中 文档坐标:这些是从HTML文档左上角开始测量的坐标。这些是您最常需要的坐标,因为这是定义文档的坐标系。

您可以获得更多详细信息here

希望这对你有所帮助。

答案 1 :(得分:9)

为什么在org.openqa.selenium.interactions.Actions.class可能正常工作时使用 java.awt.Robot ?只是说。

Actions builder = new Actions(driver);

builder.keyDown(Keys.CONTROL)
   .click(someElement)
   .moveByOffset( 10, 25 );
   .click(someOtherElement)
   .keyUp(Keys.CONTROL).build().perform();

答案 2 :(得分:2)

我正在使用JavaScript,但我确信其中一些原则很常见。

我使用的代码如下:

    var s = new webdriver.ActionSequence(d);
    d.findElement(By.className('fc-time')).then(function(result){
        s.mouseMove(result,l).click().perform();
    });

driver = dlocation = l只是{x:300,y:500) - 它只是一个偏移量。

我在测试期间发现的是,如果不使用该方法首先查找现有元素,我将无法使用它,并在找到我的点击的基础上使用该元素。

我怀疑定位中的数字比我想象的要难得多。

这是一个老帖子,但这个回应可能会帮助像我这样的其他新人。

答案 3 :(得分:1)

如果使用的是RemoteWebDriver,则可以将WebElement转换为RemoteWebElement。然后,您可以在该对象上调用getCoordinates()以获取坐标。

        WebElement el = driver.findElementById("elementId");
        Coordinates c = ((RemoteWebElement)el).getCoordinates();
        driver.getMouse().mouseMove(c);

答案 4 :(得分:0)

解决方案是以这种方式实现匿名类:

        import org.openqa.selenium.Point;
        import org.openqa.selenium.interactions.HasInputDevices;
        import org.openqa.selenium.interactions.Mouse;
        import org.openqa.selenium.interactions.internal.Coordinates;

        .....

        final Point image = page.findImage("C:\\Pictures\\marker.png") ;

        Mouse mouse = ((HasInputDevices) driver).getMouse();

        Coordinates imageCoordinates =  new Coordinates() {

              public Point onScreen() {
                throw new UnsupportedOperationException("Not supported yet.");
              }

              public Point inViewPort() {
                Response response = execute(DriverCommand.GET_ELEMENT_LOCATION_ONCE_SCROLLED_INTO_VIEW,
        ImmutableMap.of("id", getId()));

    @SuppressWarnings("unchecked")
    Map<String, Number> mapped = (Map<String, Number>) response.getValue();

    return new Point(mapped.get("x").intValue(), mapped.get("y").intValue());
              }

              public Point onPage() {
                return image;
              }

              public Object getAuxiliary() {
                // extract the selenium imageElement id (imageElement.toString() and parse out the "{sdafbsdkjfh}" format id) and return it
              }
            };

        mouse.mouseMove(imageCoordinates);

答案 5 :(得分:0)

可以使用

Actions builder = new Actions(driver);
WebElement el = some element;
builder.keyDown(Keys.CONTROL)
.moveByOffset( 10, 25 )
.clickAndHold(el)
.build().perform();

答案 6 :(得分:0)

使用MoveToElement可以找到或单击所需的任何点,只需定义第一个参数,它可以是在实例WindowsDriver时创建的会话(winappdriver)或驱动程序(以其他方式) 。否则,您可以将网格(我的情况),列表,面板或您想要的任何内容设置为第一个参数。

注意:第一个参数元素的左上角将是位置X = 0和Y = 0

   Actions actions = new Actions(this.session);
    int xPosition = this.session.FindElementsByAccessibilityId("GraphicView")[0].Size.Width - 530;
    int yPosition = this.session.FindElementsByAccessibilityId("GraphicView")[0].Size.Height- 150;
    actions.MoveToElement(this.xecuteClientSession.FindElementsByAccessibilityId("GraphicView")[0], xPosition, yPosition).ContextClick().Build().Perform();

答案 7 :(得分:0)

你可以这样做:

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript("document.elementFromPoint(25,25)");

然后你会得到元素。您可以添加 .click() 以点击元素。

executeScript 允许您获取文档元素并使用 elementFromPoint 内置 javascript 函数按 X,Y 线点击

答案 8 :(得分:-1)

Robot robot = new Robot();
robot.mouseMove(coordinates.x,coordinates.y+80);

Rotbot是一个很好的解决方案。 它对我有用。