selenium 基础语法

一、 环境配置

1、 安装环境

安装 selenium 第三方库

  1. pip install selenium

下载浏览器驱动:

需要把这些浏览器驱动放入 Python 应用目录里面的 Script 文件夹里面

2、 配置参数

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

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

  1. from selenium import webdriver
  2. option = webdriver.ChromeOptions()
  3. driver = webdriver.Chrome(chrome_options=option)

创建了ChromeOptions类之后就是添加参数,添加参数有几个特定的方法,分别对应添加不同类型的配置项目

  1. from selenium import webdriver
  2. option = webdriver.ChromeOptions()
  3. # 添加启动参数
  4. option.add_argument()
  5. # 添加扩展应用
  6. option.add_extension()
  7. option.add_encoded_extension()
  8. # 添加实验性质的设置参数
  9. option.add_experimental_option()
  10. # 设置调试器地址
  11. option.debugger_address()

常用配置参数:

  1. from selenium import webdriver
  2. option = webdriver.ChromeOptions()
  3. # 添加UA
  4. 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"')
  5. # 指定浏览器分辨率
  6. options.add_argument('window-size=1920x3000')
  7. # 谷歌文档提到需要加上这个属性来规避bug
  8. chrome_options.add_argument('--disable-gpu')
  9. # 隐藏滚动条, 应对一些特殊页面
  10. options.add_argument('--hide-scrollbars')
  11. # 不加载图片, 提升速度
  12. options.add_argument('blink-settings=imagesEnabled=false')
  13. # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
  14. options.add_argument('--headless')
  15. # 以最高权限运行
  16. options.add_argument('--no-sandbox')
  17. # 手动指定使用的浏览器位置
  18. options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
  19. #添加crx插件
  20. option.add_extension('d:\crx\AdBlock_v2.17.crx')
  21. # 禁用JavaScript
  22. option.add_argument("--disable-javascript")
  23. # 设置开发者模式启动,该模式下webdriver属性为正常值
  24. options.add_experimental_option('excludeSwitches', ['enable-automation'])
  25. # 禁用浏览器弹窗
  26. prefs = {
  27. 'profile.default_content_setting_values' : {
  28. 'notifications' : 2
  29. }
  30. }
  31. options.add_experimental_option('prefs',prefs)
  32. # 添加代理 ip
  33. options.add_argument("--proxy-server=http://XXXXX.com:80")
  34. driver = webdriver.Chrome(chrome_options=chrome_options)

其他配置项目参数

  1. user-data-dir=”[PATH]”
  2. # 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区
  3.   disk-cache-dir=”[PATH]“
  4. # 指定缓存Cache路径
  5.   disk-cache-size=
  6. # 指定Cache大小,单位Byte
  7.   first run
  8. # 重置到初始状态,第一次运行
  9.   incognito
  10. # 隐身模式启动
  11.   disable-javascript
  12. # 禁用Javascript
  13.   --omnibox-popup-count="num"
  14. # 将地址栏弹出的提示菜单数量改为num个
  15.   --user-agent="xxxxxxxx"
  16. # 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果
  17.   --disable-plugins
  18. # 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果
  19.   --disable-javascript
  20. # 禁用JavaScript,如果觉得速度慢在加上这个
  21.   --disable-java
  22. # 禁用java
  23.   --start-maximized
  24. # 启动就最大化
  25.   --no-sandbox
  26. # 取消沙盒模式
  27.   --single-process
  28. # 单进程运行
  29.   --process-per-tab
  30. # 每个标签使用单独进程
  31.   --process-per-site
  32. # 每个站点使用单独进程
  33.   --in-process-plugins
  34. # 插件不启用单独进程
  35.   --disable-popup-blocking
  36. # 禁用弹出拦截
  37.   --disable-plugins
  38. # 禁用插件
  39.   --disable-images
  40. # 禁用图像
  41.   --incognito
  42. # 启动进入隐身模式
  43.   --enable-udd-profiles
  44. # 启用账户切换菜单
  45.   --proxy-pac-url
  46. # 使用pac代理 [via 1/2]
  47.   --lang=zh-CN
  48. # 设置语言为简体中文
  49.   --disk-cache-dir
  50. # 自定义缓存目录
  51.   --disk-cache-size
  52. # 自定义缓存最大值(单位byte)
  53.   --media-cache-size
  54. # 自定义多媒体缓存最大值(单位byte)
  55.   --bookmark-menu
  56. # 在工具 栏增加一个书签按钮
  57.   --enable-sync
  58. # 启用书签同步

