Selenium Webdriver переместите мышь в Point

В настоящее время я пытаюсь переместить курсор в точку (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 ответов

ИМХО стоит обратить внимание на 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. Это координаты, которые вам чаще всего нужны, так как это система координат, в которой определен документ.

Более подробную информацию вы можете получить здесь

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

Зачем использовать 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();

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

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

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

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

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

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

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

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

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

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

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

Работал с

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

Используя 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();

Ты можешь сделать:

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

И тогда вы получите элемент. можете добавить .click() чтобы щелкнуть по элементу.

В executeScript позволяют получить элемент документа и использовать elementFromPoint встроенная функция javascript для щелчка по X,Y Cord

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

Rotbot - хорошее решение. Меня устраивает.

Другие вопросы по тегам