English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

python selenium 마우스 키보드操作 (ActionChains)을 활용하는 방법

Selenium을 사용하여 자동화할 때, 때로는 마우스 작업을 모의해야 하는 경우가 있습니다. 예를 들어, 클릭, 더블 클릭, 마우스 오른쪽 버튼 클릭, 드래그 등. Selenium은 이러한 이벤트를 처리하기 위한 클래스를 제공합니다 - ActionChains

selenium.webdriver.common.action_chains.ActionChains(driver)

이 클래스는 우리가 필요로 하는 모든 마우스 작업을 만족시킵니다.

1.ActionChains 기본 사용법

먼저 ActionChains의 실행 원리를 이해해야 합니다. ActionChains의 메서드를 호출할 때는 즉시 실행되지 않고, 모든 작업을 순서대로 쌓아놓습니다. perform() 메서드를 호출할 때, 쌓인 작업이 차례대로 실행됩니다.

이 경우 두 가지 호출 방법이 있습니다: 

• 연결된 작성법

menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()

 • 단계별 작성법

menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()

 두 가지 작성 방법은 본질적으로 같습니다. ActionChains는 모든 작업을 순서대로 실행합니다.

2. ActionChains 메서드 목록

click(on_element=None) ——마우스 왼쪽 버튼을 클릭하기

click_and_hold(on_element=None) ——마우스 왼쪽 버튼을 클릭하고 떼지 않기

context_click(on_element=None) ——마우스 오른쪽 버튼을 클릭하기

double_click(on_element=None) ——마우스 왼쪽 버튼을 더블 클릭하기

drag_and_drop(source, target) ——특정 요소로 끌어다가 떼기

drag_and_drop_by_offset(source, xoffset, yoffset) ——특정 좌표로 끌어다가 떼기

key_down(value, element=None) ——키보드의 특정 키를 누르기

key_up(value, element=None) ——특정 키를 떼기

move_by_offset(xoffset, yoffset) ——현재 위치에서 특정 좌표로 이동하기

move_to_element(to_element) ——마우스를 특정 요소로 이동하기

move_to_element_with_offset(to_element, xoffset, yoffset) ——특정 요소(좌상단 좌표)로부터 특정 거리의 위치로 이동하기

perform() ——리스트에서 모든 액션을 실행하기

release(on_element=None) ——특정 요소 위치에서 마우스 왼쪽 버튼을 떼기

send_keys(*keys_to_send) ——현재 포커스 요소에 특정 키를 보내기

send_keys_to_element(element, *keys_to_send) ——지정된 요소에 특정 키를 보내기

다음에 예제를 통해 각 메서드의 사용법을 자세히 설명하고 시연합니다:

3. 코드 예제

1. 点击操作

