Ответ 1
Селен не позволит вам это сделать.
Как часть моего теста selenium для функции входа в систему, я хотел бы нажать кнопку, указав ее координаты и проинструктируя селен щелкнуть по этим координатам. Это было бы сделано без фактического определения самого элемента (через id, xpath и т.д.).
Я понимаю, что есть другие более эффективные способы запуска команды щелчка, но я ищу конкретный подход к этому методу, чтобы наилучшим образом соответствовать пользовательскому опыту. Спасибо.
Селен не позволит вам это сделать.
Там есть способ сделать это. Используя 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 не может щелкнуть по самому элементу. Этот метод также будет полезен для изображений изображений.
В С# 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();
Сначала я использовал код 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()
Если использование коммерческого надстройки для Selenium является для вас вариантом, это возможно: предположим, что ваша кнопка находится в координате x=123, y=456
. Затем вы можете использовать Helium, чтобы щелкнуть элемент в этих координатах следующим образом:
from helium.api import *
# Tell Helium about your WebDriver instance:
set_driver(driver)
click(Point(123, 456))
(Я один из авторов Гелия.)
В 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, указанные в качестве параметра.
В Selenium Java вы можете попробовать его с помощью Javascript:
WebDriver driver = new ChromeDriver();
if (driver instanceof JavascriptExecutor) {
((JavascriptExecutor) driver).executeScript("el = document.elementFromPoint(x-cordinate, y-cordinate); el.click();");
}
Возможно, вы сможете сделать это через iMacros http://www.iopus.com/iMacros/
Я использовал класс действий, как многие из перечисленных выше, но то, что я нашел полезным, было, если мне нужно найти относительную позицию из элемента, который я использовал надстройкой дополнения 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". Поэтому я начал оттуда.
Цепочки действий могут быть немного фиктивными. Вы также можете добиться этого, выполнив javascript.
self.driver.execute_script('el = document.elementFromPoint(440, 120); 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")
Это работает для меня. Надеюсь, у вас все получится, ребята :)
Если вы можете увидеть исходный код страницы, всегда лучший вариант обратиться к кнопке по его идентификатору или атрибуту NAME. Например, у вас есть кнопка "Войти", которая выглядит так:
<input type="submit" name="login" id="login" />
В этом случае лучший способ сделать
selenium.click(id="login");
Просто из любопытства - разве это не базовая аутентификация HTTP? В этом случае, возможно, посмотрите на это: http://code.google.com/p/selenium/issues/detail?id=34