之前的文章中,針對元素的各種屬性,進行了相對應的操作,接下來可以看看selenium如何模擬操作鍵盤和鼠標。
鍵盤事件
webdriver可以模擬常規鍵盤上所有的按鍵操作,在導入包的源碼中可以看到所有命令對應的按鍵。
以代碼的形式來展示:
# coding=utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get("https://www.baidu.com") # 鍵盤事件 driver.find_element(By.ID, 'kw').send_keys("selenium&python?") time.sleep(3) driver.find_element(By.ID, 'kw').send_keys(Keys.BACK_SPACE) # 利用backspace鍵刪除字符串最后一位 time.sleep(3) driver.find_element(By.ID, 'kw').send_keys(Keys.SPACE) # 在字符串后空格鍵添加空格 driver.find_element(By.ID, 'kw').send_keys("學習") # 繼續在字符串后面添加字符串 driver.find_element(By.ID, 'kw').send_keys(Keys.ENTER) # 輸入回車enter鍵進行搜索 time.sleep(3) driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'a') # 全選搜索框中的內容 driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'x') # 剪切搜索框中的內容,也可以使用c進行復制 time.sleep(3) # 打開另外一個搜索網站,輸入剛剛剪切的內容 driver.get("https://www.google.com") driver.find_element(By.ID, 'lst-ib').send_keys(Keys.CONTROL, 'v') # 粘貼剛剛復制、剪切的內容 driver.find_element(By.ID, 'lst-ib').submit() # 提交搜索 time.sleep(3) """ send_keys(Keys.BACK_SPACE) 刪除鍵(BackSpace) send_keys(Keys.SPACE) 空格鍵(Space) send_keys(Keys.TAB) 制表鍵(Tab) send_keys(Keys.ESCAPE) 回退鍵(Esc) send_keys(Keys.ENTER) 回車鍵(Enter) send_keys(Keys.CONTROL, ‘a’) 全選(Ctrl+A) send_keys(Keys.CONTROL, ‘c’) 復制(Ctrl+C) send_keys(Keys.CONTROL, ‘x’) 剪切(Ctrl+X) send_keys(Keys.CONTROL, ‘v’) 粘貼(Ctrl+V) send_keys(Keys.F1) 鍵盤 F1 ... send_keys(Keys.F12) 鍵盤 F12 """ driver.quit()
鼠標事件
上面的鍵盤事件比較好理解,鼠標事件的話直接看源代碼或許就有些糾結了,但是源代碼的注釋說明其實對ActionChains說明的比較清楚。
ActionChains是一種自動執行低級別交互的方法,例如鼠標移動,鼠標按鈕操作,按鍵和上下文菜單交互。
這對於執行更復雜的操作非常有用,例如懸停和拖放。
用戶操作。
在ActionChains對象上調用操作方法時,操作將存儲在ActionChains對象的隊列中。
當調用perform()時,事件將按它們排隊的順序觸發。
ActionChains可以用於鏈式或者可以將操作逐個排隊,然后執行。
無論哪種方式,動作都按照它們被調用的順序執行,一個在另一個之后執行。
這里還是以代碼展示部分功能吧:
# coding=utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://www.baidu.com") time.sleep(3) # 定位元素 ele_1 = driver.find_element(By.XPATH, '//*[@id="u1"]/a[9]') ele_2 = driver.find_element(By.XPATH, '//*[@id="u1"]/a[8]') # 將鼠標懸停在元素1上3秒后再次懸停到元素2上 ActionChains(driver).move_to_element(ele_1).perform() time.sleep(3) ActionChains(driver).move_to_element(ele_2).perform() time.sleep(3) driver.quit()
上述代碼實現了在元素上進行懸停,再移動至另一元素上。
還有其他操作如下:
1 """ 2 click(on_element=None) ——單擊鼠標左鍵 3 4 click_and_hold(on_element=None) ——點擊鼠標左鍵,不松開 5 6 context_click(on_element=None) ——點擊鼠標右鍵 7 8 double_click(on_element=None) ——雙擊鼠標左鍵 9 10 drag_and_drop(source, target) ——拖拽到某個元素然后松開 11 12 drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某個坐標然后松開 13 14 key_down(value, element=None) ——按下某個鍵盤上的鍵 15 16 key_up(value, element=None) ——松開某個鍵 17 18 move_by_offset(xoffset, yoffset) ——鼠標從當前位置移動到某個坐標 19 20 move_to_element(to_element) ——鼠標移動到某個元素 21 22 move_to_element_with_offset(to_element, xoffset, yoffset) ——移動到距某個元素(左上角坐標)多少距離的位置 23 24 perform() ——執行鏈中的所有動作 25 26 release(on_element=None) ——在某個元素位置松開鼠標左鍵 27 28 send_keys(*keys_to_send) ——發送某個鍵到當前焦點的元素 29 30 send_keys_to_element(element, *keys_to_send) ——發送某個鍵到指定元素 31 """
通過這些鍵盤和鼠標的操作,就可以做更多了
