python selenium-webdriver 元素操做之鼠标操做(四)

上节内容主要说明了元素的定位,本节内容说要说对元素的操做,元素的操做分为两部分一部分是鼠标的操做,另外一种是对键盘对元素的操做,下面咱们主要讲解一下鼠标对元素的操做。html

webdriver 模块中几种比较常见的几种操做元素的方式:web

1.clear()       #清楚输入框的内容分布式

2.send_keys('内容') #在文本框内输入内容测试

3.click()        #点击按钮动画

4.submit()        #表单的提交ui

webdriver 中 clear(),send_keys(),click() 这几个方法比较经常使用,前面篇幅已经咱们看到对send_keys('内容')、click()已经使用过,下面咱们看一下clear()和submit()的使用。spa

  • 方法:submit()

    解释:查找到表单(from)直接调用submit便可3d

    实例:driver.find_element_by_id("form1").submit()code

  • 方法:clear() 

    解释:因为有些文本框内包含默认值,咱们须要使用clear()清理再次输入orm

    实例:driver.find_element_by_id("kw").clear()

上面介绍的几种方法比较简单,下面介绍一些其余的模拟操做,好比单击,双击、右击,元素的拖拽等,若是使用这些模拟的时候,须要使用到另外一个模块 ActionChains,这个模块基本能够知足咱们对鼠标操做的需求。

使用ActionChains的时候咱们须要在头上引入该模块

from selenium.webdriver.common.action_chains import ActionChains

下面首先看一下ActionChains的执行原理,当调用ActionChains方法的时候不会当即执行,而是将全部的操做暂时存储在一个队列中,当调用perform()的方法时候,队列会按照放入的前后顺序依次执行。

这里咱们先看个小示例

#-*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get('http://cn.bing.com/')
driver.maximize_window()
searchElement = driver.find_element_by_id('sb_form_q').send_keys('selenium')
searchButtonElement = driver.find_element_by_id('sb_form_go')
ActionChainsDriver = ActionChains(driver).click(searchButtonElement)
# ActionChainsDriver.perform()   #此时咱们不执行perform() 
time.sleep(5)
driver.quit()

此时没有执行perform(),咱们能够看到虽然使用click()点击了搜索按钮,可是确实没有执行点击搜索过程。 

下面咱们看一下添加了perform()的执行结果

此时咱们已经能够看到执行了点击搜索按钮,执行了搜索操做。

下面咱们来看一下ActionChains 提供了那些方法

  • 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)             #鼠标移动到距离当前位置(x,y)
  • move_to_element(to_element)               #鼠标移动到某个元素
  • move_to_element_with_offset(to_element, xoffset, yoffset) #将鼠标移动到距某个元素多少距离的位置
  • release(on_element=None)                     #在某个元素位置松开鼠标左键
  • perform()                                             #执行链中的全部动做

下面咱们来详细的介绍一下上面提到的方法,那么这个时候须要咱们看一下AcitonChains的书写方法。

  • 链条式方法
searchElement = driver.find_element_by_id('sb_form_q').send_keys('selenium')
searchButtonElement = driver.find_element_by_id('sb_form_go')
ActionChains(driver).click(searchButtonElement).perform()     #使用一行将全部的步骤写完
  • 分布式方法
searchElement = driver.find_element_by_id('sb_form_q').send_keys('selenium')
searchButtonElement = driver.find_element_by_id('sb_form_go')
ActionChainsDriver = ActionChains(driver).click(searchButtonElement)   #分开两步进行书写
ActionChainsDriver.perform()

 根据以上内容能够对ActionChains的鼠标的方法分为3大类,鼠标点击,鼠标的移动,经过鼠标对元素的拖拽、

1.鼠标的点击

  • 右击 ----> context_click(rightButtonElement)
  • 双击 ----> double_click(doubleButtonElement)
  • 单击 ----> click(buttonElement)
  • 按住左键  ----> click_and_hold(clickHoldElement)

我这边写了一个简单的页面,主要来模拟以上的操做,你们也能够找一些页面来试试下面的例子,也可使用个人页面。

#-*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get('file:///C:/Users/hunk/Desktop/demo_clicks.html')
driver.maximize_window()
# 首先咱们须要获取到要操做的元素,而后再次进行操做
doubleButtonElement = driver.find_element_by_xpath('/html/body/form/input[2]')   #获取双击按钮元素
buttonElement = driver.find_element_by_xpath('/html/body/form/input[3]')         #获取单击按钮元素
rightButtonElement = driver.find_element_by_xpath('/html/body/form/input[4]')    #获取右击按钮元素
clickHoldElement = driver.find_element_by_xpath('/html/body/form/input[5]')      #获取按住不放按钮元素
'''内容开始的时候咱们也介绍说明,当调用perform()方法时才会执行鼠标操做'''
#双击操做
ActionDoubleClick= ActionChains(driver).double_click(doubleButtonElement)
ActionDoubleClick.perform() 
time.sleep(3)
# 单击操做
ActionClick = ActionChains(driver).click(buttonElement)
ActionClick.perform()
time.sleep(3)
# 右击操做
ActionContextClick = ActionChains(driver).context_click(rightButtonElement)
ActionContextClick.perform()
time.sleep(3)
#按住不放左键
ActionClickHold = ActionChains(driver).click_and_hold(clickHoldElement)
ActionClickHold.perform()
time.sleep(3)
driver.quit()

