Heim >Backend-Entwicklung >Python-Tutorial >Spielen Sie mit Python-Selenium-Maus- und Tastaturoperationen (ActionChains)
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!