-
鼠标事件
ActionChains 类鼠标操作的常用方法:
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停在一个元素上
click_and_hold() 按下鼠标左键在一个元素上
具体操作:
注意: 我们要使用的是ActionChains类下面的方法之前,要先将包引入from selenium.webdriver.common.action_chains import ActionChains
ActionChains()
ActionChains(driver)
driver: webdriver 实例执行用户操作
ActionChains 用于生成用户的行为;所有的行为都存储在actionchains 对象。通过perform()执行存储的行为。
语法:ActionChains(driver).鼠标事件方法.perform()
context_click() 右击#选择需要鼠标右击的目标元素 right = driver.find_element_by_css_selector('a[title="自动化相关"]') #执行鼠标右击操作 ActionChains(driver).context_click(right).perform()
double_click() 双击
# 定位到要双击的元素 double_click = driver.find_element_by_id("kw") # 双击操作 ActionChains(driver).double_click(double_click).perform()
drag_and_drop(source,target) 拖动
source:鼠标拖动的源元素;
target:鼠标释放的目标元素;
语法:
drag_and_drop(起始元素,目标元素) # 将起始元素,拖动到目标元素drag_and_drop_by_offset(起始元素,x坐标,y坐标) #将起始元素,拖动到指定的坐标位置
move_to_element() 悬停(将鼠标移动到某个元素上)# 定位到要悬停的元素 above = driver.find_element_by_link_text("设置") # 悬停操作 ActionChains(driver).move_to_element(above).perform()
click_and_hold() 按下鼠标在一个元素上
#定位到鼠标按下左键的元素 left=driver.find_element_by_xpath("xxx") #对定位到的元素执行鼠标左键按下的操作 ActionChains(driver).click_and_hold(left).perform()
-
键盘事件
我们在实际的测试工作中,有时候我们在测试时需要使用tab 键将焦点转移到下一个元素,用于验证元素的排序是否正确。webdriver 的Keys()类提供键盘上所有按键的操作,甚至可以模拟一些组合建的操作,如Ctrl+A ,Ctrl+C/Ctrl+V 等。在某些更复杂的情况下,还会出现使用send_keys 来模拟上下键来操作下拉列表的情况。
使用Keys类来处理键盘操作:
send_keys(Keys.BACK_SPACE) 删除键(Backspace) send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) Tab键 send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter) send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') 复制(Ctrl+C) send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V) send_keys(Keys.F1) 键盘F1
send_keys(Keys.F12) 键盘F12
脚本代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
"""
键盘事件
6. """
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Selenium")
time.sleep(2)
# Ctrl+A 全选操作
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(2)
# Ctrl+C 复制操作
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'c')
time.sleep(2)
driver.get("http://cn.bing.com")
time.sleep(2)
# Ctrl+V 粘贴操作
driver.find_element_by_id("sb_form_q").send_keys(Keys.CONTROL,'v')
time.sleep(2)
# 回车键操作
driver.find_element_by_id("sb_form_q").send_keys(Keys.ENTER)
time.sleep(2)
driver.quit()
3.下拉菜单选择
如图所示:带有<select></select>标签的下拉菜单选择页面源码:
如果使用普通方法来定位的话,先定位下拉菜单,再定位菜单中的具体元素,对下拉菜单进行二次定位。
#先定位下拉框
selector = driver.find_element_by_id('select_demo')
#操作下拉框选项--选择香蕉
element = selector.find_element_by_xpath('//option[@value="banana"]').click()
使用select类来处理下拉菜单(推荐方法):
Select(select标签元素).select_by_index() 通过选项索引值定位 索引从0开始
Select(select标签元素).select_by_value() 通过选项value属性值定位
Select(select标签元素).select_by_visible_text() 通过选项的text值定位
from selenium import webdriver
import os,time
from selenium.webdriver.support.ui import Select
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('Test_select.html')
driver.get(file_path)
time.sleep(2)
select = Select(driver.find_element_by_id('select_demo'))
time.sleep(2)
#通过value来选择
select.select_by_value('banana')
time.sleep(2)
#通过index来选择
select.select_by_index(4)
time.sleep(2)
#通过文本直接选择
select.select_by_visible_text('葡萄')
time.sleep(5)
driver.quit()
4.滚动条操作
WebDriver类库中并没有直接提供对滚动条进行操作方法,但是它提供了可调用JavaScript脚本的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的;
设置JavaScritp脚本控制滚动条:js="window.scrollTo(0,1000)"
(0:水平距离;1000:垂直距离;单位像素)
WebDriver调用js脚本方法:driver.execute_script(js)
聚焦到某个元素同样是调用JavaScript脚本的方法:
target = driver.find_element_by_xxxx()
driver.execute_script("arguments[0].scrollIntoView();", target)
5.iframe操作
在Web应用中经常会遇到表单嵌套页面,Frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位;而frame和iframe需要切换进去才能定位到其中的元素。这时就需要通过switch_to.frame()方法将当前定位的主体切换为 frame/iframe表单的内嵌页面中。
具体方法:
1、switch_to.frame() 默认可以直接取表单的id或name属性进行切换,也可以用Xpath等。
2、switch_to.parent_frame() 跳出当前层
3、switch_to.default_content() 返回最外层
from selenium import webdriver
import time
import os
"""
多表单切换
"""
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('frame.html')
driver.get(file_path)
driver.implicitly_wait(5)
#先找到到iframe1(id = f1)
driver.switch_to_frame('f1')
#再找到iframe2(id = f2)
driver.switch_to_frame('f2')
#操作表单内元素
ele = driver.find_element_by_id('kw')
ele.clear()
ele.send_keys('源码教育')
driver.find_element_by_id('su').click()
#跳出当前层
driver.switch_to.parent_frame()
time.sleep(5)
driver.quit()
注意:
- 1.进入iframe,一层一层进入,不能跳跃
- 2.退出iframe,具体使用哪种退出方式,需要看后续操作步骤根据下一个所操作的元素所在位置决定
- 3.退出iframe,可以一次性退出
- 4.iframe在页面中的应用场景:
1.登录
2.后台管理系统菜单栏
3.富文本编辑器
6.多窗口切换
在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口上进行操作。switch_to.window()方法可以实现在不同的窗口之间切换。
语法:
current_window_handle 获得当前窗口句柄
window_handles 获取所有窗口句柄
switch_to.window() 切换窗口
from selenium import webdriver
import time
"""
多窗口切换
"""
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
#获得当前窗口
sreach_windows = driver.current_window_handle
driver.find_element_by_link_text('登录').click()
driver.implicitly_wait(5)
driver.find_element_by_link_text('立即注册').click()
# 获取所有窗口句柄
all_handles = driver.window_handles
# 进入注册窗口页面
for handle in all_handles:
if handle != sreach_windows:
# 切换窗口
driver.switch_to.window(handle)
driver.find_element_by_name("userName").send_keys("userName")
time.sleep(2)
# 进入搜索窗口页面
for handle in all_handles:
if handle == sreach_windows:
# 切换窗口
river.switch_to.window(handle)
driver.back()
time.sleep(5)
driver.find_element_by_id("kw").send_keys("Selenium")
driver.find_element_by_id("su").click()
time.sleep(2)
driver.quit()
7.弹窗处理
webdriver 中处理JavaScript 所生成的alert、confirm 以及prompt 是很简单的。具体思路是使用switch_to.alert方法定位到alert/confirm/prompt。然后使用text/accept/dismiss/send_keys 按需进行操做。
- 1.获取弹窗文本内容 alert.text
- 2.在弹窗中输入文字 alert.send_keys()
- 3.点击弹窗确定按钮 alert.accept()
-4.点击弹窗取消按钮 alert.dismiss()
自定义弹窗处理
由于alert弹窗不美观,现在大多数网站都会使用自定义弹窗,使用Selenium自带的方法就驾驭不了了,此时就要搬出JS方法。
处理这种弹窗可以利用HTML DOM Style 对象,有一个display属性,可以设置元素如何被显示。
js1 = 'document.getElementById("div_company_mini").style.display="none";'
driver.execute_script(js1)
js2 = 'document.getElementById("side-bar").style.display="none";'
driver.execute_script(js2)
8.单选框和复选框
单选框:在HTML代码里,type="radio",一组单元的name都相同
判断元素是否被选中:元素.is_selectde()
多选框:在HTML代码里,type="checkbox",name属性相同
具体实现的代码如下:
from selenium import webdriver
import time
eles = driver.find_elements_by_name('checkbox')
# 遍历元素,判断是否已经选择,未选择,则全选
# for i in eles:
# if not i.is_selected():
# i.click()
time.sleep(3)
options = ('购物','音乐') # 选择指定的复选框
for i in eles: # 遍历复选框
if i.get_attribute('value') in options: # 判断复选框的值是否在选项里
if not i.is_selected():
i.click()