关于Python的Selenium框架全解,一篇完整的说明书

目录

selenium 基础语法

一、 环境配置

1、 安装环境

安装 selenium 第三方库

pip install selenium下载浏览器驱动:

Firefox浏览器驱动: geckodriverChrome浏览器驱动: chromedriver , taobao备用地址IE浏览器驱动: IEDriverServerEdge浏览器驱动: MicrosoftWebDriverOpera浏览器驱动: operadriverPhantomJS浏览器驱动: phantomjs需要把这些浏览器驱动放入 Python 应用目录里面的 Script 文件夹里面

干货主要有:

① 200 多本 Python 电子书(和经典的书籍)应该有

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且可靠的练手项目及源码)

④ Python基础入门、爬虫、网络开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

私信小编01即可获取大量Python学习资源

2、 配置参数

每次当selenium启动chrome浏览器的时候,chrome浏览器很干净,没有插件、没有收藏、没有历史记录,这是因为selenium在启动chrome时为了保证最快的运行效率,启动了一个裸浏览器,这就是为什么需要配置参数的原因,但是有些时候我们需要的不仅是一个裸浏览器

selenium启动配置参数接收是ChromeOptions类,创建方式如下 :

from selenium import webdriver

option = webdriver.ChromeOptions()

driver = webdriver.Chrome(chrome_options=option)创建了ChromeOptions类之后就是添加参数,添加参数有几个特定的方法,分别对应添加不同类型的配置项目

from selenium import webdriver

option = webdriver.ChromeOptions()

# 添加启动参数

option.add_argument()

# 添加扩展应用

option.add_extension()

option.add_encoded_extension()

# 添加实验性质的设置参数

option.add_experimental_option()

# 设置调试器地址

option.debugger_address()常用配置参数:

from selenium import webdriver

option = webdriver.ChromeOptions()

# 添加UA

options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')

# 指定浏览器分辨率

options.add_argument('window-size=1920x3000')

# 谷歌文档提到需要加上这个属性来规避bug

chrome_options.add_argument('--disable-gpu')

# 隐藏滚动条, 应对一些特殊页面

options.add_argument('--hide-scrollbars')

# 不加载图片, 提升速度

options.add_argument('blink-settings=imagesEnabled=false')

# 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败

options.add_argument('--headless')

# 以最高权限运行

options.add_argument('--no-sandbox')

# 手动指定使用的浏览器位置

options.binary_location = r"C:Program Files (x86)GoogleChromeApplicationchrome.exe"

#添加crx插件

option.add_extension('d:crxAdBlock_v2.17.crx')

# 禁用JavaScript

option.add_argument("--disable-javascript")

# 设置开发者模式启动,该模式下webdriver属性为正常值

options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 禁用浏览器弹窗

prefs = {

'profile.default_content_setting_values' : {

'notifications' : 2

}

}

options.add_experimental_option('prefs',prefs)

# 添加代理 ip

options.add_argument("--proxy-server=http://XXXXX.com:80")

driver = webdriver.Chrome(chrome_options=chrome_options)其他配置项目参数

–user-data-dir=”[PATH]”

# 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区

–disk-cache-dir=”[PATH]“

# 指定缓存Cache路径

–disk-cache-size=

# 指定Cache大小,单位Byte

–first run

# 重置到初始状态,第一次运行

–incognito

# 隐身模式启动

–disable-javascript

# 禁用Javascript

--omnibox-popup-count="num"

# 将地址栏弹出的提示菜单数量改为num个

--user-agent="xxxxxxxx"

# 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果

--disable-plugins

# 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果

--disable-javascript

# 禁用JavaScript,如果觉得速度慢在加上这个

--disable-java

# 禁用java

--start-maximized

# 启动就最大化

--no-sandbox

# 取消沙盒模式

--single-process

# 单进程运行

--process-per-tab

# 每个标签使用单独进程

--process-per-site

# 每个站点使用单独进程

