1. 程式人生 > 實用技巧 >六、滑鼠/鍵盤操作

六、滑鼠/鍵盤操作

一、滑鼠操作

百度首頁-->點選設定(移動滑鼠到設定、滑鼠懸停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(
"小章")