IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Selenium:鼠标事件 -> 正文阅读

[开发测试]Selenium:鼠标事件

鼠标事件

1、前面介绍了Selenium中模拟鼠标"左键单击"的方法click(),仅仅只有这个方法是完全不够的。现在的Web产品中提供了更丰富的鼠标交互方式
?? ?⑴例如鼠标右击、双击、悬停、拖动等功能
?? ?⑵同样的在Selenium中也提供了对应的方法来模拟这些鼠标操作

2、在WebDriver中,将这些关于鼠标操作的方法封装在了ActionChains类中
?? ?⑴类名ActionChains两个单词首字母需要大写

3、ActionChains类下的鼠标方法在使用前都需要先实例化一个ActionChains对象,最后使用perfrom()方法进行提交动作
?? ?⑴使用ActionChains对象调用其下的鼠标方法

执行动作

1、方法名:perfrom()

2、之所以要先介绍这个方法是因为这个方法的作用为:执行所有的ActionChains中存储的行为,可以理解成对整个操作的提交动作
?? ?⑴也就是说:在ActionChains类中的所有鼠标方法,都需要经过这个方法进行提交

3、调用ActionChains类方法(鼠标操作方法)时,不会立即执行,而是将所有操作都存放在一个队列里,当调用perform()方法时,队列里的操作会依次执行
?? ?⑴可以理解为对鼠标事件的提交操作

4、这个方法都是与其他鼠标方法结合起来使用的,因此会在后面的例子中进行演示

鼠标左键单击

1、方法名:ActionChains对象.click(on_element=None)
?? ?⑴作用:模拟鼠标"左键单击"
?? ?⑵参数on_element:指被点击的元素的WebElement对象,如果该参数为none,将单击当前鼠标所在位置

2、这里的要介绍的鼠标"左键单击"方法click()与前面介绍的鼠标"左键单击"方法click()只是方法名一样,他们属于不同的类方法
?? ?⑴这里介绍的click()方法:属于ActionChains类,是ActionChains对象下的一个方法
?? ?⑵前面介绍的click()方法:属于WebElement类,是WebElement对象下的一个方法
?? ?⑶只是说这两个方法都有模拟鼠标"左键单击"的作用
?? ?⑷相比较下ActionChains类中click()方法的使用范围可能会更大一点
?? ??? ?①ActionChains类中的click():不仅可以对元素进行左键点击,还可以左键点击页面任意位置(不是可点击元素也能进行点击)
?? ??? ?②WebElement类中的click():只能对可点击元素进行左键点击
?? ??? ?③当然应该WebElement类中click()是经常使用到的

WebElement类中的click()

1、方法:WebElement对象.click()
?? ?①该方法属于WebElement类,是WebElement对象下的一个方法,不需要传入参数
?? ?⑵find_element_by_*等方法返回值是一个WebElement对象,可以直接对WebElement对象使用该方法进行左键点击操作

2、作用:模拟鼠标"左键单击"
?? ?①该方法只能对可点击元素进行左键点击

3、该方法源码如下

例1:

from selenium import webdriver

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 定位登录按钮
login = driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]')
print("find_element_by_*方法返回值类型为:",type(login))
# 对登录按钮进行点击操作
login.click()

"""
# find_element_by_*等方法返回值类型为一个WebElement对象
find_element_by_*方法返回值类型为: <class 'selenium.webdriver.remote.webelement.WebElement'
"""

ActionChains类中的click()

1、方法:ActionChains对象.click(on_element=None)
?? ?①该方法属于ActionChains类,是ActionChains对象下的一个方法
?? ?⑵该方法需要传入参数,参数为None或一个WebElement对象

2、作用:模拟鼠标"左键单击"
?? ?①该方法不仅可以对元素进行左键点击,还可以左键点击页面任意位置(不是可点击元素也能进行点击)

3、该方法源码如下
例2:左键点击元素

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 定位登录按钮
login = driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]')
print("find_element_by_*方法返回值类型为:",type(login))
# 对登录按钮进行点击操作并提交动作
# 链式调用:ActionChains(driver).click(login).perform()
actionChains = ActionChains(driver) # 实例化一个actionChains对象,将浏览器对象作为参数传入
print("实例化一个ActionChains对象:",type(actionChains))
#调用ActionChains对象下的click()方法传入要操作的WebElement对象并提交动作
actionChains.click(login).perform()

