selenium 本身是一套web自动化测试工具,但其经常被用于爬虫,解决一些复杂爬虫的问题。

selenium 用于爬虫时,相当于模拟人操作浏览器。

浏览器驱动

使用 selenium 需要先安装 浏览器驱动,selenium 支持多种浏览器

可以看到支持的浏览器类型有十几种,其中常用的有

chrome 谷歌,驱动下载地址,注意浏览器与驱动的版本要匹配,下面的浏览器也一样

firefox,火狐,驱动下载地址

ie,ie不好用,驱动下载地址

phantomjs,这是一个无界面的浏览器,特点是高效,后面我会有一篇博客专门介绍它。

safari,手机浏览器

驱动要放到环境变量的地址里,如 c://python2,或者把驱动的地址放到环境变量里

具体安装请百度,搜索 “selenium 浏览器驱动下载” 即可

注意,linux 中浏览器驱动要安装对应的 linux 版本

基础使用方法

1. 声明浏览对象

from selenium import webdriver

#构造模拟浏览器
# firefox_login=webdriver.Ie() # Firefox()
firefox_login=webdriver.Chrome()

这一步可设定无界面模式,即操作浏览器时,隐层浏览器

options = webdriver.ChromeOptions()
options.add_argument('--headless') # 设置无界面 可选 firefox_login=webdriver.Chrome(chrome_options=options)

2. 访问页面

firefox_login.get('http://www.renren.com/')
# firefox_login.maximize_window()  # 窗口最大化,可有可无,看情况
firefox_login.minimize_window()

3. 查找元素并交互

firefox_login.find_element_by_id('email').clear()
firefox_login.find_element_by_id('email').send_keys('xxx@sina.com')

元素查找方法汇总

find_element_by_name
find_element_by_id
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector

以上是单元素查找,多元素把 element 变成 elements 即可。

还有一种较通用的方法

from selenium.webdriver.common.by import By    注意这里要导入

browser = webdriver.Chrome()
browser.get("http://www.taobao.com") input_first = browser.find_element(By.ID,"q") ID可以换成其他

4. 操作浏览器

firefox_login.find_element_by_id('login').click()

可将操作放入动作链中串行执行

from selenium import webdriver
from selenium.webdriver import ActionChains browser = webdriver.Chrome()
url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
#
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()

上面实现了一个元素拖拽的功能

执行 js 命令

直接用js命令操作浏览器

from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.zhihu.com/explore")
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')

5. 输出并关闭

print(firefox_login.current_url)
print(firefox_login.page_source) #浏览器退出
# firefox_login.close()
firefox_login.quit()

获取元素属性

get_attribute('class')

logo = browser.find_element_by_id('zh-top-link-logo')
print(logo.get_attribute('class'))

获取文本  logo.text

获取id       logo.id

获取位置   logo.location

获取标签名logo.tag_name

获取size    logo.size

方法进阶

除了基础的操作外,还有很多特殊的应用场景需要处理。

frame 标签

很多网页中存在 frame 标签,要处理frame里面的数据,首先要切入frame,处理完了还要切出来。

切入 用 switch_to.frame,切出 用 switch_to.parent_frame

示例

# encoding:utf-8

import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult') # iframeResult 是 iframe 的 id 进入frame
source = browser.find_element_by_css_selector('#draggable')
print(source)
try:
logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
print('NO LOGO')
browser.switch_to.parent_frame() # 退出 frame
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)

上面url的部分源码

等待

在操作浏览器时经常要等待,selenium 也有等待方法,分为显式等待和隐式等待

隐式等待

from selenium import webdriver

browser = webdriver.Chrome()
browser.implicitly_wait(100)    #
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)

显式等待

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 100)    #
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

显式等待和隐式等待都是无阻塞的,即响应就继续,不同的是,显示等待需要设定响应条件,如获取某元素。

常用判断条件

title_is:判断当前页面的title是否等于预期
title_contains:判断当前页面的title是否包含预期字符串
presence_of_element_located:判断某个元素是否被加到了dom树里,并不代表该元素一定可见
visibility_of_element_located:判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
visibility_of:跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
presence_of_all_elements_located:判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True
text_to_be_present_in_element:判断某个元素中的text是否 包含 了预期的字符串
text_to_be_present_in_element_value:判断某个元素中的value属性是否包含了预期的字符串
frame_to_be_available_and_switch_to_it:判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
invisibility_of_element_located:判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable - it is Displayed and Enabled:判断某个元素中是否可见并且是enable的,这样的话才叫clickable
staleness_of:等某个元素从dom树中移除,注意,这个方法也是返回True或False
element_to_be_selected:判断某个元素是否被选中了,一般用在下拉列表
element_located_to_be_selected
element_selection_state_to_be:判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be:跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
alert_is_present:判断页面上是否存在alert

更多参考:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

wait.until(EC.text_to_be_present_in_element_value(('id', 'inputSearchCity'), u'西安'))

浏览器的前进后退

forward/back

import time
from selenium import webdriver browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

cookie 操作

get_cookies()

delete_all_cookies()

add_cookie()

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'zhaofan'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

选项卡管理

暂略

异常处理

暂略

参考资料:

https://selenium-python.readthedocs.io/  英文官方教程

