热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:小白学Python爬虫(28):自动化测试框架Selenium从入门到放弃(下)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了小白学Python爬虫(28):自动化测试框架Selenium从入门到放弃(下)相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)相关的知识,希望对你有一定的参考价值。




人生苦短,我用 Python


前文传送门:

小白学 Python 爬虫(1):开篇

小白学 Python 爬虫(2):前置准备(一)基本类库的安装

小白学 Python 爬虫(3):前置准备(二)Linux基础入门

小白学 Python 爬虫(4):前置准备(三)Docker基础入门

小白学 Python 爬虫(5):前置准备(四)数据库基础

小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装

小白学 Python 爬虫(7):HTTP 基础

小白学 Python 爬虫(8):网页基础

小白学 Python 爬虫(9):爬虫基础

小白学 Python 爬虫(10):Session 和 COOKIEs

小白学 Python 爬虫(11):urllib 基础使用(一)

小白学 Python 爬虫(12):urllib 基础使用(二)

小白学 Python 爬虫(13):urllib 基础使用(三)

小白学 Python 爬虫(14):urllib 基础使用(四)

小白学 Python 爬虫(15):urllib 基础使用(五)

小白学 Python 爬虫(16):urllib 实战之爬取妹子图

小白学 Python 爬虫(17):Requests 基础使用

小白学 Python 爬虫(18):Requests 进阶操作

小白学 Python 爬虫(19):Xpath 基操

小白学 Python 爬虫(20):Xpath 进阶

小白学 Python 爬虫(21):解析库 Beautiful Soup(上)

小白学 Python 爬虫(22):解析库 Beautiful Soup(下)

小白学 Python 爬虫(23):解析库 pyquery 入门

小白学 Python 爬虫(24):2019 豆瓣电影排行

小白学 Python 爬虫(25):爬取股票信息

小白学 Python 爬虫(26):为啥买不起上海二手房你都买不起

小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到放弃(一)


AJAX

在介绍交互之前,我们先简单了解一下新名词:AJAX 。

AJAX 全写为 “Asynchronous Javascript And XML” (异步 Javascript 和 XML),是指一种创建交互式网页应用的网页开发技术。

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

重点来了,我们如果在网站中使用 AJAX ,可以在整个网页不刷新的情况下,更够更新网页上的显示信息(DOM 节点),也就是 DOM 节点,这种技术被广泛的应用到各个网站之中,最开始的时候,大家都只是使用它更新部分的网页,也不知道是哪位大佬异想天开:既然 AJAX 可以更新部分网页,那么能不能用它来更新全部网页呢?这就产生了现代的前端框架:React 、 Vue 和 Angular。

这种思想,现在被更加广泛的应用于各大网站之中,因为这种方式,前端页面上只有最基础的 DOM 节点,其余所有的 DOM 节点都是由 Javascript 动态渲染出来的,而 Javascript 都是经过打包处理的,可读性极差。

那么为什么要选用前端框架呢? HTML + CSS + JQuery 就不行么?

当然不是,其实之所以现在我们需要选择框架,本质上是因为我们面临的需求变了。大家肯定都明白如果我们只写一个纯展示信息的页面,没有任何交互功能的页面,其实即便是现在,我们也是不需要选择框架的,我们只需要写几行 CSS 和 HTML 就可以完成任务。

所以是因为我们面临的需求变得复杂了,我们的应用经常需要在运行时做一些交互。

现代的前端开发,我们开发的应用经常需要在运行时来做一些交互,这些交互在早期只是个幻灯片或者 Tab 切换下拉菜单等一些简单的交互,这些交互用 JQuery 实现完全没什么问题。但现代的前端我们的目标是用 Web 去 PK 原生应用,去和 Native 进行 PK 。

emmmmmmmmm,聊偏了,下面我们接着聊 Selenium 。


等待

如今,大多数 Web 应用程序都在使用 AJAX 技术。当浏览器加载页面时,该页面中的元素可能会以不同的时间间隔加载。这使定位元素变得困难:如果 DOM 中尚不存在元素,则定位函数将引发 ElementNotVisibleException 异常。使用等待,我们可以解决此问题。等待在执行的动作之间提供了一定的松弛时间-主要是定位元素或对该元素进行的任何其他操作。

Selenium Webdriver 提供两种类型的等待-隐式和显式。显式等待使 WebDriver 等待特定条件发生,然后再继续执行。隐式等待使 WebDriver 在尝试查找元素时轮询DOM一定时间。


显式等待

我们可以使用 time.sleep() 来设定等待时间,完全没有问题,但是它需要将条件设置为要等待的确切时间段。如果我们不知道准确的渲染时间,我们就无法设定一个比较合适的值。

Selenium 为我们提供了 WebDriverWait 与 ExpectedCondition 来完成这件事情,看代码:

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
driver = webdriver.Chrome()
driver.get("https://www.jd.com/")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "key"))
)
finally:
driver.quit()

结果如下:


