Используя версию Selenium Python, можно ли щелкнуть какой-либо элемент в DOM и указать координаты, в которые вы хотите нажать?
Версия Java имеет метод clickAt
, который фактически выполняет именно то, что я ищу, но не могу найти эквивалент в Python.
Селен - нажмите в определенном положении
Ответ 1
Это должно быть! А именно, вам нужно использовать цепочки действий из webdriver. После того, как у вас есть экземпляр этого, вы просто регистрируете кучу действий, а затем вызываете perform()
для их выполнения.
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.google.com")
el=driver.find_elements_by_xpath("//button[contains(string(), 'Lucky')]")[0]
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(el, 5, 5)
action.click()
action.perform()
Это приведет к перемещению мыши на 5 пикселей вниз и 5 пикселей справа от верхнего левого угла кнопки. Мне повезет. Тогда он будет click()
.
Обратите внимание, что вы должны использовать perform()
. Иначе ничего не произойдет.
Ответ 2
Причина, по которой вы запутались, заключается в том, что clickAt
- это старый метод v1 (Selenium RC).
У WebDriver немного другое понятие "Действия".
В частности, строитель "Действия" для привязки Python жить здесь.
Идея команды clickAt
состоит в том, чтобы щелкнуть в определенной позиции относительно определенного элемента.
То же самое достижимо в WebDriver, используя конструктор "Actions".
Надеюсь, эта обновленная документация может помочь.
Ответ 3
Я лично не использовал этот метод, но просматривая исходный код selenium.py
, я нашел следующие методы, которые выглядят так, как будто они будут делать то, что вы хотите. Они смотрят на wrap clickAt
:
def click_at(self,locator,coordString):
"""
Clicks on a link, button, checkbox or radio button. If the click action
causes a new page to load (like a link usually does), call
waitForPageToLoad.
'locator' is an element locator
'coordString' is specifies the x,y position (i.e. - 10,20) of the mouse event relative to the element returned by the locator.
"""
self.do_command("clickAt", [locator,coordString,])
def double_click_at(self,locator,coordString):
"""
Doubleclicks on a link, button, checkbox or radio button. If the action
causes a new page to load (like a link usually does), call
waitForPageToLoad.
'locator' is an element locator
'coordString' is specifies the x,y position (i.e. - 10,20) of the mouse event relative to the element returned by the locator.
"""
self.do_command("doubleClickAt", [locator,coordString,])
Они появляются в объекте selenium, и вот их онлайн-документация API.
Ответ 4
Вы можете выполнить задачу с помощью цепочек действий в питоне, например:
from selenium.webdriver import ActionChains
actionChains = ActionChains(driver)
button_xpath = '//xapth...'
button = driver.find_element_by_xpath(button_xpath)
actionChains.move_to_element(button).click().perform()
Но иногда цепочка действий не находит элемент DOM. Следовательно, лучше использовать команду "Выполнить scipt" следующим образом:
button_xpath = '//xapth...'
button = driver.find_element_by_xpath(button_xpath)
driver.execute_script("arguments[0].click();", button)