我采用的是Python来使用selenium库,同时java也可以使用,但不如python操作起来方便。下文都会以python的操作为例子,整理我学习selenium过程中收集到的方法。

一:安装

首先python先要安装selenium:

pip install Selenium 

第二步,下载对应的浏览器驱动,我这里用chrome(推荐),对应的驱动下载地址:http://chromedriver.storage.googleapis.com/index.html

驱动版本要与chrome版本对应,但是建议直接用最新版的chrome,然后驱动也下载目前最新的就可以了。然后把下载下来的chromedriver.exe文件放到环境变量的路径下,确保python能正确调用到。

二:基础用法

导入:

from selenium import webdriver

1.获取driver对象

driver = webdriver.Chrome()

如果要设置参数,则要创建一个option对象并作为参数传入构造函数中:

chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('disable-infobars') #取消浏览器打开时显示的正在监控提示
chromeOptions.add_argument('--user-agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0') #添加User-Agent
chromeOptions.add_argument("--proxy-server=http://127.0.0.1") #添加代理chromeOptions.add_argument('--headless') #浏览器后台运行模式
driver = webdriver.Chrome(options=chromeOptions)

2.基本操作

driver.maximize_window() #浏览器最大化 (默认是小窗口)
driver.minimize_window() #浏览器最小化
driver.set_page_load_timeout(20) #超时时间,如果设置了,超过时间会自动停止
driver.get("http://www.baidu.com") #访问网站
driver.refresh() #刷新网站
js='window.open("https://www.baidu.com");' #通过执行js,开启一个新的窗口
driver.execute_script(js)
driver.switch_to.window(driver.window_handles[1])#切换浏览器中的窗口,window_handles返回当前窗口集合,这里代表切换到第二个窗口,如果不存在第二个窗口,会报错
driver.getTitle() #获取当前窗口标题名driver.current_window_handle #获得当前窗口对象driver.current_url #当前urldriver.page_source #当前页面源代码
driver.close() #关闭当前窗口
driver.quit() #关闭整个浏览器

三.查找元素

基础查找

driver.get("https://www.baidu.com")
kw = find_element_by_id("kw") #通过id查找html元素, 对应百度搜索框
su = driver.find_element_by_id("su") #点击搜索按钮
kw.send_keys("搜索一下") #元素可以使用该方法自动填充输入框的内容
su.click() #元素可以使用该方法点击自身

#其他查找方法
find_element_by_name() #通过name属性查找html元素
find_element_by_class_name() #通过class属性中存在的值查找html元素
find_element_by_tag_name() #通过查找标签找到元素,如传入"p", "input"等,不推荐使用

#还有其他很多方法,以上均返回单个元素,element加上s则为返回多个符合条件的元素
find_elements_by_name()

进阶查找

一. xpath查找:

xpath是XML路径语言,它可以用来确定xml文档中的元素位置,通过元素的路径来完成对元素的查找。HTML就是XML的一种实现方式,所以xpath是一种非常强大的定位方式。

1.1 Xpath的绝对路径定位:

利用html标签名的层级关系来定位元素的绝对路径,下标数字可以在多个同样标签中选择,一般从<html>标签开始依次往下进行查找。如:

find_element_by_xpath("/html/body/div[1]/form/span[1]/input")

1.2 Xpath利用元素属性与值定位

find_element_by_xpath("//input[@id='kw']")
find_element_by_xpath("//*[@name='wd']")

1.3 混合定位

find_element_by_xpath("//form[@id='form']/span/input")

二. CSS选择器

driver.find_element_by_css_selector(".btn")
driver.find_element_by_css_selector("#su")

通过属性或组合方式:

driver.find_element_by_css_selector("input[name='kw']").send_keys("Python")
driver.find_element_by_css_selector("span.bg.btn_default>input#su").click()

四. 鼠标键盘操作

selenium提供了ActionChains类来处理鼠标、键盘事件,如鼠标移动,点击,拖拽,键盘按下抬起等。需要导入如下

from selenium.webdriver.common.action_chains import ActionChains
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) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

  • 链式写法:
su = find_element_by_id("su")
ActionChains(driver).move_to_element(su).click(su).perform()

  • 分步写法
su = find_element_by_id("su")
actions = ActionChains(driver)
actions.move_to_element(su)
actions.click(su)
actions.perform()

控制键盘示例:

ActionChains(driver).key_down(Keys.CONTROL, enter).key_up(Keys.CONTROL).perform() #按下Ctrl键然后松开

 执行JS:

driver.execute_script("window.scrollTo(0,100)")
driver.execute_script("document.getElementById(\"kw\").value=\"selenium\"")

五. 其他

禁用图片及JS加载:

from selenium import webdriver
options = webdriver.ChromeOptions()
prefs = {
    'profile.default_content_setting_values': {
         'images': 2,
         'javascript': 2,
    }
} #2是禁用, 1是允许
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(chrome_options=options)    

