selenium

selenium是一个支持各大浏览器的自动化测试工具,包括 Chrome,Safari,Firefox ,ie等。再构造爬虫时,如果我们加入了User-Agent,那么变伪装成了浏览器,可以骗过一些技术水平不太高的网站。但如果使用selenium,则就不是伪装浏览器,而是真正的用浏览器去访问。有时我们可能会遇到这种情况,前端页面展示出来的东西,并不在后端源代码中,自然无法通过使用requests请求获得源码进行爬取。这时候就可以使用selenium进行爬取数据,因为他就是用真实的浏览器去访问页面的,所以出现的内容和我们在前端看到的是一模一样的。

0x01:selenium安装

python下使用pip安装

  1. pip install selenium

此外,因为selenium是配合浏览器一起使用,所以需要下载浏览器的驱动(webdriver),以chrome为例

chrome的webdriver: http://chromedriver.storage.googleapis.com/index.html

不同的Chrome的版本对应的chromedriver.exe 版本也不一样,下载时不要搞错了。如果是最新的Chrome, 下载最新的chromedriver.exe 就可以了。把chromedriver的路径也加到环境变量里。

检测:运行这段代码,会自动打开百度

  1. from selenium import webdriver # 引入webdriver api
  2. driver = webdriver.Chrome() # 使用chrome浏览器声明一个webdriver对象
  3. driver.get('http://www.baidu.com/') # 表示使用chrome以get的方式请求百度的url
  4. driver.find_element_by_id("kw").send_keys("selenium") # 检索到百度的输入框,输入selenium
  5. driver.find_element_by_id("su").click() # 检索到百度的搜索按钮并点击

0x02:元素选取

在上面的实例中,最重要的就是找到搜索框和搜索按钮对应的元素,然后再进行相应的操作(输入关键字、点击),强大的selenium提供了多种提取元素的方法。

单个元素提取

  1. find_element_by_id # 通过元素id
  2. find_element_by_name # 通过name属性
  3. find_element_by_xpath # 通过xpath
  4. find_element_by_link_text # 通过链接文本
  5. find_element_by_partial_link_text
  6. find_element_by_tag_name # 通过标签名
  7. find_element_by_class_name # 通过class名称定位
  8. find_element_by_css_selector # 通过css选择器定位

多个元素提取,返回一个列表

  1. find_elements_by_name
  2. find_elements_by_xpath
  3. find_elements_by_link_text
  4. find_elements_by_partial_link_text
  5. find_elements_by_tag_name
  6. find_elements_by_class_name
  7. find_elements_by_css_selector

0x03:操作元素方法

  • clear 清除元素的内容:clear(self)
  • send_keys 模拟按键输入:send_keys(self, *value)
  • click 点击元素:click(self)
  • submit 提交表单:submit(self)
  • 获取元素属性:get_attribute(self, name)
  • 获取元素文本:text

0x04:页面操作方法

from selenium import webdriver

  • 打开浏览器:driver = webdriver.Chrome()
  • 请求一个url:driver.get("www.baidu.com")
  • 返回当前页面的title:title = driver.title
  • 返回当前页面的url:url = driver.current_url
  • 返回当前页面的源码:source = driver.page_source
  • 关闭当前页面:driver.close()
  • 注销并关闭浏览器:driver.quit()
  • 浏览器前进:driver.forward()
  • 浏览器后退:driver.back()
  • 刷新当前页面:driver.refresh()
  • 获取当前session中的全部cookie:get_cookies(self)
  • 获取当前会中中的指定cookie:get_cookie(self, name)
  • 在当前会话中添加cookie:add_cookie(self, cookie_dict)
  • 添加浏览器User-Agent:

    options.add_argument('User-Agent=Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30')
  • 添加设置项Chrome Options:

    options = webdriver.ChromeOptions()

    options.add_argument('xxxx')

    driver = webdriver.Chrome(chrome_options=options)

0x05:页面等待

既然selenium是使用浏览器发送请求,那么势必会加载一些东西,而且现在的网页越来越多采用了ajax技术。如果代码运行到了提取元素的地方,而这个元素尚未被加载,那么就会报错。为了解决这个问题,selenium提供了两种等待方式,隐式等待显示等待。隐式等待是等待特定的时间,显式等待是指定某一条件直到这个条件成立时继续执行。

  • 隐式等待

    隐式等待比较简单,就是简单地设置一个等待时间,单位为秒。

    1. from selenium import webdriver
    2. driver = webdriver.Chrome()
    3. driver.implicitly_wait(10) # seconds
    4. driver.get("http://somedomain/url_that_delays_loading")
    5. myDynamicElement = driver.find_element_by_id("myDynamicElement")
  • 显式等待

    显式等待指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了。

    1. from selenium import webdriver
    2. from selenium.webdriver.support.ui import WebDriverWait
    3. driver = webdriver.Chrome()
    4. driver.get("http://somedomain/url_that_delays_loading")
    5. try:
    6. element = WebDriverWait(driver, 10).until(
    7. EC.presence_of_element_located((By.ID, "myDynamicElement"))
    8. )
    9. finally:
    10. driver.quit()

