六、Web控件交互

Actions

  • 官方文档:https://selenium-python.readthedocs.io/api.html
  • ActionChains:执行PC端的鼠标点击、双击、右键、拖拽等事件
  • TouchActions:模拟PC和移动端的点击、滑动、拖拽、多点触控等多种手势操作

动作链接ActionChains

  • 执行原理:
    • 调用ActionChains的方法时,不会立即执行,而是将所有的操作,按顺序存放在—个列里,当你调用perform()方法时,队列中的事件会依次执行
  • 基本用法
    • 生成一个动作action = ActionChains(driver)
    • 动作添加方法1 action.方法1
    • 动作添加方法2 action.方法2
    • 调用perform()方法执行(action.perform())
  • 具体写法:
    • 链式写法:
      • ActionChains(driver).move_to_element(element).click(element).perform()
    • 分布写法:
      • actions = ActionChains(driver)
      • actions.move_to_element(element)
      • actions.click(element)
      • actions.perform()

ActionChains用法一

  • 用法一:点击、右键、双击操作

    • action = ActionChains(driver)
    • action.click(element)
    • action.double_click(element)
    • action.context_click(element)
    • action.perform()
  • 测试案例一:

    • 打开页面:http://sahitest.com/demo/clicks.htm
    • 分别对按钮'click me' , ' dbl click me ' ,'right click me' ,执行点击、双击、右键操作
    • 打印上面展示框中的内容


      image.png
from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By


class TestActionChains:

    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get("http://sahitest.com/demo/clicks.htm")
        self.driver.implicitly_wait(3)

    def teardown(self):
        self.driver.quit()

    def test_click(self):

        ele_dbl_click = self.driver.find_element(By.CSS_SELECTOR, '[value="dbl click me"]')
        ele_click = self.driver.find_element(By.CSS_SELECTOR, '[value="click me"]')
        ele_right_click = self.driver.find_element(By.CSS_SELECTOR, '[value="right click me"]')
        ele_text = self.driver.find_element(By.CSS_SELECTOR, '[name="t2"]')
        # 实例化ActionChains()
        action = ActionChains(self.driver)
        # 点击
        action.click(ele_click)
        # 右键
        action.context_click(ele_right_click)
        # 双击
        action.double_click(ele_dbl_click)
        # 执行action
        action.perform()
        print(ele_text.text)
        sleep(4)

ActionChains用法二

  • 用法二:移动操作

    • action = ActionChains(driver)
    • action.move_to_element(element)
    • action.perform()
  • 测试案例二:

   def test_move_to(self):
        """
        光标移动到百度的设置按钮上
        :return:
        """
        self.driver.get("http://www.baidu.com")
        ele = self.driver.find_element_by_link_text("设置")
        action = ActionChains(self.driver)
        action.move_to_element(ele)
        sleep(3)

ActionChains用法三

  • 用法三:拖拽操作

    • action = ActionChains(driver)
      • 方法一:
        • action.drag_and_drop(drag_ele, drop_ele).perform()
      • 方法二:
        • action.click_and_hold(drag_ele).release(drop_ele).perform()
      • 方法三:
        • action.click_and_hold(drag_ele).move_to_element(drop_ele).release().perform()
  • 测试案例三:

    def test_dragdrop(self):
        self.driver.get("http://sahitest.com/demo/dragDropMooTools.htm")
        drag_ele = self.driver.find_element_by_id('dragger')
        drop_list = self.driver.find_elements(By.CSS_SELECTOR, '[class="item"]')
        action = ActionChains(self.driver)
        # 将方块移动到每个item中并释放
        for drop_ele in drop_list:
            """方法一:使用drag_and_drop 方法"""
            # sleep(1)
            # action.drag_and_drop(drag_ele, drop_ele).perform()

            """方法二:先进行点击并hold住,再释放"""
            # action.click_and_hold(drag_ele).release(drop_ele).perform()

            """方法三:先进行点击并hold住,再移动到目的元素上,最后释放"""
            action.click_and_hold(drag_ele).move_to_element(drop_ele).release().perform()
        sleep(3)

ActionChains用法四

  • 用法四:模拟按键操作
    • 模拟按键有多种方法,能用win32api来实现,能用SendKeys来实现,也可以用seleniu
      m的WebElement对象的send_keys()方法来实现,这里ActionChains类也提供了几个模拟按
      键的方法
  • 用法:
    • Action = ActionChains(driver)
    • action.send_keys(Keys.BACK_SPACE)
  • 或者
    • action.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL)
    • action.perform()
  • 测试案例四:
