Щелчок по координатам без идентифицирующего элемента

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

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

13 ответов


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


здесь и способ сделать это. Используя 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 с наложением элемент, который ловит все клики. Я хочу имитировать щелчок по одному из баров, но так как наложение есть, селен не может щелкнуть по самому элементу. Этот метод также будет полезен для imagemaps.


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

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

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


это можно сделать с помощью 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();


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

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

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


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


Я использовал класс действий, как и многие перечисленные выше, но я нашел полезным, если мне нужно найти относительную позицию из элемента, который я использовал 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 от нажатия на элемент, а затем перетаскивания назад, пока я не достиг точки, которую мне нужно было щелкнуть. Координаты, которые я измерил, сказали, что я просто вычитал. В моем примере выше, единственный элемент, который у меня был на странице, которая была кликабельна была ссылка "loginAsEu". Поэтому я начал оттуда.


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

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

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

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

WebDriver driver = new ChromeDriver();

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

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

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

это работает для меня. Надеюсь, это сработает для вас, ребята :)...


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

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

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

selenium.click(id="login");

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