wait模块的WebDriverWait类是显性等待类,参数如下:

  1. WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

这里需要特别注意的是until或until_not中的可执行方法method参数,很多人传入了WebElement对象,如下:

  1. WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # 错误

这是错误的用法,这里的参数一定要是可以调用的,即这个对象一定有 call() 方法,否则会抛出异常:

  1. TypeError: 'xxx' object is not callable

在这里,你可以用selenium提供的 expected_conditions 模块中的各种条件,也可以用WebElement的 is_displayed() 、is_enabled()、is_selected() 方法,或者用自己封装的方法都可以。那么接下来我们看一下selenium提供的条件有哪些:

expected_conditions:

xpected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件:

  1. selenium.webdriver.support.expected_conditions(模块)
  2. 这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
  3. title_is
  4. title_contains
  5. 这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
  6. 顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
  7. presence_of_element_located
  8. presence_of_all_elements_located
  9. 这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
  10. 第一个和第三个其实质是一样的
  11. visibility_of_element_located
  12. invisibility_of_element_located
  13. visibility_of
  14. 这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
  15. text_to_be_present_in_element
  16. text_to_be_present_in_element_value
  17. 这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:idnameindexWebElement
  18. frame_to_be_available_and_switch_to_it
  19. 这个条件判断是否有alert出现
  20. alert_is_present
  21. 这个条件判断元素是否可点击,传入locator
  22. element_to_be_clickable
  23. 这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
  24. 第三个传入WebElement对象以及状态,相等返回True,否则返回False
  25. 第四个传入locator以及状态,相等返回True,否则返回False
  26. element_to_be_selected
  27. element_located_to_be_selected
  28. element_selection_state_to_be
  29. element_located_selection_state_to_be
  30. 最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
  31. staleness_of

上面是所有17个condition,与until、until_not组合能够实现很多判断,如果能自己灵活封装,将会大大提高脚本的稳定性。

0x06:鼠标操作

在现实的自动化测试中关于鼠标的操作不仅仅是click()单击操作,还有很多包含在ActionChains类中的操作。如下:

  • context_click(elem) 右击鼠标点击元素elem,另存为等行为
  • double_click(elem) 双击鼠标点击元素elem,地图web可实现放大功能
  • drag_and_drop(source,target) 拖动鼠标,源元素按下左键移动至目标元素释放
  • move_to_element(elem) 鼠标移动到一个元素上
  • click_and_hold(elem) 按下鼠标左键在一个元素上
  • perform() 在通过调用该函数执行ActionChains中存储行为

举例如下图所示,获取通过鼠标右键另存为百度图片logo。代码:

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.keys import Keys
  4. from selenium.webdriver.common.action_chains import ActionChains
  5. driver = webdriver.Firefox()
  6. driver.get("http://www.baidu.com")
  7. #鼠标移动至图片上 右键保存图片
  8. elem_pic = driver.find_element_by_xpath("//div[@id='lg']/img")
  9. print elem_pic.get_attribute("src")
  10. action = ActionChains(driver).move_to_element(elem_pic)
  11. action.context_click(elem_pic)
  12. #重点:当右键鼠标点击键盘光标向下则移动至右键菜单第一个选项
  13. action.send_keys(Keys.ARROW_DOWN)
  14. time.sleep(3)
  15. action.send_keys('v') #另存为
  16. action.perform()
  17. #获取另存为对话框(失败)
  18. alert.switch_to_alert()
  19. alert.accept()

0x07:键盘操作

在webdriver的Keys类中提供了键盘所有的按键操作,当然也包括一些常见的组合键操作如Ctrl+A(全选)、Ctrl+C(复制)、Ctrl+V(粘贴)。

  • send_keys(Keys.ENTER) 按下回车键
  • send_keys(Keys.TAB) 按下Tab制表键
  • send_keys(Keys.SPACE) 按下空格键space
  • send_keys(Kyes.ESCAPE) 按下回退键Esc
  • send_keys(Keys.BACK_SPACE) 按下删除键BackSpace
  • send_keys(Keys.SHIFT) 按下shift键
  • send_keys(Keys.CONTROL) 按下Ctrl键
  • send_keys(Keys.ARROW_DOWN) 按下鼠标光标向下按键
  • send_keys(Keys.CONTROL,'a') 组合键全选Ctrl+A
  • send_keys(Keys.CONTROL,'c') 组合键复制Ctrl+C
  • send_keys(Keys.CONTROL,'x') 组合键剪切Ctrl+X
  • send_keys(Keys.CONTROL,'v') 组合键粘贴Ctrl+V

