web-dev-qa-db-fra.com

Selenium Webdriver déplace la souris vers Point

J'essaie actuellement de déplacer le curseur sur un point (org.openqa.Selenium.Point) qui a été défini en recherchant l'occurrence d'un marqueur sur un graphique en direct à partir duquel je ne peux obtenir aucun détail mais où trouver les coordonnées X et Y.

Comment puis-je passer à la souris pour survoler ce point pour ouvrir le menu JavaScript sous-jacent? 

Code actuel

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

Cela ne fonctionne pas car Point ne peut pas être converti en org.openqa.Selenium.interactions.internal.Coordinates.

13
AFoley

IMHO, vous devriez prêter votre attention à Robot.class

Si vous voulez déplacer le pointeur de la souris physiquement, vous devez adopter une approche différente en utilisant la classe Robot

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

Webdriver fournit les coordonnées du document, où, comme la classe Robot est basée sur les coordonnées de l'écran, j'ai donc ajouté +120 pour compenser l'en-tête du navigateur.
Coordonnées de l'écran: il s'agit des coordonnées mesurées à partir du coin supérieur gauche de l'écran de l'utilisateur. Vous obtiendrez rarement les coordonnées (0,0) car celles-ci se trouvent généralement en dehors de la fenêtre du navigateur. Si vous souhaitez utiliser ces coordonnées uniquement si vous souhaitez positionner une fenêtre de navigateur nouvellement créée au point où l'utilisateur a cliqué sur ..__, ces informations sont répertoriées dans les codes event.screenX et event.screenY.
Coordonnées de la fenêtre: coordonnées coordonnées à partir du coin supérieur gauche de la zone de contenu du navigateur. Si la fenêtre défile verticalement ou horizontalement, cela sera différent du coin supérieur gauche du document. C’est rarement ce que vous voulez. Dans tous les navigateurs, il s’agit de event.clientX et de event.clientY.
Coordonnées du document: coordonnées coordonnées à partir du coin supérieur gauche du document HTML. Ce sont les coordonnées que vous souhaitez le plus souvent, car il s’agit du système de coordonnées dans lequel le document est défini.

Plus de détails vous pouvez obtenir ici

J'espère que cela vous sera utile.

15
eugene.polschikov

Pourquoi utiliser Java.awt.Robot lorsque org.openqa.Selenium.interactions.Actions.class fonctionnerait probablement correctement? Juste dire.

Actions builder = new Actions(driver);

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

J'utilise JavaScript mais certains principes sont communs, j'en suis sûr.

Le code que j'utilise est le suivant:

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

le driver = d. Le location = l est simplement {x:300,y:500) - il ne s'agit que d'un décalage.

Lors de mes tests, je me suis rendu compte que je ne pouvais pas le faire fonctionner sans utiliser la méthode pour rechercher d’abord un élément existant.

Je soupçonne que les chiffres de la localisation sont un peu plus difficiles à prévoir que je le pensais.

C'est un ancien message, mais cette réponse pourrait aider d'autres nouveaux arrivants comme moi.

2
andym2009

la solution implémente une classe anonyme de cette manière:

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

Si vous utilisez un RemoteWebDriver, vous pouvez convertir WebElement en RemoteWebElement. Vous pouvez ensuite appeler getCoordinates () sur cet objet pour obtenir les coordonnées. 

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