使用 Selenium 的 Python 版本,是否可以单击 DOM 中的某个元素并指定要单击它的坐标?Java版本有方法clickAt
,它实际上完全符合我的要求,但在Python中找不到等价物。
问问题
75224 次
4 回答
56
这应该做!也就是说,您需要使用来自 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()
. 否则什么都不会发生。
于 2014-10-15T14:45:37.670 回答
3
您可以使用 Edge 浏览器在 python 中使用 Action 链执行任务:
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()
但有时 Action 链找不到 DOM 元素。因此,以下列方式使用执行 scipt 的更好选择:
button_xpath = '//xapth...'
button = driver.find_element_by_xpath(button_xpath)
driver.execute_script("arguments[0].click();", button)
于 2019-07-01T08:25:01.100 回答
2
我没有亲自使用过这种方法,但是通过查看源代码,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 文档。
于 2013-05-29T07:02:19.913 回答