--in-process-plugins

# 插件不启用单独进程

--disable-popup-blocking

# 禁用弹出拦截

--disable-plugins

# 禁用插件

--disable-images

# 禁用图像

--incognito

# 启动进入隐身模式

--enable-udd-profiles

# 启用账户切换菜单

--proxy-pac-url

# 使用pac代理 [via 1/2]

--lang=zh-CN

# 设置语言为简体中文

--disk-cache-dir

# 自定义缓存目录

--disk-cache-size

# 自定义缓存最大值(单位byte)

--media-cache-size

# 自定义多媒体缓存最大值(单位byte)

--bookmark-menu

# 在工具 栏增加一个书签按钮

--enable-sync

# 启用书签同步

3、 常用参数搭配

制作无头浏览器

# 第一种写法

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

chrome_options = Options()

chrome_options.add_argument('--headless')

chrome_options.add_argument('--disable-gpu')

driver = webdriver.Chrome(chrome_options=chrome_options)

# 第二种写法

from selenium import webdriver

options = webdriver.ChromeOptions()

options.add_argument('--headless')

options.add_argument('--disable-gpu')

driver = webdriver.Chrome(chrome_options=options)规避检测

门户网站检测如果是selenium请求的,有可能会拒绝访问。这也是一种反爬机制

实现规避检测

from selenium import webdriver

from selenium.webdriver import ChromeOptions

options = ChromeOptions()

options.add_experimental_option('excludeSwitcher', ['enable-automation'])

driver = webdriver.Chrome(options=options)注意:这里只能使用 options 添加

如果有其他的模块要添加,注意要分开添加

4、 分浏览器启动

from selenium import webdriver

driver = webdriver.Firefox() # Firefox浏览器

# driver = webdriver.Firefox(executable_path="驱动路径")

driver = webdriver.Chrome() # Chrome浏览器

driver = webdriver.Ie() # Internet Explorer浏览器

driver = webdriver.Edge() # Edge浏览器

driver = webdriver.Opera() # Opera浏览器

driver = webdriver.PhantomJS() # PhantomJS

二、 基本语法

1、 元素定位

元素定位语法

常用语法:

find_element_by_id()

find_element_by_name()

find_element_by_class_name()

find_element_by_tag_name()

find_element_by_link_text()

find_element_by_partial_link_text()

find_element_by_xpath()

find_element_by_css_selector()在 element 变成 elements 时,返回符合条件的所有元素组成的数组

2、 控制浏览器操作

控制浏览器大小

driver.set_window_size(480, 800)浏览器后退,前进

driver.forward()

driver.back()

刷新

driver.refresh()

3、 操作元素的方法

3.1 点击和输入

driver.find_element_by_id("kw").clear() # 清空文本

driver.find_element_by_id("kw").send_keys("selenium") # 模拟按键输入

driver.find_element_by_id("su").click() # 单击元素

3.2 提交

在搜索框模拟回车操作

search_text = driver.find_element_by_id('kw') search_text.send_keys('selenium') search_text.submit() # 模拟回车操作

3.3 其他

drive.size # 返回元素的尺寸

drive.text # 获取元素的文本

drive.get_attribute(name) # 获得属性值

drive.is_displayed() # 设置该元素是否用户可见

drive.page_source # 获取网页源代码

4、 鼠标操作

在 WebDriver 中, 将这些关于鼠标操作的方法封装在 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) ——发送某个键到指定元素语法:

from selenium.webdriver.common.action_chains import ActionChains

# 获取元素

menu = driver.find_element_by_css_selector(".nav")

hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")

# 链式写法

ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()

# 分步写法

actions = ActionChains(driver)

actions.move_to_element(menu)

actions.click(hidden_submenu)

actions.perform()

5、 键盘操作

想使用selenium中的键盘事件,首先我们必须导入Keys包,需要注意的是包名称Keys首字母需要大写。Keys类中提供了几乎所有的键盘事件包括组合按键如 Ctrl+A、 Ctrl+C 等