image.png
    def test_keys(self):
        self.driver.get("http://sahitest.com/demo/label.htm")
        ele = self.driver.find_element(By.XPATH, '//*[@type="textbox"][1]')
        ele.click() # 首先要将光标移动到输入框
        action = ActionChains(self.driver)
        action.send_keys("username").pause(1)       # 首先输入username,并等待一秒
        action.send_keys(Keys.SPACE).pause(1)       # 然后输入空格
        action.send_keys("Tom").pause(1)            # 然后输入Tom
        action.send_keys(Keys.BACK_SPACE).pause(1).perform() # 最后删除一个字符
        sleep(3)

触摸链接TouchAcitons

  • 官方地址:https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.touch_actions.html
  • 类似于ActionChains,ActionChains只是针对PC端程序鼠标模拟的一系列操作,对H5页面操作时无效,TouchAction可以对h5页面操作,通过TouchAction可以实现点击、滑动
    拖拽、多点触控以及模拟手势的各种操作
  • 手势控制
    • tap --- 在指定元素上敲击
    • double_tap --- 在指定元素上双敲击
    • tap_and_hold --- 在指定元素上点击但不释放
    • move --- 手势移动指定偏移(未释放)
    • release --- 释放手势
    • scroll --- 手势点击并滚动
    • scroll_from_element --- 从某个元素位置开始手势点击并滚动(向下滑动为负数,向上滑动为正数)
    • long_press --- 长按元素
    • flick --- 手势滑动
    • flick_element --- 从某个元素位置开始手势滑动(向上滑动为负数、向下滑动为正数)。Perform执行
    • Perform --- 执行

TouchActions 案例

  • 打开Chrome
  • 打开URL : http:/ / www.baidu.con
  • 向搜索框中输入selenium测试 通过TouchAction点击搜索框滑动到底部,点击下一页
  • 关闭Chrome
from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver import TouchActions

class TestTouchAction:

    def setup(self):
        """当使用TouchAction时会报错不是w3c的标准命令,可以使用以下解决"""
        option = webdriver.ChromeOptions()
        option.add_experimental_option('w3c', False)
        self.driver = webdriver.Chrome(options=option)

        self.driver.maximize_window()
        self.driver.implicitly_wait(3)

    def teardown(self):
        self.driver.quit()

    def test_scroll_bottom(self):
        self.driver.get("http://www.baidu.com")
        ele_input = self.driver.find_element_by_id('kw')
        ele_input.send_keys('selenium测试')   # 输入框中输入内容
        ele_search = self.driver.find_element_by_id('su')
        action = TouchActions(self.driver)
        action.tap(ele_search).perform()  # 点击百度一下进行搜索
        action.scroll_from_element(ele_input, 0, 10000).perform()   # 完成页面滑动
        sleep(2)
        self.driver.find_element_by_link_text("下一页 >").click()  # 滑动到最下面点击下一页
        sleep(1)

if __name__ == '__main__':
    pytest.main(['-v', '-s', 'test_TouchAction.py'])

表单操作(与正常元素操作一致)

表单定义

  • 什么是表单?
  • 表单是一个包含表单元素的区域。
  • 表单元素是允许用户在表单中(比如:文本域、下拉列表、单选框、复选框等等)输入
    信息的元素。
  • 表单使用表单标签(<form>)定义。例如:<form><input / >< / form>
  • 操作表单元素步骤:
    • 首先要定位到表单元素
    • 然后去操作元素(清空、输入或者点击等)
  • 表单结构,类似于Excel中的表格


    image.png

表单案例

from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

class TestForm:

    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)

    def teardown(self):
        self.driver.quit()

    def test_form(self):
        self.driver.get("https://testerhome.com/account/sign_in")
        self.driver.find_element_by_id('user_login').send_keys("123")   # 输入用户名
        self.driver.find_element_by_id('user_password').send_keys('password') # 输入密码
        self.driver.find_element_by_id('user_remember_me').click()  # 点击记住登录状态
        self.driver.find_element(By.XPATH, '//*[@name="commit"]').click() # 点击登录即提交表单按钮
        sleep(3)

if __name__ == '__main__':
    pytest.main(['-v', '-s', 'test_form.py'])

下一节:网页frame与多窗口处理,包括多窗口、多frame下的窗口识别与切换。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容