"""
find_element_by_*方法返回值类型为: <class 'selenium.webdriver.remote.webelement.WebElement'>
实例化一个ActionChains对象: <class 'selenium.webdriver.common.action_chains.ActionChains'>
"""

鼠标右键单击

1、方法:ActionChains对象.context_click(on_element=None)
?? ?⑴参数on_element:指被点击的元素的WebElement对象,如果该参数为none,将单击当前鼠标所在位置

2、作用:模拟鼠标"右键单击"

例3:

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 定位首页图片
img = driver.find_element_by_xpath('//*[@id="s_lg_img"]')
# 对首页图片进行右键点击
ActionChains(driver).context_click(img).perform()

鼠标悬停

1、方法:ActionChains对象.move_to_element(to_element)
?? ?⑴参数to_element:指被悬停的元素的WebElement对象

2、作用:将鼠标移动到某个元素上,模拟鼠标"悬停"

例4:

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 定位首页设置按钮:实际操作可以发现只需要将鼠标放在该元素上(不需要点击)就能弹出下拉框
element = driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')
# 将鼠标悬停在设置按钮
ActionChains(driver).move_to_element(element).perform()
# 点击下拉框按钮
driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[4]').click()

# 前面我们也使用过这个例子,不过当时使用的是点击[设置]按钮,这里使用的是悬停,效果都一样

鼠标拖动

1、在实际使用Web网页过程中会遇到很多需要拖动标签元素的操作,比如拖动验证码等等

2、在鼠标拖动操作中其实也分为了几种场景:
?? ?⑴按住滑块,拖动完成拼图(经常遇到:登录验证等)
?? ?⑵将元素拖到另一个元素处(较少遇到)

3、在WebDriver中也提供了对应的方法来实现元素的鼠标拖动


drag_and_drop()

1、方法名:ActionChains对象.drag_and_drop(source, target)
?? ?⑴source:元素的起点
?? ?⑵target:元素的终点
?? ?⑶drag_and_drop()方法涉及到参数传递,一个是要拖拽元素的起点,一个是要拖拽元素的终点(起点和终点都是标签对象)

2、这里所谓的拖动,就是鼠标左键点击标签不松开,直到拖动到指定标签后再松开(该方法会自动松开鼠标)
?? ?⑴drag_and_drop()方法涉及到两个标签元素:一个起点标签,一个终点标签
?? ?⑵相当于说把一个元素拖到另一个元素处

例5:

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://www.jq22.com/demo/pintu20151229/')
# 点击[开始]按钮
driver.find_element_by_xpath('//*[@id="start"]').click()
time.sleep(5)
# 定位某一张小图片(开始标签)
imgOne = driver.find_element_by_xpath('//*[@id="container"]/div[1]')
# 定位第二张小图片(结束标签)
imgTwo = driver.find_element_by_xpath('//*[@id="container"]/div[25]')
# 将第一张小图片移动到第二章小图片处
ActionChains(driver).drag_and_drop(imgOne,imgTwo).perform()

drag_and_drop_by_offset()?? ?

1、方法名:drag_and_drop_by_offset(source, xoffset, yoffset)
?? ?⑴source:鼠标按下的元素(待移动的元素)
?? ?⑵xoffset:要移动到的X(横向)偏移量(像素)
?? ?⑶yoffset:要移动到的Y(纵向)偏移量(像素)

2、作用:鼠标左键单击不松开,将元素移动到指定坐标后松开(该方法会自动松开鼠标)
?? ?⑴也就是拖拽元素到某个坐标后松开

