Heim >Backend-Entwicklung >Python-Tutorial >Spielen Sie mit Python-Selenium-Maus- und Tastaturoperationen (ActionChains)

Spielen Sie mit Python-Selenium-Maus- und Tastaturoperationen (ActionChains)

高洛峰
高洛峰Original
2017-02-22 17:19:452988Durchsuche

Wenn Sie Selenium zur Automatisierung verwenden, werden Sie manchmal auf Situationen stoßen, in denen Sie Mausoperationen simulieren müssen, z. B. Klicken, Doppelklicken, Rechtsklicken, Ziehen usw. Selenium stellt uns eine Klasse zur Verfügung, um mit solchen Ereignissen umzugehen – ActionChains

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

Diese Klasse kann grundsätzlich alle unsere Anforderungen an Mausoperationen erfüllen.

1. Grundlegende Verwendung von ActionChains

Zunächst müssen Sie das Ausführungsprinzip von ActionChains verstehen wird sofort ausgeführt, aber alle Vorgänge werden der Reihe nach in einer Warteschlange gespeichert. Wenn Sie die Methode perform() aufrufen, werden die Zeiten in der Warteschlange nacheinander ausgeführt.

In diesem Fall können wir zwei Aufrufmethoden haben:

•Kettenschreiben

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()

•Schritt-für-Schritt-Schreiben

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()

Die beiden Schreibmethoden sind im Wesentlichen gleich und führen alle Vorgänge der Reihe nach aus.

2.ActionChains-Methodenliste

click(on_element=None) – Klicken Sie mit der linken Maustaste

click_and_hold(on_element=None) ) ——Klicken Sie mit der linken Maustaste, ohne sie loszulassen

context_click(on_element=None) ——Klicken Sie mit der rechten Maustaste

double_click(on_element=None) ——Doppelklicken Sie mit der linken Maustaste

drag_and_drop(source, target) – Auf ein Element ziehen und loslassen

drag_and_drop_by_offset(source, xoffset, yoffset) – Auf eine bestimmte Koordinate ziehen und loslassen

key_down(value , element=None) – Drücken Sie eine Taste auf der Tastatur

key_up(value, element=None) – Lassen Sie eine Taste los

move_by_offset(xoffset, yoffset ) – – Bewegen Sie die Maus vom aktuellen Position zu einer bestimmten Koordinate

move_to_element(to_element) ——Bewegen Sie die Maus zu einem bestimmten Element

move_to_element_with_offset(to_element, xoffset, yoffset) ——Bewegen Sie sich auf eine Distanz

perform() – Alle Aktionen in der Kette ausführen

release(on_element=None) – Die Maus an einer Elementposition loslassen. Linke Taste

send_keys(*keys_to_send) – Einen Schlüssel an die aktuelle senden fokussiertes Element

send_keys_to_element(element, *keys_to_send) – Senden Sie einen Schlüssel an das angegebene Element

Im Folgenden werden Beispiele verwendet, um die Verwendung jeder Methode im Detail zu erklären und zu demonstrieren:

3. Codebeispiele

1. Klicken Sie auf den Vorgang

Beispiel-URL http://www.php.cn/;

Code:

# -*- 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="right click me"]') # 右键单击按钮


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()

Ergebnis:

[CLICK][DOUBLE_CLICK][RIGHT_CLICK]

2. Mausbewegung

Beispiel-URL http://www.php.cn/;

Beispielcode:

# -*- 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="Write on hover"]') # 鼠标移动到此元素,在下面的input框中会显示“Mouse moved”
blank = driver.find_element_by_xpath('//input[@value="Blank on hover"]') # 鼠标移动到此元素,会清空下面input框中的内容

result = driver.find_element_by_name('t1')

action = ActionChains(driver)
action.move_to_element(write).perform() # 移动到write,显示“Mouse moved”
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()

Ergebnisse

Maus bewegt

Maus bewegt

3. Ziehen Sie

Beispiel-URL http://www.php.cn /;

Code:

# -*- 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('//p[text()="Item 1"]') # 目标元素1
item2 = driver.find_element_by_xpath('//p[text()="Item 2"]') # 目标2
item3 = driver.find_element_by_xpath('//p[text()="Item 3"]') # 目标3
item4 = driver.find_element_by_xpath('//p[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()

Ergebnis:

gedroppt, gedroppt, gedroppt

Im Allgemeinen wird die Koordinatenpositionierung im obigen Beispiel selten verwendet. Wenn Sie sich den Quellcode ansehen, finden Sie Methode 2. Tatsächlich handelt es sich um die Implementierung von drag_and_drop() in Methode 1. Hinweis: Achten Sie bei der Verwendung von Drag & Drop auf die Wartezeit. Manchmal schlägt die Verwendung fehl, weil die Geschwindigkeit zu hoch ist.

4. Schaltflächen

Es gibt viele Möglichkeiten, Schlüssel zu simulieren, die mit win32api, SendKeys oder der send_keys()-Methode des WebElement-Objekts von Selenium implementiert werden können, hier bietet die ActionChains-Klasse auch mehrere Methoden zur Simulation von Tastendrücken.

Beispiel-URL http://www.php.cn/;

Code 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()

Ergebnis:

Taste gedrückt charCode=[0] keyCode=[17] STRG
Taste gedrückt charCode=[0] keyCode=[16] KEINE
Taste gedrückt charCode=[ 97] keyCode=[0] NONE

Beispiel 2:

Beispiel-URL http://www.php.cn/;

Code:

# -*- 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()

Ergebnis:

Testschlüssel
Testschlüssel

Kopieren und einfügen mit WebElement2fbe6547fcb2fa6a5faf70a81ceaf6e4.send_keys () kann auch implementiert werden, oder Sie können eine Methode auf niedrigerer Ebene, win32api, verwenden, die auch eine Möglichkeit ist, mit Betriebssystem-Popup-Fenstern umzugehen. Wenn Sie interessiert sind, können Sie auch SendKeys ausprobieren. keybd_event

und höher Das ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.

Weitere verwandte Artikel zum Spielen mit Python-Selenium-Maus- und Tastaturoperationen (ActionChains) finden Sie auf der chinesischen PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn