前文说了怎么定位元素,接下里的就是怎么通过获取的元素来进行模拟键鼠操作,并告诉大家selenium工具中的特殊操作多窗口和句柄
本文纯属文本笔记分享,需要这次知识的视频教程的小伙伴可以点击文末小卡片免费获取
2.6 操作元素(键盘和鼠标事件)
前言
在前面的几篇中重点介绍了一些元素的到位方法,到位到元素后,接下来就是需要操作元素了。本篇总结了 web 页面常用的一些操作元素方法,可以统称为行为事件有些 web 界面的选项菜单需要鼠标悬停在某个元素上才能显示出来(如百度页面的设置按钮)。
2.6.1 简单操作
点击(鼠标左键)页面按钮:click()
清空输入框:clear()
输入字符串:send_keys()
send_keys()如果是发送中文的,前面需加 u,如:u"中文",因为这里是输入到 windows 系统了,windows 系统是 GBK 编码,我们的脚本是 utf-8,需要转码为 Unicode 国际编码,返样才能识删到。
# coding :utf-8
from selenium import webdriver
duiver = webdriver.Firefox()
driver.get("https://www.baidu.com")
# inmlicitly_wait是隐式等待,作用全局的
driver.implicitly_wait(10)
driver.find_element_by_id("kw").clear()
# sen _keys里如果是中文的话,前面加u
driver.find_element_by_id("kw").send_keys(u"测试")
driver.find_element_by_id("su").click()
2.6.2 submit 提交表单
- 在前面百度搜索案例中,输入关键字后,可以直接按回车键搜索,也可以点搜索按钮
搜索。 - submit()一般用于模拟回车键
# coding :utf-8
from selenium import webdriver
inport random
duiver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("kw").send_keys(u"软件测试")
# submint()模拟enter键提交表单
2.6.3 键盘操作
- selenium 提供了一整套的模拟键盘操作事件,前面 submit()方法如果不行的话,可以试试模拟键盘事件
- 模拟键盘的操作需要先导入键盘模块:from selenium.webdriver.common.keys import Keys
- 模拟 enter 键,可以用 send_keys(Keys.ENTER)
# coding :utf-8
from selenium import webdriver
inport random
duiver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("search-button").click()
driver.find_element_by_id("search-term").clear()
driver.find_element_by_id("searcj-term").send_keys("seleniu")
# 模拟enter键操作回车按钮
driver.find_element_by_id("search-term").send_keys(Keys.ENTER)
4.其它常见的键盘操作:
- 键盘 F1 到 F12:send_keys(Keys.F1) 把 F1 改成对应的快捷键
- 复刢 Ctrl+C:send_keys(Keys.CONTROL,‘c’)
- 粘贴 Ctrl+V:send_keys(Keys.CONTROL,‘v’)
- 全选 Ctrl+A:send_keys(Keys.CONTROL,‘a’)
- 剪切 Ctrl+X:send_keys(Keys.CONTROL,‘x’)
- 列表键 Tab: send_keys(Keys.TAB)
这里只是列了一些常用的,当然除了键盘事件,也有鼠标事件
2.6.4 鼠标悬停事件
- 鼠标不仅仅可以点击(click),鼠标还有其它的操作,如:鼠标悬停在某个元素上,鼠标
点击,鼠标按住某个按钮拖栋 - 鼠标事件需要先导入模块:from selenium.webdriver.common.action_chains
import ActionChains
perform() 执行所有 ActionChains 中的行为
move_to_element() 鼠标悬停
3.这里以百度页面设置按钮为例
# coding :utf-8
from selenium import webdriver
inport random
duiver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
# 鼠标悬停在搜索设置按钮上
mouse = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
4.除了常用的鼠标悬停事件外,还有
右击鼠标:context_click()
双击鼠标:double_click()
依葫芦画瓢,替换上面案例中对应的鼠标事件就可以了
selenium 提供了一整套完整的鼠标和键盘行为事件,功能还是蛮强大滴。
2.7 多窗口、句柄(handle)
前言
有些页面的链接打开后,会重新打开一个窗口,对亍这种情况,想
在新页面上操作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,
所以叧需要切换句柄,我们就能在多个页面上灵活自如的操作了。
2.7.1 认识多窗口
- 打开赶集网:http://bj.ganji.com/,点击招聘求职按钮会发现右边多了一个窗口标签
2.我们用代码去执行点击的时候,发现界面上出现两个窗口,如下
图这种情况就是多窗口了。
3.到这里估计有小伙伴纳闷了,手工点击是 2 个标签,怎么脚本点
击就变成 2 个窗口了,这个在 2.1 里面讲过,脚本执行是不加载配置的,
手工点击是浏览器默认设置了新窗口打开方式为标签,这里用鼠标按住
点二个标签,拖拽出来,也就变成 2 个窗口了,是一回事。
2.7.2 获取当前窗口句柄
- 元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。
- 人为操作的话,可以通过眼睛看,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能句柄来判断了。
- 获取当前页面的句柄:driver.current_window_handle
# coding :utf-8
from selenium import webdriver
inport random
duiver = webdriver.Firefox()
driver.get("https://bj.ganji.com")
driver.implicitly_wait(10)
# 获取当前窗口句柄
h = driver.current_window_handle
print h
2.7.3 获取所有句柄
1.定位赶集网招聘求职按钮,并点击
2.点击后,获取当前所有的句柄:window_handles
# coding :utf-8
from selenium import webdriver
duiver = webdriver.Firefox()
driver.get("https://bj.ganji.com")
driver.implicitly_wait(10)
h = driver.current_window_handle
print h # 打印首页句柄
driver.find_element_by_link_text("招聘求职").click()
all_h = driver.weindow_handles
print all_h #打印所有的句柄
2.7.4 切换句柄
网上大部分教程都是些的第一种方法,这里新增一个更简单的方法,直接从获取所有的句柄 list 里面取值。
方法一:
- 循环判断是否与首页句柄相等
- 如果不等,说明是新页面的句柄
- 获取的新页面句柄后,可以切换到新打开的页面上
- 打印新页面的 title,看是否切换成功
方法二:
- 直接获取 all_h 这个 list 数据里面第二个 hand 的值:all_h[1]
# 方法一:判断句柄,不等于首页就切换
# for i in all_h:
# if i != h:
# driver.switch_to.window(i)
# print driver.title
# 方法二:获取list里面第二个直接切换
driver.switch_to.window(all_h[1])
print driver0title
# 关闭新窗口
2.7.5 关闭新窗口,切回主页
- close 是关闭当前窗口,因为此时有两个窗口,用 close 可以关闭其中一个,quit 是退出整个进程(如果当前有两个窗口,会一起关闭)。
- 切换到首页句柄:h
- 打印当前页面的 title,看是否切换到首页了
2.7.6 参考代码
# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://bj.ganji.com/")
h = driver.current_window_handle
print h # 打印首页句柄
driver.find_element_by_link_text("招聘求职").click()
all_h = driver.window_handles
print all_h # 打印所有的句柄
# 方法一:判断句柄,并等亍首页就切换
# for i in all_h:
# if i != h:
# driver.switch_to.window(i)
# print driver.title
# 方法二:获取 list 里面第二个直接切换
driver.switch_to.window(all_h[1])
print driver.title
# 关闭新窗口
driver.close()
# 切换到首页句柄
driver.switch_to.window(h)
# 打印当前的 title
print driver.title
总结
下篇会为大家带来iframe的操作,最近有点忙,更新也慢了下来,不过从这篇以后尽量会保持在两天一更的
最后的最后点击文末小卡片可以领取视频资料哦,辛辛苦苦制作的没人来看吗,呜呜呜>