示例网址http://sahitest.com/demo/clicks.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/clicks.htm
click_btn = driver.find_element_by_xpath('//input[@value="click me"]') # 单击按钮
doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]') # 双击按钮
rightclick_btn = driver.find_element_by_xpath('//input[@value="우클릭하세요"]') # 우클릭 버튼
ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # 연속 사용법
print driver.find_element_by_name('t2).get_attribute('value')
sleep(2)
driver.quit()

결과:

[CLICK][DOUBLE_CLICK][RIGHT_CLICK]

2.마우스 이동

示例网址http://sahitest.com/demo/mouseover.htm

예제 코드:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/mouseover.htm
write = driver.find_element_by_xpath('//input[@value="HoverWrite"]') # 마우스 이동 시 아래 input 창에 '마우스 이동' 표시
blank = driver.find_element_by_xpath('//input[@value="HoverBlank"]') # 마우스 이동 시 아래 input 창의 내용을 비우기
result = driver.find_element_by_name('t1')
action = ActionChains(driver)
action.move_to_element(write).perform() # write로 이동하여 '마우스 이동' 표시
print result.get_attribute('value')
# action.move_to_element(blank).perform()
action.move_by_offset(10, 50).perform() # 현재 위치에서 이동10,50)의 점, 위 문장과 같은 효과로 blank에 이동하고 비우기
print result.get_attribute('value')
action.move_to_element_with_offset(blank, 10, -40).perform() # blank 요소와의 거리로 이동10,-40)의 점, write에 이동할 수 있습니다
print result.get_attribute('value')
sleep(2)
driver.quit()

결과

마우스 이동

마우스 이동

3.이동

示例网址http://sahitest.com/demo/dragDropMooTools.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/dragDropMooTools.htm')
dragger = driver.find_element_by_id('dragger') # 이동할 요소
item1 = driver.find_element_by_xpath('//div[text()="Item 1]') # 目标元素1
item2 = driver.find_element_by_xpath('//div[text()="Item 2]') # 目标2
item3 = driver.find_element_by_xpath('//div[text()="Item 3]') # 目标3
item4 = driver.find_element_by_xpath('//div[text()="Item 4]') # 目标4
action = ActionChains(driver)
action.drag_and_drop(dragger, item1).perform() # 1).移动dragger到目标1
sleep(2)
action.click_and_hold(dragger).release(item2).perform() # 2).效果与上句相同,也能起到移动效果
sleep(2)
action.click_and_hold(dragger).move_to_element(item3).release().perform() # 3).效果与上两句相同,也能起到移动的效果
sleep(2)
# action.drag_and_drop_by_offset(dragger, 400, 150).perform() # 4).移动到指定坐标
action.click_and_hold(dragger).move_by_offset(400, 150).release().perform() # 5).与上一句相同,移动到指定坐标
sleep(2)
driver.quit()

결과:

dropped dropped dropped dropped

一般用坐标定位很少,用上例中的方法1足够了,如果看源码,会发现方法2其实就是方法1中的drag_and_drop()的实现。注意:拖拽使用时注意加等待时间,有时会因为速度太快而失败。

4.按键

模拟按键有多种方法,能用win32api来实现,能用SendKeys来实现,也可以用selenium的WebElement对象的send_keys()方法来实现,这里ActionChains类也提供了几个模拟按键的方法。

示例网址http://sahitest.com/demo/keypress.htm

代码1:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/keypress.htm')
key_up_radio = driver.find_element_by_id('r1') # 监测按键升起
key_down_radio = driver.find_element_by_id('r2') # 监测按键按下
key_press_radio = driver.find_element_by_id('r3') # 监测按键按下升起
enter = driver.find_elements_by_xpath('//form[@name="f1"]/input')[1] # 输入框
result = driver.find_elements_by_xpath('//form[@name="f1"]/input')[0] # 监测结果
# 监测key_down
key_down_radio.click()
ActionChains(driver).key_down(Keys.CONTROL, enter).key_up(Keys.CONTROL).perform()
print result.get_attribute('value')
# 监测key_up
key_up_radio.click()
enter.click()
ActionChains(driver).key_down(Keys.SHIFT).key_up(Keys.SHIFT).perform()
print result.get_attribute('value')
# 监测key_press
key_press_radio.click()
enter.click()
ActionChains(driver).send_keys('a').perform()
print result.get_attribute('value')
driver.quit()

결과:

key downed charCode=[0] keyCode=[17] CTRL
key upped charCode=[0] keyCode=[16] NONE
key pressed charCode=[97] keyCode=[0] NONE

示例2:

示例网址http://sahitest.com/demo/label.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/label.htm')
input1 driver.find_elements_by_tag_name('input')[3]
input2 driver.find_elements_by_tag_name('input')[4]
action = ActionChains(driver)
input1.click()
action.send_keys('Test Keys').perform()
action.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform() # ctrl+a
action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() # ctrl+c
action.key_down(Keys.CONTROL, input2).send_keys('v').key_up(Keys.CONTROL).perform() # ctrl+v
print input1.get_attribute('value')
print input2.get_attribute('value')
driver.quit()

결과:

Test Keys
Test Keys

복사 붙여넣기는 WebElement<input>.send_keys()로도 구현할 수 있으며, 시도해 보세요. 더하한 방법도 있으며, os 대화 상자 처리 방법 중 하나인 win도 있습니다.32api, 관심이 있으면 SendKeys, keybd_event도 시도해 보세요.

이것이 본 문서의 전체 내용입니다. 많은 도움이 되었기를 바랍니다. 또한, 노래教程을 많이 지지해 주시기를 바랍니다.

명시: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권은 원저자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집을하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 문제가 있는 내용을 발견하면, notice#w로 이메일을 보내 주세요.3codebox.com에 이메일을 보내시면, #을 @으로 변경하여 신고하시고 관련 증거를 제공해 주세요. 실제로 확인되면, 이 사이트는 즉시 저작권 침해 내용을 삭제할 것입니다.