Нажатие на координаты без идентификации элемента - PullRequest
19 голосов
/ 21 июля 2011

Как часть моего теста на селен для функции входа в систему, я хотел бы нажать кнопку, указав ее координаты и дав указание селену щелкнуть по этим координатам.Это будет сделано без фактической идентификации самого элемента (через id, xpath и т. Д.).

Я понимаю, что есть и другие, более эффективные способы запуска команды щелчка, но я собираюсь специально использовать этот подход, чтобы наилучшим образом соответствовать опыту пользователя.Спасибо.

Ответы [ 14 ]

32 голосов
/ 15 февраля 2013

Там - это способ сделать это.Используя API ActionChains, вы можете навести указатель мыши на элемент, отрегулировать его на некоторое смещение (относительно середины элемента) и затем щелкнуть мышью в этом месте.Вот как это сделать с помощью webdriver в Python:

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

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

17 голосов
/ 13 мая 2013

В C # API вы используете действия

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

Хотя лучше по возможности использовать простые селекторы Id, CSS, Xpath.Но функциональность там, где это необходимо (т. Е. Щелкая элементы в определенных географических местах для функциональности).

9 голосов
/ 10 февраля 2017

Это можно сделать, используя Actions класс в java

Используйте следующий код -

new Actions(driver).moveByOffset(x coordinate, y coordinate).click().build().perform(); 

Примечание: Selenium 3 не поддерживает Actions класс для geckodriver

Также обратите внимание, что координаты x и y являются относительными значениями от текущей позиции мыши. Предполагая, что координаты мыши находятся в точке (0,0) для начала, если вы хотите использовать абсолютные значения, вы можете выполнить приведенное ниже действие сразу же после нажатия на него, используя приведенный выше код.

new Actions(driver).moveByOffset(-x coordinate, -y coordinate).perform();

6 голосов
/ 01 августа 2018

Я впервые использовал код JavaScript, он работал потрясающе, пока веб-сайт не щелкнул.

Итак, я нашел это решение:

Сначала импортируйте ActionChains для Python и активируйте его:

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

Чтобы нажать на конкретную точку в ваших сессиях, используйте это:

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

ПРИМЕЧАНИЕ. Приведенный выше код будет работать только в том случае, если мышь не касалась, для сброса координат мыши используйте это:

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

В полном объеме:

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()
4 голосов
/ 27 декабря 2018

Это работало для меня в Java, когда я нажимал на координаты независимо от каких-либо элементов.

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

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

4 голосов
/ 23 января 2014

Если для вас есть вариант коммерческого дополнения к Selenium, возможно . Предположим, ваша кнопка имеет координаты x=123, y=456.Затем вы можете использовать Гелий , чтобы щелкнуть элемент в этих координатах следующим образом:

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

(я один из авторов Гелия.)

1 голос
/ 04 августа 2017

Я использовал класс Actions, как и многие из перечисленных выше, но мне показалось полезным, если мне нужно найти относительную позицию по элементу, я использовал Firefox Add-On Measurit, чтобы получить относительные координаты. Например:

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

Я получил -375, -436 от нажатия на элемент и затем перетаскивания назад, пока не достиг точки, которую мне нужно было щелкнуть. Координаты, которые MeasureIT сказал, я только вычел. В моем примере выше, единственным элементом, который у меня был на странице, который можно было кликнуть, была ссылка «loginAsEu». Итак, я начал оттуда.

1 голос
/ 25 июля 2017

В Selenium Java вы можете попробовать его, используя Javascript:

WebDriver driver = new ChromeDriver();

if (driver instanceof JavascriptExecutor) {
	((JavascriptExecutor) driver).executeScript("el = document.elementFromPoint(x-cordinate, y-cordinate); el.click();");
}
1 голос
/ 02 ноября 2011

Вы можете сделать это через iMacros http://www.iopus.com/iMacros/

0 голосов
/ 05 октября 2018
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")

Это работает для меня.Надеюсь, у вас все получится, ребята:) ...

...