Нажатие на координаты без идентификационного элемента

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

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

Ответ 1

Селен не позволит вам это сделать.

Ответ 2

Там есть способ сделать это. Используя ActionChains API, вы можете переместить мышь над элементом, отрегулировать с помощью некоторого смещения (относительно середины элемента), а затем щелкнуть в этом месте. Здесь, как это сделать, используя 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 не может щелкнуть по самому элементу. Этот метод также будет полезен для изображений изображений.

Ответ 3

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

var element = driver.FindElement(By...);
new Actions(driver).moveToElement(element).moveByOffset(dx, dy).click().perform();

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

Ответ 4

Это можно сделать, используя класс 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();

Ответ 5

Сначала я использовал код 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()

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

В Selenium Java вы можете попробовать его с помощью Javascript:

WebDriver driver = new ChromeDriver();

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

Ответ 10

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

        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". Поэтому я начал оттуда.

Ответ 11

Цепочки действий могут быть немного фиктивными. Вы также можете добиться этого, выполнив javascript.

self.driver.execute_script('el = document.elementFromPoint(440, 120); el.click();')

Ответ 12

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

Ответ 13

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

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

Ответ 14

Если вы можете увидеть исходный код страницы, всегда лучший вариант обратиться к кнопке по его идентификатору или атрибуту NAME. Например, у вас есть кнопка "Войти", которая выглядит так:

 <input type="submit" name="login" id="login" />

В этом случае лучший способ сделать

selenium.click(id="login");

Просто из любопытства - разве это не базовая аутентификация HTTP? В этом случае, возможно, посмотрите на это: http://code.google.com/p/selenium/issues/detail?id=34