六、滑鼠/鍵盤操作
阿新 • • 發佈:2020-10-16
一、滑鼠操作
百度首頁-->點選設定(移動滑鼠到設定、滑鼠懸停setting元素)-->點選高階搜尋
import time from selenium import webdriver from selenium.webdriver import ActionChains driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(5) driver.get("http://www.baidu.com") setting = driver.find_element_by_id("s-usersetting-top") # 滑鼠懸停到設定元素(初始化鏈條,呼叫裡面的方法操作;全域性變數) acting_chains = ActionChains(driver) acting_chains.move_to_element(setting).perform() time.sleep(2) adv_setting = driver.find_element_by_link_text("高階搜尋") adv_setting.click() time.sleep(2) driver.quit()
注意:perform()一定不能忘記,否則動作不會生效。
瞭解ActionChains類,封裝了很多滑鼠操作的方法
1).click()點選
ActionChains(driver).click(elem).perform()
2).click_and_hold 點選不動
ActionChains(driver).click_and_hold(on_element).perform()
3).context_click 右擊
ActionChains(driver).context_click(on_element).perform()
4).double_click 雙擊
ActionChains(driver).double_click(on_element).perform()
5).drag_and_drop 滑鼠拖拽
ActionChains(driver).drag_and_drop(source,target).perform()
其他方法操作類似:先初始化,然後呼叫方法
二、ActionChains呼叫(鏈式呼叫)
_actions = [] def move_to(): print("移動指令") def click(): print("點選") _actions.append(click) _actions.append(move_to) def perform(): for action in _actions: action() perform()
在perform()函式中,直接呼叫action(),action裡面包含了兩個方法
ActionChains類裡面,perform()方法是最後釋放的,沒有返回值。
click(),double_click() 、click_and_hold()、content_click()等,都是返回self,因為只有返回她自己,才能繼續呼叫這個類裡面的其他的方法。
重點:鏈式呼叫的前提是要返回self,才能繼續呼叫自己的方法
ActionChains類原始碼:
class ActionChains(object): def __init__(self, driver): self._driver = driver self._actions = [] if self._driver.w3c: self.w3c_actions = ActionBuilder(driver) def perform(self): if self._driver.w3c: self.w3c_actions.perform() else: for action in self._actions: action() def reset_actions(self): if self._driver.w3c: self.w3c_actions.clear_actions() self._actions = [] def click(self, on_element=None): if on_element: self.move_to_element(on_element) if self._driver.w3c: self.w3c_actions.pointer_action.click() self.w3c_actions.key_action.pause() self.w3c_actions.key_action.pause() else: self._actions.append(lambda: self._driver.execute( Command.CLICK, {'button': 0})) return self def click_and_hold(self, on_element=None): if on_element: self.move_to_element(on_element) if self._driver.w3c: self.w3c_actions.pointer_action.click_and_hold() self.w3c_actions.key_action.pause() else: self._actions.append(lambda: self._driver.execute( Command.MOUSE_DOWN, {})) return self def context_click(self, on_element=None): if on_element: self.move_to_element(on_element) if self._driver.w3c: self.w3c_actions.pointer_action.context_click() self.w3c_actions.key_action.pause() self.w3c_actions.key_action.pause() else: self._actions.append(lambda: self._driver.execute( Command.CLICK, {'button': 2})) return self def double_click(self, on_element=None): if on_element: self.move_to_element(on_element) if self._driver.w3c: self.w3c_actions.pointer_action.double_click() for _ in range(4): self.w3c_actions.key_action.pause() else: self._actions.append(lambda: self._driver.execute( Command.DOUBLE_CLICK, {})) return self def drag_and_drop(self, source, target): """ - source: The element to mouse down. - target: The element to mouse up. """ self.click_and_hold(source) self.release(target) return self def drag_and_drop_by_offset(self, source, xoffset, yoffset): """ - source: The element to mouse down. - xoffset: X offset to move to. - yoffset: Y offset to move to. """ self.click_and_hold(source) self.move_by_offset(xoffset, yoffset) self.release() return self def key_down(self, value, element=None): if element: self.click(element) if self._driver.w3c: self.w3c_actions.key_action.key_down(value) self.w3c_actions.pointer_action.pause() else: self._actions.append(lambda: self._driver.execute( Command.SEND_KEYS_TO_ACTIVE_ELEMENT, {"value": keys_to_typing(value)})) return self def key_up(self, value, element=None): if element: self.click(element) if self._driver.w3c: self.w3c_actions.key_action.key_up(value) self.w3c_actions.pointer_action.pause() else: self._actions.append(lambda: self._driver.execute( Command.SEND_KEYS_TO_ACTIVE_ELEMENT, {"value": keys_to_typing(value)})) return self def move_by_offset(self, xoffset, yoffset): if self._driver.w3c: self.w3c_actions.pointer_action.move_by(xoffset, yoffset) self.w3c_actions.key_action.pause() else: self._actions.append(lambda: self._driver.execute( Command.MOVE_TO, { 'xoffset': int(xoffset), 'yoffset': int(yoffset)})) return self def move_to_element(self, to_element): if self._driver.w3c: self.w3c_actions.pointer_action.move_to(to_element) self.w3c_actions.key_action.pause() else: self._actions.append(lambda: self._driver.execute( Command.MOVE_TO, {'element': to_element.id})) return self def move_to_element_with_offset(self, to_element, xoffset, yoffset): if self._driver.w3c: self.w3c_actions.pointer_action.move_to(to_element, xoffset, yoffset) self.w3c_actions.key_action.pause() else: self._actions.append( lambda: self._driver.execute(Command.MOVE_TO, { 'element': to_element.id, 'xoffset': int(xoffset), 'yoffset': int(yoffset)})) return self def pause(self, seconds): if on_element: self.move_to_element(on_element) if self._driver.w3c: self.w3c_actions.pointer_action.release() self.w3c_actions.key_action.pause() else: self._actions.append(lambda: self._driver.execute(Command.MOUSE_UP, {})) return self def send_keys(self, *keys_to_send): typing = keys_to_typing(keys_to_send) if self._driver.w3c: for key in typing: self.key_down(key) self.key_up(key) else: self._actions.append(lambda: self._driver.execute( Command.SEND_KEYS_TO_ACTIVE_ELEMENT, {'value': typing})) return self def send_keys_to_element(self, element, *keys_to_send): self.click(element) self.send_keys(*keys_to_send) return self def __enter__(self): return self # Return created instance of self. def __exit__(self, _type, _value, _traceback): pass # Do nothing, does not require additional cleanup.
三、鍵盤操作
1)提交資料 elem.send_keys()
from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(5) driver.get("http://www.baidu.com") e = driver.find_element_by_id("kw") e.send_keys("zjx") # 匯入Keys,封裝了鍵盤的按鍵,如下發送回車按鍵 e.send_keys(Keys.ENTER)
傳送ctrl+c
e.send_keys(Keys.CTRL,'c')
提交資料的三種方式:
--定位提交按鈕,點選
--傳送回車按鈕
--資料在form表單中使用submit
import timefrom selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com") elem= driver.find_element_by_id("kw") elem.send_keys("zjx") time.sleep(2) #submit提交的資料要在form表單當中 elem.submit()
四、select操作
方法1:點選option元素(先定位到option元素再click)
方法2:使用Select類(先定位select元素,再進行選擇value)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <p id="hello" onclick="alertMe()"> hello world </p> <P> select下拉框 </P> <script value="myselect"> function alertMe(){ alert("hello world") } </script> <select name="myselect"> <option value="xx">小雪</option> <option value="xy">小樣兒</option> <option value="xz">小章</option> <option value="xll"> 小麗麗</option> </select> </div> </body> </html>
import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.select import Select driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(5) driver.get("http://localhost:63342/study/Lemon/demohtml.html?_ijt=sae0jk3u4qid1qlmev846b2mka") # 第一種:直接定位option元素 xy = driver.find_element_by_xpath('//option[@value="xy"]') xy.click() # 第二種:使用Select # 先定位到Select元素,在選擇選項 select_elem = driver.find_element_by_name("myselect") s = Select(select_elem)
# 通過value選擇 s.select_by_value('xy')
# 通過可見文字選擇 s.select_by_visible_text("小章")