3、 常用参数搭配

制作无头浏览器

  1. # 第一种写法
  2. from selenium import webdriver
  3. from selenium.webdriver.chrome.options import Options
  4. chrome_options = Options()
  5. chrome_options.add_argument('--headless')
  6. chrome_options.add_argument('--disable-gpu')
  7. driver = webdriver.Chrome(chrome_options=chrome_options)
  8. # 第二种写法
  9. from selenium import webdriver
  10. options = webdriver.ChromeOptions()
  11. options.add_argument('--headless')
  12. options.add_argument('--disable-gpu')
  13. driver = webdriver.Chrome(chrome_options=options)

规避检测

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

实现规避检测

  1. from selenium import webdriver
  2. from selenium.webdriver import ChromeOptions
  3. options = ChromeOptions()
  4. options.add_experimental_option('excludeSwitcher', ['enable-automation'])
  5. driver = webdriver.Chrome(options=options)

注意:这里只能使用 options 添加

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

4、 分浏览器启动

  1. from selenium import webdriver
  2. driver = webdriver.Firefox() # Firefox浏览器
  3. # driver = webdriver.Firefox(executable_path="驱动路径")
  4. driver = webdriver.Chrome() # Chrome浏览器
  5. driver = webdriver.Ie() # Internet Explorer浏览器
  6. driver = webdriver.Edge() # Edge浏览器
  7. driver = webdriver.Opera() # Opera浏览器
  8. driver = webdriver.PhantomJS() # PhantomJS

二、 基本语法

1、 元素定位

元素定位语法

常用语法:

  1. find_element_by_id()
  2. find_element_by_name()
  3. find_element_by_class_name()
  4. find_element_by_tag_name()
  5. find_element_by_link_text()
  6. find_element_by_partial_link_text()
  7. find_element_by_xpath()
  8. find_element_by_css_selector()

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

2、 控制浏览器操作

控制浏览器大小

  • driver.set_window_size(480, 800)

浏览器后退,前进

  • 前进:driver.forward()
  • 后退:driver.back()

刷新

  • driver.refresh()

3、 操作元素的方法

3.1 点击和输入

  1. driver.find_element_by_id("kw").clear() # 清空文本
  2. driver.find_element_by_id("kw").send_keys("selenium") # 模拟按键输入
  3. driver.find_element_by_id("su").click() # 单击元素

3.2 提交

在搜索框模拟回车操作

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

3.3 其他

  1. drive.size # 返回元素的尺寸
  2. drive.text # 获取元素的文本
  3. drive.get_attribute(name) # 获得属性值
  4. drive.is_displayed() # 设置该元素是否用户可见
  5. drive.page_source # 获取网页源代码

4、 鼠标操作

在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供

ActionChains 类提供了鼠标操作的常用方法:

  1. click(on_element=None) ——单击鼠标左键
  2. click_and_hold(on_element=None) ——点击鼠标左键,不松开
  3. context_click(on_element=None) ——点击鼠标右键
  4. double_click(on_element=None) ——双击鼠标左键
  5. drag_and_drop(source, target) ——拖拽到某个元素然后松开
  6. drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
  7. key_down(value, element=None) ——按下某个键盘上的键
  8. key_up(value, element=None) ——松开某个键
  9. move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
  10. move_to_element(to_element) ——鼠标移动到某个元素
  11. move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
  12. perform() ——执行链中的所有动作
  13. release(on_element=None) ——在某个元素位置松开鼠标左键
  14. send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
  15. send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

