Селен - нажмите в определенном положении

Используя версию 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)