使用语法:

from selenium.webdriver.common.keys import Keys

element.send_keys(键盘事件)

# 常用键盘事件

Keys.BACK_SPACE # 回退键(BackSpace)

Keys.TAB # 制表键(Tab)

Keys.ENTER # 回车键(Enter)

Keys.SHIFT # 大小写转换键(Shift)

Keys.CONTROL # Control键(Ctrl)

Keys.ALT # ALT键(Alt)

Keys.ESCAPE # 返回键(Esc)

Keys.SPACE # 空格键(Space)

Keys.PAGE_UP # 翻页键上(Page Up)

Keys.PAGE_DOWN # 翻页键下(Page Down)

Keys.END # 行尾键(End)

Keys.HOME # 行首键(Home)

Keys.LEFT # 方向键左(Left)

Keys.UP # 方向键上(Up)

Keys.RIGHT # 方向键右(Right)

Keys.DOWN # 方向键下(Down)

Keys.INSERT # 插入键(Insert)

DELETE # 删除键(Delete)

NUMPAD0 ~ NUMPAD9 # 数字键1-9

Keys.F5 # 刷新键

F1 ~ F12 # F1 - F12键

(Keys.CONTROL, 'a') # 组合键Control+a,全选

(Keys.CONTROL, 'c') # 组合键Control+c,复制

(Keys.CONTROL, 'x') # 组合键Control+x,剪切

(Keys.CONTROL, 'v') # 组合键Control+v,粘贴其他事件可以通过查看源码获取

6、 获取断言信息

title = driver.title # 打印当前页面title

now_url = driver.current_url # 打印当前页面URL

user = driver.find_element_by_class_name('nums').text # # 获取结果数目

7、 等待页面加载完成

7.1 显示等待

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常

实例:

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

driver = webdriver.Firefox()

driver.get("http://www.baidu.com")

element = WebDriverWait(driver, 5, 0.5).until(

expected_conditions.presence_of_element_located((By.ID, "kw"))

) # expected_conditions.presence_of_element_located()方法判断元素是否存在

element.send_keys('selenium')

driver.quit()WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常

语法:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)参数:

driver :浏览器驱动timeout :最长超时时间,默认以秒为单位poll_frequency :检测的间隔(步长)时间,默认为0.5Signored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常WebDriverWait()一般由until()或until_not()方法配合使用until(method, message=‘’) :调用该方法提供的驱动程序作为一个参数,直到返回值为Trueuntil_not(method, message=‘’): 调用该方法提供的驱动程序作为一个参数,直到返回值为False

7.2 隐式等待

如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期

from selenium import webdriver

driver = webdriver.Firefox()

driver.implicitly_wait(10) # 隐式等待 10 s

driver.get("http://www.baidu.com")

myDynamicElement = driver.find_element_by_id("myDynamicElement")

8、 页面切换

driver.switch_to_window("windowName") # 切换窗口

driver.switch_to_frame("frameName") # 切换进框架里面

driver.switch_to_default_content() # 退出框架案例

#先通过xpth定位到iframe

xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')

#再将定位对象传给switch_to_frame()方法

driver.switch_to_frame(xf)

driver.switch_to_default_content() # 退出框架

9、 框处理

9.1 警告框处理

语法:

alert = driver.switch_to_alert()alert 里面的方法

text:返回 alert/confirm/prompt 中的文字信息accept():接受现有警告框dismiss():解散现有警告框send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框

9.2 下拉框选择

9.2.1 Select类的方法

9.2.1.1 选中方法

from selenium import webdriver

from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()

driver.implicitly_wait(10) # 隐式等待

driver.get('http://www.baidu.com')

sel = driver.find_element_by_xpath("//select[@id='nr']")

"""

有三种方式选择下拉框

select_by_value(value) 通过value属性值进行选择

select_by_index(index) 通过索引查找,index从0开始

select_by_visible_text(text) 通过标签显示的text进行选择

"""

