一.Selenium介绍

   1.Selenium(浏览器自动化测试框架):

    Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

  2.Selenium框架图:

二.Selenium的安装和简单使用:

  1.安装:(官方文档:https://selenium-python.readthedocs.io/api.html

     pip install selenium或使用安装包

  2.浏览器的安装(若没在环境变量中,请下载):

Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox: https://github.com/mozilla/geckodriver/releases
Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/

  3.简单使用Selenium:

    3.1简单获取百度网页并退出(会弹出浏览器模拟操作):

from selenium import webdriver
from scrapy.selector import Selector
# 打开谷歌浏览器
# 若没将浏览器Chrome的exe文件添加到PATH下,则带参数指定浏览exe文件的位置
# brower=webdriver.Chrome(executable_path='....')
# 添加在PATH下自动找取
brower = webdriver.Chrome()
# 获取的是js和css文件加载完后的网页,而不是该网页源代码 brower.get('https://www.baidu.com/')
# 获取js和css加载完后的网页
print(brower.page_source)
'''
selenium提供了很多提取网页内容的方法,如下等,但是selenium是用纯python写的,
提取效率慢,若知是提取内容,建议用scrapy,模拟输入密码和点击时用selenium的方法
brower.find_element_by_css_selector()
brower.find_elements_by_css_selector()
......
'''
#利用scrapy的selector解析,速度更快
t_select=Selector(text=brower.page_source)
......
# 退出
brower.quit()

    3.2模拟登录微博:

from selenium import webdriver
import urllib browser = webdriver.Chrome()
browser.get('https://weibo.com/')
import time
time.sleep(10)
username = browser.find_element_by_css_selector('#loginname')
passwd=browser.find_element_by_css_selector('input[node-type="password"]')
if username:
username.send_keys('yourphone')
else:
print('未找到用户名输入框!!!标签错误')
if passwd:
passwd.send_keys('yourpasswd')
else:
print('未找到密码输入框!!!标签错误')
yanzhengma=browser.find_element_by_css_selector('.code.W_fl img')
if yanzhengma:
#获取验证码图片下载地址并下载到本地
img_url=yanzhengma.get_attribute('src')
data = urllib.request.urlopen(img_url).read()
f = open('weibo.png' , 'wb')
f.write(data)
f.close()
code_input=browser.find_element_by_css_selector('input[node-type="verifycode"]')
#可以使用打码平台或自动识别验证码
codes=input('请输入截图里的验证码:')
code_input.send_keys(codes)
browser.find_elements_by_css_selector('a[node-type="submitBtn"]')[0].click()

    3.3selenium实现页面滚动下拉:

from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.oschina.net/blog')
#执行js代码,可以设定下拉到底部或某个位置等
for i in range(3):
#下拉三次
browser.execute_script(
"window.scrollTo(0,document.body.scrollHeight); var lenofPage=document.body.scrollHeight; return lenofPage;")
time.sleep(3)

    3.4selenium设置不加载图片(加快效率):

from selenium import webdriver
#设置chromedriver不加载图片,加速页面的加载
option=webdriver.ChromeOptions()
prefs={'profile.managed_default_content_settings.images':2}
option.add_experimental_option("prefs",prefs)
browser=webdriver.Chrome(chrome_options=option)
browser.get('https://www.taobao.com/')

   3.5phantomjs的简单使用(无界面的浏览器,速率快,但多进程情况下性能下降很严重):

       注:selenium3.11.0及以上版本不在支持phantomjs,若需使用则要安装旧版的selenium(pip3 uninstall selenium 安装历史版本:pip3 install selenium==3.10.0或更旧的版本)

from selenium import webdriver

browser = webdriver.PhantomJS(executable_path='E:/phantomjs-2.1.1-windows/bin/phantomjs.exe')
browser.get('https://www.cnblogs.com/lyq-biu/p/9753969.html')
print(browser.page_source)

    3.6selenium集成到scrapy(若要使用,记得在setting中添加到中间件):

       注:scrapy本身是异步的,经过这样的selenium集成会变成同步的,会降低速率,若想集成仍是异步的,则需重写downloader。参考:https://github.com/flisky/scrapy-phantomjs-downloader

#第一种
from selenium import webdriver
from scrapy.http import HtmlResponse
class SeleniumMiddleware(object):
#通过selenium请求动态网页
def process_request(self,request,spider):
#spider的名字是jobbole才使用selenium方法
if spider.name=='jobbole':
#请求一次打开一个窗口,很慢
browser=webdriver.Chrome()
browser.get(request.url)
return HtmlResponse(url=request.url,body=browser.page_source)
#第二种
from selenium import webdriver
from scrapy.http import HtmlResponse class SeleniumMiddleware(object):
# 通过selenium请求动态网页
def __init__(self):
#使用一个Chrome,return之后无法关闭,则初始化可以放入spider中,调用spider.close()关闭
self.browser = webdriver.Chrome()
super(SeleniumMiddleware, self).__init__() def process_request(self, request, spider):
if spider.name == 'jobbole':
self.browser.get(request.url)
return HtmlResponse(url=request.url, body=self.browser.page_source)
#第三种
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
......
class JobboleSpider(scrapy.Spider):
name = 'jobbole'
allowed_domains = ['blog.jobbole.com']
start_urls = ['http://blog.jobbole.com/all-posts'] def __init__(self):
self.browser = webdriver.Chrome()
super(JobboleSpider, self).__init__()
#分发给spider_close,使用信号量spider_closed
dispatcher.connect(self.spider_close,signals.spider_closed ) def spider_close(self):
#爬虫退出时关闭Chrome
self.browser.quit()
......
class SeleniumMiddleware(object):
# 通过selenium请求动态网页
def process_request(self, request, spider):
if spider.name == 'jobbole':
# browser=webdriver.Chrome()
spider.browser.get(request.url)
return HtmlResponse(url=request.url, body=spider.browser.page_source)

    3.7pyvirtualdisplay的简单使用(无界面):

      安装:pip install  pyvirtualdisplay

from selenium import webdriver
from pyvirtualdisplay import Display
#设置无界面,windows环境下不适用
display=Display(visible=0,size=(800,600))
display.start()
browser=webdriver.Chrome()
browser.get('https://i.cnblogs.com/EditPosts.aspx?postid=9753969&update=1')
......
browser.quit()
display.stop()

    3.8scrapy-splash,selenium grid,splinter

三.总结:

  有很多模拟浏览器操作的插件,而selenium用纯Python写的,效率较慢,但使用方便,是一个很好的测试框架,它的selenium支持分布式。  

Selenium简单回顾的更多相关文章

  1. Android混淆、反编译以及反破解的简单回顾

    =========================================================================虽然反编译很简单,也没下面说的那么复杂,不过还是转了过 ...

  2. 中国2017 Google 开发者大会第二天简单回顾

    昨天早晨发布了第一天的开发者大会回顾文章后,就匆匆忙忙赶去会场继续享受高科技的盛宴,接下来简单回顾一下第二天的大会参与情况. 昨天早晨下着小雨,并带着微风,在外面还是挺冷的,这里不得不给工作人员点个赞 ...

  3. 中国2017 Google 开发者大会第一天简单回顾

    昨天有幸参加了中国2017 Google 开发者大会,在这第一天就收获满满,昨天太忙了,今天早晨来一起简单回顾一下,可以让没有参加的童鞋们感受一下现场的温度. 早早就来到了会议现场,外面看不出什么特别 ...

  4. Selenium 简单的例子

    Selenium是一个web自动化验收测试框架.   Selenium Client Driver - Selenium 2.0 Document http://seleniumhq.github.i ...

  5. python+selenium 简单尝试

    前言 selenium是一种自动化测试工具,简单来说浏览器会根据写好的测试脚本自动做一些操作. 关于自动化测试,一开始接触的是splinter,但是安装的时候发现它是基于selenium的,于是打算直 ...

  6. kafka简单回顾

    先说说遇到的坑 回顾下kafka topic:生产组:P0\P1----P14 一个消费组:c0 c1 c2 依据Consumer的负载均衡分配 消费顺序"c0:p0-p4 c1:p5-p9 ...

  7. Jmeter简单回顾

    之前公众号推文一上手就分享如何测接口, 其实忽略了一些概念性的东西, 今天来给大家拾遗补缺, 做个回顾吧. 一. JMeter介绍 jmeter能做什么,来自官网的解释: Ability to loa ...

  8. 自动化测试基础篇--Selenium简单的163邮箱登录实例

    摘自https://www.cnblogs.com/sanzangTst/p/7472556.html 前面几篇内容一直讲解Selenium Python的基本使用方法.学习了什么是selenium: ...

  9. Spring(完成毕业设计后的简单回顾)

    最近刚刚做完了毕业设计,在开发时用的是spring框架,做的时候踩了好多坑,又把当初的笔记给翻了翻,做一次简单的回顾 # 1.Spring是什么? 是一个开源的.用于简化企业级应用开发的应用开发框架. ...

随机推荐

  1. 《JAVA程序设计》_第二周学习总结

    20175217吴一凡 一.IDEA的安装和使用 参考老师的教程Intellj IDEA 简易教程. 1.IDEA的安装 因为我已经习惯了在Linux上敲代码,所以我决定将IDEA安装在虚拟机上. 首 ...

  2. 机器学习算法总结(六)——EM算法与高斯混合模型

    极大似然估计是利用已知的样本结果,去反推最有可能(最大概率)导致这样结果的参数值,也就是在给定的观测变量下去估计参数值.然而现实中可能存在这样的问题,除了观测变量之外,还存在着未知的隐变量,因为变量未 ...

  3. [TJOI2018]碱基序列

    嘟嘟嘟 现在看到字符串就想到SAM,所以很担心kmp啥的会不会忘了-- 这题感觉挺暴力的:首先当然要把\(s\)建成SAM,然后令\(dp[i][j]\)表示到第\(i\)组时,SAM上节点\(j\) ...

  4. 初学Python——列表生成式、生成器和迭代器

    一.列表生成式 假如现在有这样一个需求:快速生成一个列表[1,2,3,4,5,6,7,8,9,10],该如何实现? 在不知道列表生成式的情况下,可能会这样写: a=[1,2,3,4,5,6,7,8,9 ...

  5. 前向星&链式前向星

    参考博文: https://blog.csdn.net/acdreamers/article/details/16902023 前向星 len[i]以i为起点的边在数组中的存储长度 head[i]以i ...

  6. 01-认识Jenkins

    1.1 Jenkins是什么? Jenkins官网: http://jenkins.io/ .Jenkins前身是Hudson,使用java语言开发的自动化发布工具.在中大型金融等企业中普遍使用Jen ...

  7. redis底层设计(四)——功能的实现

    redis中我们会经常用到事务.订阅与发布.Lua脚本以及慢查询日志,接下来我们就一一对他们进行探讨学习. 4.1事务 redis通过MULTI.DISCARD.EXEC和WATCH四个命令来实现事务 ...

  8. JasperReport制作行内容合并的表格

    效果图: 实现思路一: 交叉表 另一个思路: 普通表格 缺点:无法实现内容 垂直居中显示 准备工作 一.数据准备 DROP TABLE IF EXISTS `address_item_sex_valu ...

  9. 如何添加一种新Case协议

    这里以添加基础http为例 首先要在脚本文件(XML文件)中定义好这种协议的基本信息     您必须在这里设计好您协议预先需要的数据(比如串口协议,那波特率,串口号等可能是不会经常改变的就可以在这里先 ...

  10. matplotlib 入门之Pyplot tutorial

    文章目录 pyplot 介绍 修饰你的图案 格式字符串 [color][marker][line] Colors Markers Line Styles 利用关键字作图(大概是数据映射到属性吧) 传入 ...