web-dev-qa-db-fra.com

Cliquer sur les coordonnées sans identifier l'élément

Dans le cadre de mon test de sélénium pour une fonction de connexion, je voudrais cliquer sur un bouton en identifiant ses coordonnées et en demandant à Selenium de cliquer sur ces coordonnées. Cela serait fait sans identifier réellement l'élément lui-même (via id, xpath, etc.). 

Je comprends qu'il existe d'autres moyens plus efficaces d'exécuter une commande de clic, mais je cherche à utiliser spécifiquement cette approche pour correspondre au mieux à l'expérience utilisateur. Merci.

16
Nathan Katz

Il est un moyen de le faire. À l'aide de l'API ActionChains, vous pouvez déplacer la souris sur un élément, ajuster le décalage (par rapport au milieu de l'élément), puis cliquer à cet emplacement. Voici comment faire avec webdriver en Python:

elem = find_element_by_selector(selector)
ac = ActionChains(browser)
ac.move_to_element(elem).move_by_offset(x_off, y_off).click().perform()

Vous êtes beaucoup trop prompt à rejeter la question. Il existe un certain nombre de raisons pour lesquelles il est nécessaire de cliquer sur un emplacement spécifique plutôt que sur un élément. Dans mon cas, j'ai un graphique à barres SVG avec un élément de recouvrement qui capture tous les clics. Je veux simuler un clic sur l'une des barres, mais comme la superposition est là, Selenium ne peut pas cliquer sur l'élément lui-même. Cette technique serait également utile pour imagemaps.

27
Dirk Bergstrom

Dans C # API, vous utilisez des actions

var element = driver.FindElement(By...);
new Actions(driver).MoveToElement(element).MoveByOffset(dx, dy).Click().Perform();

Bien qu'il soit préférable d'utiliser simplement des sélecteurs simples Id, CSS, Xpath lorsque cela est possible. Mais la fonctionnalité est là quand cela est nécessaire (c'est-à-dire en cliquant sur des éléments dans certains endroits géographiques pour la fonctionnalité).

16
craastad

Si l’utilisation d’un add-on commercial dans Selenium est une option pour vous, ceci est possible: Supposons que votre bouton est aux coordonnées x=123, y=456. Ensuite, vous pouvez utiliser Helium pour cliquer sur l’élément aux coordonnées suivantes:

from helium.api import *
# Tell Helium about your WebDriver instance:
set_driver(driver)
click(Point(123, 456))

(Je suis l'un des auteurs d'Hélium.)

4
Michael Herrmann

J'ai utilisé le code JavaScript pour la première fois, cela a fonctionné étonnamment jusqu'à ce qu'un site Web ne clique pas.

J'ai donc trouvé cette solution:

D'abord, importez ActionChains for Python et activez-le:

from Selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)

Pour cliquer sur un point spécifique de vos sessions, utilisez ceci:

actions.move_by_offset(X coordinates, Y coordinates).click().perform()

REMARQUE: Le code ci-dessus ne fonctionnera que si la souris n'a pas été touchée. Pour réinitialiser les coordonnées de la souris, utilisez ceci:

actions.move_to_element_with_offset(driver.find_element_by_tag_name('body'), 0,0))

Dans son intégralité:

actions.move_to_element_with_offset(driver.find_element_by_tag_name('body'), 0,0)
actions.move_by_offset(X coordinates, Y coordinates).click().perform()
3
Romano

Cela a fonctionné pour moi en Java pour cliquer sur les coordonnées quels que soient les éléments.

Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.tagName("body")), 0, 0);
actions.moveByOffset(xCoordinate, yCoordinate).click().build().perform();

La deuxième ligne de code réinitialisera votre curseur dans le coin supérieur gauche de la vue du navigateur et la dernière ligne cliquera sur les coordonnées x, y fournies en paramètre.

2
Sarfaraaz Ansari

En Selenium Java, vous pouvez l’essayer avec Javascript:

WebDriver driver = new ChromeDriver();

if (driver instanceof JavascriptExecutor) {
	((JavascriptExecutor) driver).executeScript("el = document.elementFromPoint(x-cordinate, y-cordinate); el.click();");
}

1
Stackcraft_noob

Vous pourrez peut-être le faire via iMacros http://www.iopus.com/iMacros/

1
Nilesh Tailor

J'ai utilisé la classe d'actions comme beaucoup d'autres énumérées ci-dessus, mais ce que j'ai trouvé utile, c'est si j'ai besoin de trouver une position relative à partir de l'élément que j'ai utilisé dans Firefox Add-On Measurit pour obtenir les coordonnées relatives . Par exemple:

        IWebDriver driver = new FirefoxDriver();
        driver.Url = @"https://scm.commerceinterface.com/accounts/login/?next=/remittance_center/";
        var target = driver.FindElement(By.Id("loginAsEU"));
        Actions builder = new Actions(driver);            
        builder.MoveToElement(target , -375  , -436).Click().Build().Perform();

J'ai obtenu les -375, -436 en cliquant sur un élément, puis en le faisant glisser vers l'arrière jusqu'à atteindre le point sur lequel je devais cliquer. Les coordonnées que MeasureIT a dit que je viens de soustraire. Dans l'exemple ci-dessus, le seul élément sur lequel la page pouvait être cliquée était le lien "loginAsEu". Alors j'ai commencé à partir de là.

1
user890332
import pyautogui
from Selenium import webdriver

driver = webdriver.Chrome(chrome_options=options)
driver.maximize_window() #maximize the browser window
driver.implicitly_wait(30)
driver.get(url)
height=driver.get_window_size()['height']

#get browser navigation panel height
browser_navigation_panel_height = driver.execute_script('return window.outerHeight - window.innerHeight;')

act_y=y%height
scroll_Y=y/height

#scroll down page until y_off is visible
try:
    driver.execute_script("window.scrollTo(0, "+str(scroll_Y*height)+")")
except Exception as e:
    print "Exception"
#pyautogui used to generate click by passing x,y coordinates
pyautogui.FAILSAFE=False
pyautogui.moveTo(x,act_y+browser_navigation_panel_height)
pyautogui.click(x,act_y+browser_navigation_panel_height,clicks=1,interval=0.0,button="left")

Ceci a fonctionné pour moi. Espérons que cela fonctionnera pour vous les gars:) ...

0

Les chaînes d'action peuvent être un peu capricieux. Vous pouvez également y parvenir en exécutant du javascript.

self.driver.execute_script('el = document.elementFromPoint(440, 120); el.click();')
0
Cynic
    WebElement button = driver.findElement(By.xpath("//button[@type='submit']"));
    int height = button.getSize().getHeight();
    int width = button.getSize().getWidth();
    Actions act = new Actions(driver);
    act.moveToElement(button).moveByOffset((width/2)+2,(height/2)+2).click();
0
Vimukthi Saranga