这里使用的例子参考虫师的书籍《selenium2 python自动化测试》

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.keys import Keys
  4. driver = webdriver.Firefox()
  5. driver.get("http://www.baidu.com")
  6. #输入框输入内容
  7. elem = driver.find_element_by_id("kw")
  8. elem.send_keys("Eastmount CSDN")
  9. time.sleep(3)
  10. #删除一个字符CSDN 回退键
  11. elem.send_keys(Keys.BACK_SPACE)
  12. elem.send_keys(Keys.BACK_SPACE)
  13. elem.send_keys(Keys.BACK_SPACE)
  14. elem.send_keys(Keys.BACK_SPACE)
  15. time.sleep(3)
  16. #输入空格+"博客"
  17. elem.send_keys(Keys.SPACE)
  18. elem.send_keys(u"博客")
  19. time.sleep(3)
  20. #ctrl+a 全选输入框内容
  21. elem.send_keys(Keys.CONTROL,'a')
  22. time.sleep(3)
  23. #ctrl+x 剪切输入框内容
  24. elem.send_keys(Keys.CONTROL,'x')
  25. time.sleep(3)
  26. #输入框重新输入搜索
  27. elem.send_keys(Keys.CONTROL,'v')
  28. time.sleep(3)
  29. #通过回车键替代点击操作
  30. driver.find_element_by_id("su").send_keys(Keys.ENTER)
  31. time.sleep(3)
  32. driver.quit()

selenium使用总结的更多相关文章

  1. Python爬虫小白入门(四)PhatomJS+Selenium第一篇

    一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...

  2. Selenium的PO模式(Page Object Model)[python版]

     Page Object Model 简称POM  普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...

  3. selenium元素定位篇

    Selenium webdriver是完全模拟用户在对浏览器进行操作,所有用户都是在页面进行的单击.双击.输入.滚动等操作,而webdriver也是一样,所以需要我们指定元素让webdriver进行单 ...

  4. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  5. 幼儿园的 selenium

    from selenium import webdriver     *固定开头     b=webdriver.Firefox()              *打开火狐浏览器    browser. ...

  6. 使用selenium编写脚本常见问题(一)

    前提:我用selenium IDE录制脚本,我用java写的脚本,如果大家想看的清楚明白推荐java/Junit4/Webdriver 我用的是java/TestNG/remote control 1 ...

  7. 关于selenium RC的脚本开发

    第一.需要录制脚本,找个我也不说了.就是在firefox下下载一个selenium-IDE并且安装. 第二.在工具里找到selenium-IDE点击运行. 第三.默认是红色按钮点击状态的,接下来随便你 ...

  8. 基于python的selenium自动化测试环境安装

    1. Python2安装 官方网站:https://www.python.org/downloads/ (python3或新版本已经默认集成了pip包和path,安装的时候打勾就行,可以直接跳过下面第 ...

  9. Selenium+python 配置

    1. 安装python, www.python.org. 下载最新的python,应该是32位的.注意配置环境变量. 2. 安装PIP(pip是一个以Python计算机程序语言写成的软件包管理系统). ...

  10. selenium 使用action进行鼠标,键盘操作

    <!--test.html--> <html> <head> <title>Set Timeout</title> <script&g ...

随机推荐

  1. Arduino 常用函数参考文档

    封装好的API,使得程序中的语句更容易被理解,我们不用理会单片机中繁杂的寄存器配置,就能直观的控制Arduino,增强程序可读性的同时,也提高了开发效率. 本篇主要介绍: 一,项目结构 1.setup ...

  2. js中更改this指向 以及回顾bind、call和apply

    1.更改this指向 方法1:对this进行保存            var _this = this; 例: var _this = this;     document.onclick = fu ...

  3. 消息中间件——RabbitMQ(七)高级特性全在这里!(上)

    前言 前面我们介绍了RabbitMQ的安装.各大消息中间件的对比.AMQP核心概念.管控台的使用.快速入门RabbitMQ.本章将介绍RabbitMQ的高级特性.分两篇(上/下)进行介绍. 消息如何保 ...

  4. python程序中使用MySQL数据库

    目录 python程序中使用MySQL数据库 1 pymysql连接数据库 2 sql 注入 3 增删改查操作 4 pymysql使用总结 python程序中使用MySQL数据库 1.python中使 ...

  5. MySQL 5.7 的安装历程

    mysql5.7零基础入门级的安装教程: 安装环境:Windows 10, 64 位(联想拯救者R720) 安装版本:mysql-5.7.25-winx64 一.下载 1.进入官网 首先,下载MySQ ...

  6. JS之clientWidth、offsetWidth等属性介绍

    一.clientXXX 属性 代码演示 // css 部分 <style> .test{ width:100px; height:100px; border:1px solid red; ...

  7. asp.net comp雷达图

    <system.web> <httpHandlers> <add path="ChartImg.axd" verb="GET,HEAD,PO ...

  8. TensorFlow Distribution(分布式中的数据读取和训练)

    本文目的 在介绍estimator分布式的时候,官方文档由于版本更新导致与接口不一致.具体是:在estimator分布式当中,使用dataset作为数据输入,在1.12版本中,数据训练只是datase ...

  9. 09 Scrapy框架在爬虫中的使用

    一.简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.它集成高性能异步下载,队列,分布式,解析,持久化等. Scrapy 是基于twisted框架开发而来,twisted是一个 ...

  10. CodeForces 1083 E The Fair Nut and Rectangles 斜率优化DP

    The Fair Nut and Rectangles 题意:有n个矩形,然后你可以选择k个矩形,选择一个矩形需要支付代价 ai, 问 总面积- 总支付代价 最大能是多少, 保证没有矩形套矩形. 题解 ...