上面我们使用了 WebDriverWait 来设置最长等待时间,这里我们选择获取 JD 首页的输入框,我们限定的等待时间为 10s ,如果它在 10s 内都无法返回结果,将会抛出 TimeoutException 。默认情况下, WebDriverWait 每 500 毫秒调用 ExpectedCondition ,直到成功返回。


隐式等待

隐式等待告诉 WebDriver 在尝试查找不立即可用的一个或多个元素时在一定时间内轮询 DOM 。默认设置为 0 。设置后,将在 WebDriver 对象的生存期内设置隐式等待。

from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
driver.get("https://www.jd.com/")
key = driver.find_element_by_id("key")
print(key)

节点交互

Selenium 为我们提供了一些节点的交互动作,如输入文字时可以用 send_keys() 方法,清空文字时可以用 clear() 方法,点击按钮时可以用 click() 方法。

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get(\'https://www.taobao.com/\')
input = driver.find_element_by_id(\'q\')
input.send_keys(\'IPad\')
time.sleep(1)
input.clear()
input.send_keys(\'Surface Pro\')
button = driver.find_element_by_class_name(\'btn-search\')
button.click()

在上面这个示例中,我们先打开淘宝网,并且开启了隐式等待,先在搜索框中输入了 IPad ,在等待 1s 后删除,再输入了 Surface Pro ,然后点击了搜索按钮,先在淘宝搜索需要用户登录才能搜索,所以我们直接跳转到了登录页。


执行 Javascript

对于某些 Selenium API 没有提供的操作,我们可以通过模拟运行 Javascript 的方式来完成,用到的方法是 execute_script() ,比如我们在淘宝首页将滚动条滑到底部:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get(\'https://www.taobao.com/\')
driver.execute_script(\'window.scrollTo(0, document.body.scrollHeight)\')

获取信息

前面我们介绍了如何拿到 DOM 节点,那么最重要的是我们要从 DOM 节点上来获取我们需要的信息。

因为我们获取的是 WebElement 类型,而 WebElement 也提供了相关的方法来提取节点信息。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 实例化一个启动参数对象
chrome_optiOns= Options()
# 设置浏览器窗口大小
chrome_options.add_argument(\'--window-size=1366, 768\')
# 启动浏览器
driver = webdriver.Chrome(chrome_optiOns=chrome_options)
url = \'https://www.geekdigging.com/\'
driver.get(url)
title = driver.find_element_by_xpath(\'//*[@id="text-4"]/div/div/div[1]/div[2]/a\')
print(title)
# 获取属性信息
print(title.get_attribute(\'href\'))
# 获取文本信息
print(title.text)
# 获取位置
print(title.location)
# 获取大小
print(title.size)

上面因为 Chrome 默认打开大小有点小,打开小编博客的时候小编选择的这个 DOM 节点正好看到,所以小编设置了一下 Chrome 浏览器打开时的大小。

具体信息的提取小编列出了一部分,都加好注释了,还有一部分比较有意思的属性小编列在下面,供大家参考:



  • parent:查找到此元素的WebDriver实例的内部引用。

  • rect:具有元素大小和位置的字典。

  • screenshot_as_base64:以 base64 编码字符串的形式获取当前元素的屏幕快照。

  • screenshot_as_png:以二进制数据获取当前元素的屏幕截图。

最后这两个获取元素屏幕快照,在获取验证码的时候将验证码截取出来会很好用的。


前进和后退

我们使用浏览器最上面的地方有一个前进和后退按钮,Selenium 完成这两个动作使用了 back()forward() 这两个方法。

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

这个各位同学应该都看的懂,小编就不多啰嗦了。


COOKIEs

又到了一个重点内容, COOKIEs ,它是和服务端保持会话的一个重要元素。 Selenium 为我们提供了一些方法,让我们可以方便的对 COOKIEs 进行增删改查等操作。示例如下:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get(\'https://www.geekdigging.com/\')
# 获取 COOKIEs
print(browser.get_COOKIEs())
# 添加一个 COOKIE
browser.add_COOKIE({\'name\': \'name\', \'domain\': \'www.geekdigging.com\', \'value\': \'geekdigging\'})
print(browser.get_COOKIEs())
# 删除所有 COOKIE
browser.delete_all_COOKIEs()
print(browser.get_COOKIEs())

Selenium 的简单介绍就到这里了,希望各位同学看完后能自己动手试一试,毕竟并不难。


示例代码

本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。

示例代码-Github

示例代码-Gitee


参考

https://blog.csdn.net/caoxuecheng001/article/details/81290643

https://www.jianshu.com/p/02af89375b54

https://cuiqingcai.com/5630.html



推荐阅读
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 1.Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时 ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • XMLhttpREquest_Ajax技术总结之XmlHttpRequest
    Ajax1、 什么是ajax   ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Struts2+Sring+Hibernate简单配置
    2019独角兽企业重金招聘Python工程师标准Struts2SpringHibernate搭建全解!Struts2SpringHibernate是J2EE的最 ... [详细]
author-avatar
最佳肖妮妮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有