Select(sel).select_by_value(value)

9.2.1.2 取消选择方法

"""

deselect_all() 取消全选

deselect_by_value(value) 通过value属性取消选择

deselect_by_index(index) 通过index取消选择

deselect_by_visible_text(text) 通过text取消选择

"""

# 使用方法

Select(sel).deselect_by_value(value)

9.2.2 先定位select 然后在定位option

# 定位到下拉选择框

selector = driver.find_element_by_id("selectdemo")

# selector = driver.find_element_by_xpath(".//*[@id='selectdemo']")

# 选择"篮球运动员"

selector.find_element_by_xpath("//option[@value='210103']").click()

# selector.find_elements_by_tag_name("option")[2].click()

9.2.3 直接通过xpath层级标签定位

# 直接通过xpath定位并选择"篮球运动员"

driver.find_element_by_xpath(".//*[@id='selectdemo']/option[3]").click()

10、 文件上传

driver.find_element_by_name("file").send_keys('D:\upload_file.txt') # 定位上传按钮,添加本地文件

11、 cookie操作

WebDriver操作cookie的方法:

get_cookies()

get_cookie(name)

add_cookie(cookie_dict)

delete_cookie(name,optionsString)

delete_all_cookies()

11.1 cookie 登录方法

参考链接: https://www.jianshu.com/p/773c58406bdb

手动获取网页的cookie,将其序列化并存储在本地写入代码for item in cookies:

driver.add_cookie(item)与普通的在headers里添加 {'Cookies':' '} 不一样的是,此方法需要按照cookie的name,value,path,domain格式逐个cookie添加

12、 调用JS代码

js="window.scrollTo(100,450);"

driver.execute_script(js) # 通过javascript设置浏览器窗口的滚动条位置通过execute_script()方法执行JavaScripts代码来移动滚动条的位置

13、 窗口截图

driver.get_screenshot_as_file("D:\baidu_img.jpg") # 截取当前窗口,并指定截图图片的保存位置

13.1 截取验证码图片案例

# encoding:utf-8

from PIL import Image

from selenium import webdriver

url = 'https://weixin.sogou.com/antispider/?from=http%3A%2F%2Fweixin.sogou.com%2Fweixin%3Ftype%3D2%26query%3Dpython'

driver = webdriver.Chrome()

driver.maximize_window() # 将浏览器最大化

driver.get(url)

# 截取当前网页并放到D盘下命名为printscreen,该网页有我们需要的验证码

driver.save_screenshot('D:\python371\python_wordspace\img\printscreen.png')

imgelement = driver.find_element_by_id('seccodeImage') # 定位验证码

location = imgelement.location # 获取验证码x,y轴坐标

print(location)

size = imgelement.size # 获取验证码的长宽

print(size)

rangle = (int(location['x']+110), int(location['y']+60), int(location['x'] + size['width']+165),

int(location['y'] + size['height']+90)) # 写成我们需要截取的位置坐标

i = Image.open("D:\python371\python_wordspace\img\printscreen.png") # 打开截图

frame4 = i.crop(rangle) # 使用Image的crop函数,从截图中再次截取我们需要的区域

frame4 = frame4.convert('RGB')

frame4.save('D:\python371\python_wordspace\img\save.jpg') # 保存我们接下来的验证码图片 进行打码

driver.close()

14、 关闭浏览器

driver.close()

driver.quit()