https://selenium-python.readthedocs.io/api.html  webdriver API

《Python爬虫开发与项目实战》    pdf电子书

http://www.cnblogs.com/zhaof/p/6953241.html    很好的教程

https://www.jianshu.com/p/47853fdb613b  等待

https://blog.csdn.net/qq_38316655/article/details/81989232    等待实例

selenium 教程的更多相关文章

  1. 自动化测试selenium教程

    什么是自动化测试: 自动帮我们测试一个系统里面的主要功能,一个app.电脑网站.网页,每个系里面许多的功能,好比一个淘宝页面,里面N多功能,登录.注册,推荐,商品详情.评论等等:软件生命周期:需求调研 ...

  2. 一个很适合初学者的selenium教程

    http://www.cnblogs.com/hustar0102/p/5885115.html

  3. Selenium系列教程(2)

    Selenium RC(Selenium远程控制) Selenium RC是一个用Java编写的,允许用户使用无论哪种编程语言对基于Web的应用程序构建测试脚本的工具.Selenium RC克服了Se ...

  4. javascript selenium全套教程发布

    为什么有这个系列 目前javascript生态非常丰富,越来越多的人开始用js去做前端的ui测试了.而selenium是web ui测试的标准解决方案,所以一套js的selenium教程是很有必要的. ...

  5. selenium webdriver python 开始

    学习资料: Selenium with Python: http://selenium-python.readthedocs.org/en/latest/index.html 乙醇的python se ...

  6. Selenium学习资源和网站

    用于收集常用的网站和学习资源: 文章: Selenium私房菜系列--总章 WEB 自动化测试工具 Selenium 简介及其应用 Selenium教程 和我一起学 Selenium WebDrive ...

  7. Selenium自动化-入门1

    起初写博客是为了妹子学习,现在发现忽略了最基础的Selenium教程,所以:从本博客开始编辑 Selenium 入门知识.(学好Java) Selenium 入门 1:(学好Java) 录制回放,简单 ...

  8. 小白之selenium+python关于cookies绕开登录2

    首先,由于新开始在博客园中写随笔,可能在内容的布局方面就不太懂,导致布局很丑,各位见谅,但是字还是原来的那字,内容还是原来的内容,少了点包装, 下面是对cookie的扩展知识 1.配置文件存储在哪里? ...

  9. 跟浩哥学自动化测试Selenium -- Selenium简介 (1)

    Selenium 简介 Selenium 是一款开源的web自动化测试工具,用来模拟对浏览器的操作(主要是对页面元素的操作),简单来讲,其实就是一个jar包.Selenium早期的版本比如1.0市场占 ...

随机推荐

  1. #333 Div2 Problem B Approximating a Constant Range (尺取 && RMQ || 尺取 && multiset)

    题目链接:http://codeforces.com/contest/602/problem/B 题意 :给出一个含有 n 个数的区间,要求找出一个最大的连续子区间使得这个子区间的最大值和最小值的差值 ...

  2. golang rabbitmq实践 (二 实现简单的消息收发)

    1:驱动 本来打算自己写一个驱动的,后来发现github上面已经有了,那我就直接拿现成的了, 驱动采用 github.com/streadway/amqp ,直接import就可以啦! 2:excha ...

  3. (60) 结构体指针、结构体变量嵌套、结构体指针嵌套、函数指针、数组指针、指针数组、typedef 综合运用

    #include<stdio.h> #include<iostream> #include<malloc.h> /* author : 吴永聪 program: 结 ...

  4. [LeetCode]-DataBase-Employees Earning More Than Their Managers

    The Employee table holds all employees including their managers. Every employee has an Id, and there ...

  5. 实验报告二&第四周学习总结

    一.实验目的: (1) 掌握类的定义,熟悉属性.构造函数.方法的调用,掌握用类作为类型声明变量和方法返回值: (2) 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性: (3 ...

  6. AI-人工智能/机器学习 seetafaceJNI

    基于中科院seetaface2进行封装的JAVA人脸识别库,支持人脸识别.1:1比对.1:N比对. 项目介绍 基于中科院seetaface2进行封装的JAVA人脸识别算法库,支持人脸识别.1:1比对. ...

  7. legend2---开发常用语句

    legend2---开发常用语句 一.总结 一句话总结: 其实敲代码都是很类似的,比如ajax,模型等等,敲代码就是一个由生到熟的过程 1.ajax? $.post("{:url('broa ...

  8. 微信小程序 API 网络(ajax)

    网络 API 类似于 ajax 向服务器请求网络地址,唯一不同的是这个请求有很多的规则,且必须向服务器上请求,不能在本地请求 网络 发送请求: wx.request() 发起https网络请求 参数: ...

  9. db2表结构导出导入,数据库备份

    1.新增用户组.用户和查看所有用户: 新增系统用户组: #groupadd jldb //增加用户组jldb 需使用root权限 useradd jldb -g jldb //将新增用户赋值到jldb ...

  10. 无人驾驶车辆路径跟踪的增量式PID控制

    路径跟踪是无人车研究方向的一项关键技术.路径跟踪控制算法是指能够使无人车按照预设路径,安全稳定行驶的控制方法. 建立无人车路径跟踪模型 预设无人车在A.B两点间,当前位置为D点,航向为hF 可以得到B ...