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.

Ответ 1

IMHO вы должны обратить внимание на 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.screenX и event.screenY.
Координаты окна. Это координаты, измеренные в верхнем левом углу области содержимого браузера. Если окно прокручивается, вертикально или горизонтально, это будет отличаться от верхнего левого угла документа. Это редко то, что вы хотите. Во всех браузерах они находятся в event.clientX и event.clientY.
Координаты документа. Это координаты, измеренные в верхнем левом углу HTML-документа. Это координаты, которые вы наиболее часто хотите, так как это система координат, в которой определяется документ.

Подробнее вы можете получить здесь

Надеюсь, это будет полезно для вас.

Ответ 2

Зачем использовать java.awt.Robot, когда org.openqa.selenium.interactions.Actions.class, вероятно, будет работать нормально? Просто скажи.

Actions builder = new Actions(driver);

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

Ответ 3

Я использую JavaScript, но некоторые из принципов являются общими, я уверен.

Используемый мной код выглядит следующим образом:

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

the driver = d. location = l просто {x:300,y:500) - это просто смещение.

То, что я обнаружил во время моего тестирования, заключалось в том, что я не мог заставить его работать, не используя метод, чтобы сначала найти существующий элемент, используя это на основе того, где найти мой клик.

Я подозреваю, что цифры в локации немного сложнее предсказать, чем я думал.

Это старый пост, но этот ответ может помочь другим новичкам, таким как я.

Ответ 4

Если вы используете RemoteWebDriver, вы можете преобразовать WebElement в RemoteWebElement. Затем вы можете вызвать getCoordinates() для этого объекта, чтобы получить координаты.

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

Ответ 5

решение реализует анонимный класс следующим образом:

        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);

Ответ 6

Работал с

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

Ответ 7

Используя MoveToElement, вы сможете найти или щелкнуть в любой точке, которую хотите, вам нужно просто определить первый параметр, это может быть сеанс (winappdriver) или драйвер (другими способами), который создается при создании экземпляра WindowsDriver. В противном случае вы можете установить в качестве первого параметра сетку (мой случай), список, панель или что угодно.

Примечание. В верхнем левом углу вашего первого элемента параметра будет позиция 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();

Ответ 8

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

Rotbot - хорошее решение. Это работает для меня.