原文地址:https://www.toutiao.com/article/7069938160943333902/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Python中的函数(二) 在上一篇文章中提到了Python中函数的定义和使用,在这篇文章里我们来讨论下关于函数的一些更深的话题。在学习C语言函数的时候,遇到的问题主要有形参实参的区别、参数的传递和改变、变量的作用域。同样在Python中,关于对函数的理解和使用也存在这些问题。下面来逐一讲解。一.函
Python中的字符串 可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以"Hello world"这个程序作为入门程序,这个程序中要打印的"Hello world"就是字符串。如果你做过自然语言处理方面的研究,并且用Python
Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法。 类是对现实世界中一些事物的封装,
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。 在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Pytho
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非常熟悉,无论在哪门编程语言当中,函数(当然在某些语言里称作方法,意义是相同的)都扮演着至关重要的角色。今天就来了解一下Python中的函数用法。一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明
在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方便和顺手,就是web.py。它由一名黑客所创建,但是不幸的是这位创建者于2013年自杀了。据说现在由
将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime Text 2这款编辑器,然后这段时间就试了一下,就深深地喜欢上这款编辑器了...
Python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句"#include<math.h>"引入math.h这个头文件,否则是无法正常进行调用的。那么在Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中
Python的基础语法 在对Python有了基础的认识之后,下面来了解一下Python的基础语法,看看它和C语言、java之间的基础语法差异。一.变量、表达式和语句 Python中的语句也称作命令,比如print "hello python"这就是一条语句。 表达式,顾名思义,是
Eclipse+PyDevʽjango+Mysql搭建Python web开发环境 Python的web框架有很多,目前主流的有Django、Tornado、Web.py等,最流行的要属Django了,也是被大家最看好的框架之一。下面就来讲讲如何搭建Django的开发环境。一.准备工作 需要下载的
在windows下安装配置Ulipad 今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。 Ulipad下载地址: https://github.com/limodou/ulipad http://files.cnblogs.com/dolphin0520/u...
Python中的函数(三) 在前面两篇文章中已经探讨了函数的一些相关用法,下面一起来了解一下函数参数类型的问题。在C语言中,调用函数时必须依照函数定义时的参数个数以及类型来传递参数,否则将会发生错误,这个是严格进行规定的。然而在Python中函数参数定义和传递的方式相比而言就灵活多了。一.函数参数的
在Notepad++中搭配Python开发环境 Python在最近几年一度成为最流行的语言之一,不仅仅是因为它简洁明了,更在于它的功能之强大。它不仅能够完成一般脚本语言所能做的事情,还能很方便快捷地进行大规模的项目开发。在学习Python之前我们来看一下Python的历史由来,"Pytho
Python中的条件选择和循环语句 同C语言、Java一样,Python中也存在条件选择和循环语句,其风格和C语言、java的很类似,但是在写法和用法上还是有一些区别。今天就让我们一起来了解一下。一.条件选择语句 Python中条件选择语句的关键字为:if 、elif 、else这三个。其基本形式如
关于raw_input( )和sys.stdin.readline( )的区别 之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:import sysline = sys.stdin.readline()
初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法。下面就让我们一起来了解一下Python的编程风格。1.逻辑行与物理行 在Python中有逻辑行和物理行这个概念,物理行是指在编辑器中实际看到的一行,逻辑行是指一条Python语句。在Python中提倡一个物理行只
当我们的代码是有访问网络相关的操作时,比如http请求或者访问远程数据库,经常可能会发生一些错误,有些错误可能重新去发送请求就会成功,本文分析常见可能需要重试的场景,并最后给出python代码实现。
1.经典迭代器 2.将Sentence中的__iter__改成生成器函数 改成生成器后用法不变,但更加简洁。 3.惰性实现 当列表比较大,占内存较大时,我们可以采用惰性实现,每次只读取一个元素到内存。 或者使用更简洁的生成器表达式 4.yield from itertools模块含有大量生成器函数可
本文介绍简单介绍socket的常用函数,并以python-kafka中的源码socketpair为例,来讲解python socket的运用
python实践中经常出现编码相关的异常,大多网上找资料而没有理解原理,导致一次次重复错误。本文对常用Unicode、UTF-8、GB2312编码的原理进行介绍,接着介绍了python字符类型unicode和str以及常见编解码错误UnicodeEncodeError和UnicodeDEcodeEr