语法:

  1. from selenium.webdriver.common.action_chains import ActionChains
  2. # 获取元素
  3. menu = driver.find_element_by_css_selector(".nav")
  4. hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
  5. # 链式写法
  6. ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
  7. # 分步写法
  8. actions = ActionChains(driver)
  9. actions.move_to_element(menu)
  10. actions.click(hidden_submenu)
  11. actions.perform()

5、 键盘操作

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

使用语法:

  1. from selenium.webdriver.common.keys import Keys
  2. element.send_keys(键盘事件)
  3. # 常用键盘事件
  4. Keys.BACK_SPACE # 回退键(BackSpace)
  5. Keys.TAB # 制表键(Tab)
  6. Keys.ENTER # 回车键(Enter)
  7. Keys.SHIFT # 大小写转换键(Shift)
  8. Keys.CONTROL # Control键(Ctrl)
  9. Keys.ALT # ALT键(Alt)
  10. Keys.ESCAPE # 返回键(Esc)
  11. Keys.SPACE # 空格键(Space)
  12. Keys.PAGE_UP # 翻页键上(Page Up)
  13. Keys.PAGE_DOWN # 翻页键下(Page Down)
  14. Keys.END # 行尾键(End)
  15. Keys.HOME # 行首键(Home)
  16. Keys.LEFT # 方向键左(Left)
  17. Keys.UP # 方向键上(Up)
  18. Keys.RIGHT # 方向键右(Right)
  19. Keys.DOWN # 方向键下(Down)
  20. Keys.INSERT # 插入键(Insert)
  21. DELETE # 删除键(Delete)
  22. NUMPAD0 ~ NUMPAD9 # 数字键1-9
  23. Keys.F5 # 刷新键
  24. F1 ~ F12 # F1 - F12键
  25. (Keys.CONTROL, 'a') # 组合键Control+a,全选
  26. (Keys.CONTROL, 'c') # 组合键Control+c,复制
  27. (Keys.CONTROL, 'x') # 组合键Control+x,剪切
  28. (Keys.CONTROL, 'v') # 组合键Control+v,粘贴

其他事件可以通过查看源码获取

6、 获取断言信息

  1. title = driver.title # 打印当前页面title
  2. now_url = driver.current_url # 打印当前页面URL
  3. user = driver.find_element_by_class_name('nums').text # # 获取结果数目

7、 等待页面加载完成

7.1 显示等待

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

实例:

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions
  5. driver = webdriver.Firefox()
  6. driver.get("http://www.baidu.com")
  7. element = WebDriverWait(driver, 5, 0.5).until(
  8. expected_conditions.presence_of_element_located((By.ID, "kw"))
  9. ) # expected_conditions.presence_of_element_located()方法判断元素是否存在
  10. element.send_keys('selenium')
  11. driver.quit()

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

语法:

  1. WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

参数:

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

7.2 隐式等待

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

  1. from selenium import webdriver
  2. driver = webdriver.Firefox()
  3. driver.implicitly_wait(10) # 隐式等待 10 s
  4. driver.get("http://www.baidu.com")
  5. myDynamicElement = driver.find_element_by_id("myDynamicElement")

8、 页面切换

  1. driver.switch_to_window("windowName") # 切换窗口
  2. driver.switch_to_frame("frameName") # 切换进框架里面
  3. driver.switch_to_default_content() # 退出框架

案例

  1. #先通过xpth定位到iframe
  2. xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')
  3. #再将定位对象传给switch_to_frame()方法
  4. driver.switch_to_frame(xf)
  5. driver.switch_to_default_content() # 退出框架

9、 框处理

9.1 警告框处理

