zoukankan      html  css  js  c++  java
  • 六、鼠标/键盘操作

    一、鼠标操作

    百度首页-->点击设置(移动鼠标到设置、鼠标悬停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(
    "小章")
  • 相关阅读:
    【已解决】Kettle新建数据库连接报错(Mysql,MS Sql Server)
    SQL面试题-练习2
    WIN7bat批处理遍历文件夹,输出当前文件夹下所有文件。
    【已解决】MYSQL安装过程报错,怎么解决?MySQL error 0: Authentication to host 'localhost' for user 'root' using method 'caching_sha2_password' failed with message: Reading from the stream has failed.
    常用外国在线英语词典-单词查询
    Oracle 11g 服务端的安装步骤
    Oracle 查询(SELECT)语句(一)
    Oracle 增删改(INSERT、DELETE、UPDATE)语句
    记录一个 C# 导出 Excel 的坑
    C# 中的浅拷贝与深拷贝
  • 原文地址:https://www.cnblogs.com/zhangjx2457/p/13796507.html
Copyright © 2011-2022 走看看