Selenium(十):用By定位元素、鼠标事件、键盘事件
1. 用By定位元素
除了前面介绍的单位方法,WebDriver还提供了另外一套写法,即统一调用find_element()方法,通过By来声明定位的方法,并且传入对应定位方法的定位参数。具体如下:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By wd = webdriver.Chrome() wd.get('https://www.baidu.com/') wd.find_element(By.ID,"kw")
wd.find_element(By.NAME,"wd")
wd.find_element(By.CLASS_NAME,"s_ipt")
wd.find_element(By.TAG_NAME,"input")
wd.find_element(By.LINK_TEXT,u"新闻")
wd.find_element(By.PARTIAL_LINK_TEXT,u"新")
wd.find_element(By.XPATH,"//*[@class='bg s_btn']")
wd.find_element(By.CSS_SELECTOR,"span.bg.s_btn_wr>input#su")
find_element()方法只用于定位元素。它需要两个参数,第一个参数是定位的类型,由By提供:第二个参数是定位的具体方式。在使用By之前需要将By类导入。
from selenium.webdriver.common.by import By
通过查看WebDriver的底层实现代码发现它们其实是一回事儿,例如,find_element_by_id()方法的实现。
def find_element_by_id(self, id_):
"""Finds an element by id. :Args:
- id\_ - The id of the element to be found. :Returns:
- WebElement - the element if it was found :Raises:
- NoSuchElementException - if the element wasn't found :Usage:
element = driver.find_element_by_id('foo')
"""
return self.find_element(by=By.ID, value=id_)
但WebDriver更推荐前面介绍的写法,当然我公司底层是使用By来分装函数的。
2. 鼠标事件
前面不但使用过click()方法,而且还了解了下其他鼠标交互方式,例如鼠标点击、双击、悬停、甚至是鼠标拖动等功能。
在这一章中,我将详细说明这些功能。
在WebDriver中,将这些关于鼠标操作的方法封装在ActionChains类提供。
ActionChains类提供了鼠标操作的常用方法:
perform():执行所有ActionChains中存储的行为
context_click():右击
double_click():双击
drag_and_drop():拖动
move_to_element():鼠标悬停
2.1 鼠标右击操作
对于ActionChains类所提供的鼠标方法与前面学过的click()方法的用法有所不同。
我想了半天,愣是没想到哪个网站可以右键,所以没办法弄出实例了。
导入提供鼠标操作的ActionChains:
from selenium.webdriver import ActionChains
调用ActionChains(driver)类,将浏览器驱动driver作为参数传入,我一般是用wd作为浏览器驱动的名称。
ActionChains(wd)
context_click(right)方法用于秒你鼠标右键操作,在调用是需要制定元素定位。
ActionChains(wd).context_click(right)
执行所有ActionChains中存储的行为,可以理解成是对整个操作的提交动作。
ActionChains(wd).context_click(right).perform()
2.2 鼠标悬停
鼠标悬停弹出下拉菜单是一个十分创建的功能设计。
move_to_element()方法可以模拟鼠标悬停的动作,其用法与context_click()相同。
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains wd = webdriver.Chrome() wd.get('https://www.baidu.com/') #定位到要鼠标悬停的元素
above = wd.find_element_by_xpath("//div[@id='u1']/a[8]")
#对定位到的元素执行鼠标悬停操作
ActionChains(wd).move_to_element(above).perform()
2.3 鼠标双击操作
double_click方法用于模拟鼠标双击操作。和前面的使用方法一模一样,就不用代码演示了。
2.4 鼠标拖放操作
drag_and_drop(source,target)在源元素上按住鼠标左键,然后移动到目标元素上释放。
source:鼠标拖动的源元素
target:鼠标释放的目标元素
这个也没想到哪里可以使用到,可能后面的滑动式验证码需要使用。
3. 键盘事件
Keys()类提供了键盘上几乎所有按键的方法。前面了解到,send_keys()方法可以用来模拟键盘输入,除此之外,我们还可以用它来输入键盘上的按键,甚至是组合键,如Ctrl+A、Ctrl+C等。
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.keys import Keys wd = webdriver.Chrome() wd.get('https://www.baidu.com/') #输入框输入内容
wd.find_element_by_id("kw").send_keys("seleniumm") #删除多输入的一个m
wd.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) #输入空格键+“教程”
wd.find_element_by_id("kw").send_keys(Keys.SPACE)
wd.find_element_by_id("kw").send_keys("教程") #Ctrl+a 全选输入框内容
wd.find_element_by_id("kw").send_keys(Keys.CONTROL,'a') #Ctrl+x 剪切输入框内容
wd.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') #Ctrl+v 粘贴输入框内容
wd.find_element_by_id("kw").send_keys(Keys.CONTROL,'v') #通过回车键来代替单击操作
wd.find_element_by_id("su").send_keys(Keys.ENTER)
需要说明的是,上面的代码没有什么实际意义,仅向我们展示模拟键盘各种按键与组合键的使用。
在使用键盘按键方法前需要先导入keys类。
from selenium.webdriver.common.keys import Keys
以下是常用的键盘操作:
send_keys(Keys.BACK_SPACE) 删除键
send_keys(Keys.SPACE) 空格键
send_keys(Keys.TAB) 制表键
send_keys(Keys.ESCAPE) 回退键
send_keys(Keys.ENTER) 回车键
send_keys(Keys.CONTROL,'a') 全选
send_keys(Keys.CONTROL,'c') 复制
send_keys(Keys.CONTROL,'x') 剪切
send_keys(Keys.CONTROL,'v') 粘贴
send_keys(Keys.F1) 键盘F1
......
send_keys(Keys.F12) 键盘F12
Selenium(十):用By定位元素、鼠标事件、键盘事件的更多相关文章
- Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)
本文将总结 Selenium WebDriver 中的一些鼠标和键盘事件的使用,以及组合键的使用,并且将介绍 WebDriver 中没有实现的键盘事件(Keys 枚举中没有列举的按键)的扩展.举例说明 ...
- Python selenium PO By.XPATH定位元素报错
Python selenium PO By.XPATH定位元素报错 如下代码经常报错: # 首页的“新建投放计划”按钮 new_ads_plan = (By.XPATH, "//*[tex ...
- tkinter中鼠标与键盘事件(十五)
鼠标与键盘事件 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("300x200+ ...
- HTML5 Canvas鼠标与键盘事件
演示HTML5 Canvas鼠标事件,获取Canvas对象上的鼠标坐标,演示键盘事件 通过键盘控制Canvas上对象移动. Canvas对象支持所有的JavaScript的鼠标事件,包括鼠标点击(Mo ...
- JavaScript事件基础-10-2.HTML事件; DOM0级事件; 掌握常用的鼠标与键盘事件 ; 掌握this的指向;
JavaScript事件基础 学习目标 1.掌握什么是事件 2.掌握HTML事件 3.掌握DOM0级事件 4.掌握常用的鼠标与键盘事件 5.掌握this的指向 什么是事件 事件就是文档或浏览器窗口中发 ...
- C#/winform 自动触发鼠标、键盘事件
要在C#程序中触发鼠标.键盘事件必须要调用windows函数. 一.鼠标事件的触发 1.引用windows函数mouse_event /// <summary> /// 鼠标事件 /// ...
- java鼠标与键盘事件监听
package cn.stat.p3.windowdemo; import java.awt.Button; import java.awt.FlowLayout; import java.awt.F ...
- lufylegend库 鼠标事件 循环事件 键盘事件
lufylegend库 鼠标事件 循环事件 键盘事件 <!DOCTYPE html> <html lang="en"> <head> <m ...
- OSX 鼠标和键盘事件
本文转自:http://www.macdev.io/ebook/event.html 事件分发过程 OSX 与用户交互的主要外设是鼠标,键盘.鼠标键盘的活动会产生底层系统事件.这个事件首先传递到IOK ...
- 50-用Python监听鼠标和键盘事件
转自:https://www.cnblogs.com/qiernonstop/p/3654021.html 用Python监听鼠标和键盘事件 PyHook是一个基于Python的“钩子”库,主要用于监 ...
随机推荐
- 聊一聊 webpack 中的 preloading 和 Prefetching
聊一聊 webpack 中的 preloading 和 Prefetching 提到 Preloading 和 Prefetching 就不得不先说一下代码分割,通过下面的例子我们来说明为什么需要代码 ...
- tune kubernetes eviction parameter
Highlight 本文会介绍kubernetes中关于集群驱逐的相关参数, 合理设置驱逐速率的考虑因素, 但是不会涉及node层面资源的驱逐阈值的设置. Basic 在kubernetes中, 如果 ...
- orleans 2.0 进阶之自定义持久化储存
一丶简单介绍下目录结构和项目依赖,如图 二丶主要核心自定义代码 1. 添加自定义实现类 CustomProvider public class CustomProvider : IGrainStora ...
- Linux 版本控制工具之rabbitvcs
原文地址:http://www.robotshell.com/2017/11/04/Linux-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E5%B7%A5%E5%85% ...
- C#开发微信小程序(四)
导航:C#开发微信小程序系列 关于小程序项目结构,框架介绍,组件说明等,请查看微信小程序官方文档,关于以下贴出来的代码部分我只是截取了一些片段,方便说明问题,如果需要查看完整源代码,可以在我的项目库中 ...
- 从无到有通过IDEA搭建SpringBoot项目
本人第一次写博客希望记录当下,努力成为IT界中的清流,写的不好多多包涵. SpringBoot是由Pivotal团队在2013年开始研发.2014年4月发布第一个版本的全新开源的轻量级框架.它基于Sp ...
- 源码角度分析-newFixedThreadPool线程池导致的内存飙升问题
前言 使用无界队列的线程池会导致内存飙升吗?面试官经常会问这个问题,本文将基于源码,去分析newFixedThreadPool线程池导致的内存飙升问题,希望能加深大家的理解. (想自学习编程的小伙伴请 ...
- 编译Netty源码遇到的一些问题-缺少io.netty.util.collection包
缺少包和java类 下载好Netty的源码后,导入到IDE,运行自带的example时编译不通过. 如下图,是因为io.netty.util.collection的包没有 点进去看,确实没有这个包 发 ...
- 关于python中的增量赋值的理解
增量赋值运算符 += 和 *= 的表现取决于它们的第一个操作对象 += 操作首先会尝试调用对象的 __ iadd__方法,如果没有该方法,那么尝试调用__add__方法,所以+= 与 + 的区别实质是 ...
- PlayJava Day025
JTable 用JTable类可以以表格的形式显示和编辑数据 JTable类的对象并不存储数据,它只是数据的表现 MVC 数据.表现和控制三者分离,各负其责 M = Model(模型) V = Vie ...