语法:

  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 选中方法
  1. from selenium import webdriver
  2. from selenium.webdriver.support.select import Select
  3. driver = webdriver.Chrome()
  4. driver.implicitly_wait(10) # 隐式等待
  5. driver.get('http://www.baidu.com')
  6. sel = driver.find_element_by_xpath("//select[@id='nr']")
  7. """
  8. 有三种方式选择下拉框
  9. select_by_value(value) 通过value属性值进行选择
  10. select_by_index(index) 通过索引查找,index从0开始
  11. select_by_visible_text(text) 通过标签显示的text进行选择
  12. """
  13. Select(sel).select_by_value(value)
9.2.1.2 取消选择方法
  1. """
  2. deselect_all() 取消全选
  3. deselect_by_value(value) 通过value属性取消选择
  4. deselect_by_index(index) 通过index取消选择
  5. deselect_by_visible_text(text) 通过text取消选择
  6. """
  7. # 使用方法
  8. Select(sel).deselect_by_value(value)
9.2.2 先定位select 然后在定位option
  1. # 定位到下拉选择框
  2. selector = driver.find_element_by_id("selectdemo")
  3. # selector = driver.find_element_by_xpath(".//*[@id='selectdemo']")
  4. # 选择"篮球运动员"
  5. selector.find_element_by_xpath("//option[@value='210103']").click()
  6. # selector.find_elements_by_tag_name("option")[2].click()
9.2.3 直接通过xpath层级标签定位
  1. # 直接通过xpath定位并选择"篮球运动员"
  2. driver.find_element_by_xpath(".//*[@id='selectdemo']/option[3]").click()

10、 文件上传

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

11、 cookie操作

WebDriver操作cookie的方法:

  • get_cookies(): 获得所有cookie信息。
  • get_cookie(name): 返回字典的key为“name”的cookie信息。
  • add_cookie(cookie_dict): 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值。
  • delete_cookie(name,optionsString):删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”。
  • delete_all_cookies(): 删除所有cookie信息

11.1 cookie 登录方法

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

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

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

12、 调用JS代码

  1. js="window.scrollTo(100,450);"
  2. driver.execute_script(js) # 通过javascript设置浏览器窗口的滚动条位置

通过execute_script()方法执行JavaScripts代码来移动滚动条的位置

13、 窗口截图

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

13.1 截取验证码图片案例

  1. # encoding:utf-8
  2. from PIL import Image
  3. from selenium import webdriver
  4. url = 'https://weixin.sogou.com/antispider/?from=http%3A%2F%2Fweixin.sogou.com%2Fweixin%3Ftype%3D2%26query%3Dpython'
  5. driver = webdriver.Chrome()
  6. driver.maximize_window() # 将浏览器最大化
  7. driver.get(url)
  8. # 截取当前网页并放到D盘下命名为printscreen,该网页有我们需要的验证码
  9. driver.save_screenshot('D:\\python371\\python_wordspace\\img\\printscreen.png')
  10. imgelement = driver.find_element_by_id('seccodeImage') # 定位验证码
  11. location = imgelement.location # 获取验证码x,y轴坐标
  12. print(location)
  13. size = imgelement.size # 获取验证码的长宽
  14. print(size)
  15. rangle = (int(location['x']+110), int(location['y']+60), int(location['x'] + size['width']+165),
  16. int(location['y'] + size['height']+90)) # 写成我们需要截取的位置坐标
  17. i = Image.open("D:\\python371\\python_wordspace\\img\\printscreen.png") # 打开截图
  18. frame4 = i.crop(rangle) # 使用Image的crop函数,从截图中再次截取我们需要的区域
  19. frame4 = frame4.convert('RGB')
  20. frame4.save('D:\\python371\\python_wordspace\\img\\save.jpg') # 保存我们接下来的验证码图片 进行打码
  21. driver.close()

14、 关闭浏览器

  • driver.close() 关闭单个窗口
  • driver.quit() 关闭所有窗口

三、 总结

参考文章:https://selenium-python-zh.readthedocs.io/en/latest/installation.html