例6:

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://passport.jd.com/new/login.aspx')
# 点击[账户登录]按钮
driver.find_element_by_xpath('//*[@id="content"]/div[2]/div[1]/div/div[3]/a').click()
time.sleep(2)
# 输入用户信息
driver.find_element_by_xpath('//*[@id="loginname"]').send_keys('账号')
driver.find_element_by_xpath('//*[@id="nloginpwd"]').send_keys('密码')
# 点击登录按钮
driver.find_element_by_xpath('//*[@id="loginsubmit"]').click()
# 定位并拖动拼图按钮:多拖动几次方便看
element = driver.find_element_by_xpath('//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[2]/div[3]')
ActionChains(driver).drag_and_drop_by_offset(element, 200, 0).perform()
time.sleep(2)
ActionChains(driver).drag_and_drop_by_offset(element, 50, 0).perform()
time.sleep(2)
ActionChains(driver).drag_and_drop_by_offset(element, 100, 0).perform()

注:
1、上面例子中:通过查看元素可以发现,这种拖动场景只有一个待拖动的元素(按钮),是拖动这个元素到达一定的位置来完成拼图的?

2、这个例子只是说明下怎么移动一个元素到指定坐标处,没有确保拼图是正确的,只是有拖这个动作

3、两个拖动方法的区别:
?? ?⑴drag_and_drop():将元素A移动到元素B处,需要两个元素标签
?? ?⑵drag_and_drop_by_offset():将元素A移动到指定位置处,只有一个标签与目的地坐标
?? ?

鼠标移动

1、方法:ActionChains对象.move_by_offset(xoffset, yoffset)
?? ?⑴xoffset:要移动到的X(横向)偏移量(像素),为正整数或负整数
? ? ⑵yoffset:要移动到的Y(纵向)偏移量(像素),为正整数或负整数

2、作用:将鼠标从当前位置移动到指定坐标处
?? ?⑴move_to_element()方法也是移动鼠标:将鼠标移动到某个元素上,从而模拟鼠标"悬停"

例7:

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://passport.jd.com/new/login.aspx')
# 点击[账户登录]按钮
driver.find_element_by_xpath('//*[@id="content"]/div[2]/div[1]/div/div[3]/a').click()
time.sleep(2)
# 输入用户信息
driver.find_element_by_xpath('//*[@id="loginname"]').send_keys('账号')
driver.find_element_by_xpath('//*[@id="nloginpwd"]').send_keys('密码')
# 点击登录按钮
driver.find_element_by_xpath('//*[@id="loginsubmit"]').click()
# 定位并拖动拼图按钮:多拖动几次方便看
element = driver.find_element_by_xpath('//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[2]/div[3]')
action = ActionChains(driver)
# 第一步:在滑块处按住鼠标左键
action.click_and_hold(element)
# 第二步:相对鼠标当前位置进行移动
action.move_by_offset(100,0) ? ?#(100,0)指的是横向向滑动100px,纵向位置不变
# 第三步:释放鼠标,这里必须释放鼠标,不然鼠标会一直处于点击状态
action.release()
# 执行动作
action.perform()

# 使用click_and_hold()方法和move_by_offset()方法组合起来也可以实现验证码拖动的功能

ActionChains类下所有的鼠标方法

1、在WebDriver中,关于鼠标相关操作的方法都封装在ActionChains类中,在ActionChains类下还有其他方法,可以了解下

方法名?描述
perform()?提交鼠标动作
reset_actions()清除所有已存储的动作?? ???
click(on_element=None)?鼠标左键单击??
click_and_hold(on_element=None)?鼠标左键单击,但不松开
context_click(on_element=None)?鼠标右键单击??
double_click(on_element=None)鼠标左键双击??
drag_and_drop(source, target)?鼠标左键单击不松开,并移动到指定元素位置后松开(即拖拽)?
drag_and_drop_by_offset(source, xoffset, yoffset)鼠标左键单击不松开,并移动到指定坐标后松开(即拖拽)?
move_by_offset(xoffset, yoffset)??将鼠标移动到某个坐标?? ?
move_to_element(to_element)?将鼠标移动到某个元素上(悬停)?? ??? ??? ?
move_to_element_with_offset(to_element, xoffset, yoffset)?将鼠标移动到距离某个元素的某个距离
release(on_element=None)?松开鼠标左键?? ??? ???
pause(seconds)?暂停输入
send_keys(*keys_to_send)在当前元素中输入值
send_keys_to_element(element, *keys_to_send)?给某个元素输入值?? ??? ??? ??? ??? ??? ??? ??
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 22:07:59  更:2022-03-13 22:08:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:43:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码