隐藏window.navigator.webdriver特征参数 (有时候能反爬)

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)

Selenium使用方法整理的更多相关文章

  1. 【AS3】Flash与后台数据交换四种方法整理

    随着Flash Player 9的普及,AS3编程也越来越多了,所以这次重新整理AS3下几种与后台数据交换方法.1.URLLoader(URLStream)2.FlashRemoting3.XMLSo ...

  2. 常用js方法整理common.js

    项目中常用js方法整理成了common.js var h = {}; h.get = function (url, data, ok, error) { $.ajax({ url: url, data ...

  3. 在WebBrowser中执行javascript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码

    [实例简介] 涵盖了几种常用的 webBrowser执行javascript的方法,详见示例截图以及代码 [实例截图] [核心代码] execScript方式: 1 2 3 4 5 6 7 8 9 1 ...

  4. 项目中常用js方法整理common.js

    抽空把项目中常用js方法整理成了common.js,都是网上搜集而来的,大家一起分享吧. var h = {}; h.get = function (url, data, ok, error) { $ ...

  5. Ruby数组方法整理

    数组方法整理 方法列表: all().any().none()和one():测试数组中的所有或部分元素是否满足给定条件.条件可以是语句块中决定,也可以是参数决定 append():等价于push() ...

  6. Vue2.x源码学习笔记-Vue实例的属性和方法整理

    还是先从浏览器直观的感受下实例属性和方法. 实例属性: 对应解释如下: vm._uid // 自增的id vm._isVue // 标示是vue对象,避免被observe vm._renderProx ...

  7. Tomcat 多项目部署方法整理

    Tomcat 多项目部署方法整理 说明:tomcat-deploy-aaa和tomcat-deploy-bbb是两个不同的web项目,为了方便以下简称aaa和bbb,请先自行创建并跑通 导航: NO1 ...

  8. python+selenium安装方法

    一.准备工具: 下载 python[python 开发环境] http://python.org/getit/ 下载 setuptools [python 的基础包工具] http://pypi.py ...

  9. Javascript Array 方法整理

    Javascript Array 方法整理 Javascript 数组相关方法 说明 大多数其它编程语言不允许改变数组大小,越界访问索引会报错,但是 javascript不会报错,不过不建议直接修改a ...

随机推荐

  1. php5.6开启curl

    1.   打开php安装目录,打开ext目录,是否有php_curl.dll扩展文件,如果没有该扩展文件,请在网上下载此文件. 2.   打开php.ini,找到  ;extension=php_cu ...

  2. C/C++ 条件编译静态库

    ==>windows 下方法: 1.方法一:VS工程中中直接添加 1.1在VS的属性->常规->附加库目录,添上文件夹的路径:例如:lib/x64: 1.2输入的附加依赖项,添加上库 ...

  3. 2019-9-19:渗透测试,HTML基础学习,html绘制表格

    1,受理员业务统计表 效果图: 代码: <!DOCTYPE html><html><head> <title>表格1</title>< ...

  4. 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)

    Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...

  5. 一个HTML5培训班毕业生的找工作随笔

    昨天刚参加完一个面试,通过了.写个随笔记录一下. 先介绍一下背景. 我是今年十月份的时候从某个培训机构的HTML5 Web前端培训班毕业的,是一个刚进入IT行业的新人. 本人毕业于某三流学校,在参加培 ...

  6. Servlet+Ajax实现搜索框智能提示

    简介:搜索框相信大家都不陌生,几乎每天都会在各类网站进行着搜索.有没有注意到,很多的搜索功能,当输入内容时,下面会出现提示.这类提示就叫做搜索框的智能提示,本门课程就为大家介绍如何使用Servlet和 ...

  7. idea为什么maven工具栏下面没有dependencies跟Plugins

    刚刚新建的springboot项目,然后进来就是这样子 网上查找资料有些说是maven版本的问题,但是对于我的问题并没有得到解决. 现在是2019年12月4日16:23:07,依然没有找到解决方法,不 ...

  8. 【设计模式大法】Iterator模式

    Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...

  9. 三分钟带你入门 redis 高可用架构之哨兵

    什么是哨兵? 哨兵(Sentinel)是 redis 的高可用性解决方案,前面我们讲的主从复制它是高可用的基础,需要人工介入才能完成故障转移,哨兵可以解决这个问题,在主从复制情况下,当主节点发生故障时 ...

  10. nginx中proxy_pass小斜杠

    nginx中proxy_pass小斜杠 1. 故事背景 相信做微信公众号开发的朋友都知道,要想在微信中预览效果,必须使用域名访问.很多朋友使用内网穿透工具.不仅不好用还不稳定.所以,发挥脸厚吃天下的态 ...