Python 中 selenium 库的更多相关文章

  1. 浅谈python中selenium库调动webdriver驱动浏览器的实现原理

    最近学web自动化时用到selenium库,感觉很神奇,遂琢磨了一下,写了点心得. 当我们输入以下三行代码并执行时,会发现新打开了一个浏览器窗口并访问了百度首页,然而这是怎么做到的呢? from se ...

  2. python爬虫---selenium库的用法

    python爬虫---selenium库的用法 selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器 在爬虫中的应用主要是用来解决JS渲染的问题. 1.使用前需要安装这个 ...

  3. 安装python的selenium库和驱动

    对于使用selenium来进行python爬虫操作可以简化好多操作,它实际上的运行就是通过打开一个浏览器来一步一步的按照你的代码来执行 如果安装过python编译器后应该pip工具也是有的,验证pyt ...

  4. 使用Python的selenium库制作脚本,支持后台运行

    本文介绍如何使用Python的selenium库制作脚本.概念:       Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome.Firefox.Safari等主流界面 ...

  5. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  6. Python中第三方库Requests库的高级用法详解

    Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...

  7. Python爬虫-- selenium库

    selenium库 selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(S ...

  8. 解决python 导入selenium 库后自动化运行成功但是报错问题

    本章节开始进入自动化的基础教学了,首先我们要对我们的工具有一定的熟练使用程度,做自动化常用的工具一个是搭建 RobotFramework自动化框架,另外一个便是我们最常用的python 工作原理是比较 ...

  9. python利用selenium库识别点触验证码

    利用selenium库和超级鹰识别点触验证码(学习于静谧大大的书,想自己整理一下思路) 一.超级鹰注册:超级鹰入口 1.首先注册一个超级鹰账号,然后在超级鹰免费测试地方可以关注公众号,领取1000积分 ...

随机推荐

  1. RHCSA 第三天

    1.将echo "This is my first time to use pipe"内容输出到屏幕上,且保存到pipe_data.txt中 2. 重定向: a.新建一个文件red ...

  2. 1120day-户别确认

    1.实体类 package com.edu.empity; public class People { private String hubie; private String livetype; p ...

  3. JUC之阻塞队列(BlockingQueue)基础

    阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作支持阻塞的插入和移除方法. 阻塞队列常用于生产者和消费者的场景: 当队列为空的,从队列中获取元素的操作将会 ...

  4. Qt之简单绘图实现

    效果图:                                              可以实现打开图片,在打开的图片上画图,可以保存图片,以及橡皮擦,画笔调大调粗换色功能. 代码: XI ...

  5. HMS Core 6.3.0 版本发布公告

    新增内容风控检测,若用户输入内容不符合国家法律法规要求,风控将会拦截,无法翻译手语动作. 查看详情>> 新增受众同步至HUAWEI Ads功能,实现精准投放高价值用户,提升广告效率: 新增 ...

  6. 为什么 Redis 的查询很快, Redis 如何保证查询的高效

    Redis 如何保证高效的查询效率 为什么 Redis 比较快 Redis 中的数据结构 1.简单动态字符串 SDS 对比 c 字符串的优势 SDS可以常数级别获取字符串的长度 杜绝缓冲区溢出 减少修 ...

  7. windows根据进程id杀死任务进程

    然后打开任务管理器找出来结束进程即可

  8. cygwin -- 在windows平台上运行的unix模拟环境

    cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购).它对于学 ...

  9. python24day

    内容回顾 命名空间 组合 一个类的对象是另一个类对象的属性 两个类之间有 什么有什么二点关系:例:班级有学生 学生和课程.圆形和圆环.班级和课程 计算器 from functools import r ...

  10. 分治FFT小记🐤

    分治FFT:在 $O(n \log^2 n)$ 的时间内求出类似于 $f_i=\sum\limits_{j=0}^{i-1}g(i-j)f(j)$ 之类的递推式 思想:同 CDQ 分治的思想,先分成左 ...