下面是咱们执行上面的代码的效果,是否是很神奇吧。

 2.鼠标的移动

  • 鼠标移动到距离当前位置(x,y)---->  move_by_offset(xoffset, yoffset)
  • 鼠标移动到某个元素 ----> move_to_element(MoveElement)

 示例:

#-*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get('file:///C:/Users/hunk/Desktop/text3.html')
driver.maximize_window()
#第一个操做:鼠标移动到某个元素
#为了演示,开始设置标签的颜色淡蓝色,当鼠标移到到该元素时标签颜色变为红色
MoveElement = driver.find_element_by_xpath('//*[@id="box1"]')   #鼠标移到到目标元素
time.sleep(3)
'''将鼠标移到MoveElement'''
Action = ActionChains(driver)

Action.move_to_element(MoveElement).perform()
time.sleep(5)
driver.save_screenshot('move_to_element.png')   #记录一下咱们开始的坐标位置
'''x坐标为正数向右偏移,x坐标为负数向左偏移'''
'''y坐标为正数向下偏移,y坐标为负数向上偏移'''
#为了更好的显示咱们效果,当鼠标移动到目标位置的时候,咱们显示了鼠标的坐标,之后让当前的位置变成绿色
Action.move_by_offset(-311,-11).perform() #move_by_offset以鼠标当前的位置为中心进行偏移,移动到距离当前位置(x,y)
time.sleep(5)
driver.save_screenshot('move_by_offset.png')   #记录一下咱们移动后的坐标位置
driver.quit()

根据咱们先后保存的图片能够计算到咱们移动的偏移是否正确,这个你们能够根据实际来计算一下。

以上代码执行的效果以下显示

以上咱们队鼠标的点击和移动讲解完成,下面咱们看一下把点击和移动放在一块儿的效果,那就是对元素的拖拽。

鼠标的操做第三部分:拖拽

  • 将某个元素拖拽到某个元素而后松开 ----> rag_and_drop(source, target)
  • 拖拽到某个坐标而后松开 ---->  drag_and_drop_by_offset(source, xoffset, yoffset) 

以上的两个方法具体的使用

#-*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get('file:///C:/Users/hunk/Desktop/text3.html')
driver.maximize_window()
#第一个操做:鼠标移动到某个元素
#为了演示,开始设置标签的颜色淡蓝色,当鼠标移到到该元素时标签颜色变为红色
dragElement = driver.find_element_by_xpath('//*[@id="box1"]')   #获取被拖拽的元素
targetElement = driver.find_element_by_xpath('//*[@id="area1"]')   #获取被拖拽到的目标
Action = ActionChains(driver)
'''将【拖拽我吧!】元素拖拽到第一个对话框'''
Action.drag_and_drop(dragElement,targetElement).perform()   #将【拖拽我吧!】拖到第一个对话框
time.sleep(5)
'''将【拖拽我吧!】元素拖拽到距离当前位置(45,200),也就是拖拽到第二个对话框'''
'''因为第一次咱们已经将元素拖拽到了第一个对话框,因此咱们实际的拖拽是从第一个对话框拖拽到第二个对话框'''
Action.drag_and_drop_by_offset(dragElement,45,200).perform()
time.sleep(5)
driver.quit()

为了更好的让你们看到代码的实际效果,我这边将全部的操做结果制做成为动画

 上面讲解的拖拽是selenium本身带的拖拽方法,咱们是否能够讲鼠标的移动和点击生成一个新的拖拽

首先咱们来思考一下如何实现拖拽?

咱们须要选择一个元素而后按住鼠标左键到某个地方松开鼠标实现拖拽

#-*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get('file:///C:/Users/hunk/Desktop/text3.html')
driver.maximize_window()
#第一个操做:鼠标移动到某个元素
#为了演示,开始设置标签的颜色淡蓝色,当鼠标移到到该元素时标签颜色变为红色
dragElement = driver.find_element_by_xpath('//*[@id="box1"]')   #获取被拖拽的元素
targetElement = driver.find_element_by_xpath('//*[@id="area3"]')   #获取被拖拽到的目标
Action = ActionChains(driver)
'''将【拖拽我吧!】元素拖拽到第三个对话框'''
#首先选择元素,按住不放,而后移动元素,最后松开鼠标,完成拖拽
Action.click_and_hold(dragElement).move_to_element(targetElement).release().perform()
time.sleep(5)
driver.quit()

效果:

此时咱们将鼠标的操做基本讲解完成了,实际过程当中使用点击的操做比较多,移动和拖拽使用的比较少,也是我在13年作医疗自动化测试项目时,选择预定日期的时候使用了一次,后面的项目基本没有再次使用过。

内容中使用的测试页面你们能够经过http://files.cnblogs.com/files/mengyu/%E6%B5%8B%E8%AF%95%E6%96%87%E4%BB%B6.rar进行下载

相关文章
相关标签/搜索