目录

  • 认识Selenium
    • Selenium是什么
    • Selenium的发展
    • Selenium的安装
  • Selenium快速入门
    • Selenium八种元素定位方法
    • Selenium库常用的方法
  • Selenium实战练习
    • 准备工作
    • 代码实现
  • 完整代码

认识Selenium

Selenium是什么

这里引用Selenium中文网的介绍:

“Selenium测试直接运行在浏览器中,就像真正的用户在操作一样”
Selenium 是web自动化测试工具集,包括IDE、Grid、RC(selenium 1.0)、WebDriver(selenium 2.0)等。

Selenium IDE 是firefox浏览器的一个插件。提供简单的脚本录制、编辑与回放功能。

Selenium Grid 是用来对测试脚步做分布式处理。现在已经集成到selenium server 中了。

RC和WebDriver 更多应该把它看成一套规范,在这套规范里定义客户端脚步与浏览器交互的协议。以及元素定位与操作的接口。

Selenium的发展

Selenium 诞生于 2004 年,Selenium RC(远程控制)和 Selenium ID诞生也就是Selenium1,由于它使用的是基于Javascript的自动化引擎,浏览器对于Javascript的使用有诸多限制,使得Selenium的使用非常艰难。2006年出现了一个新项目WebDriver,这一项目主要目的是为了解决JavaScript环境沙箱(沙箱是一种按照安全策略限制程序行为的执行环境。)问题,能够能通过浏览器和操作系统的本地方法直接和浏览器进行通话。2008年Selenium和WebDriver两项目合并,这就是Selenium2。2016 年,Selenium 3 诞生。移除了不再使用的 Selenium 1 中的 Selenium RC,并且官方重写了所有的浏览器驱动。

Selenium的安装

使用Pycharm直接安装:
​​

Selenium快速入门

Selenium八种元素定位方法

方法 示例
name定位 .find_element(By.NAME, 'value')
id定位 .find_element(By.ID, 'value')
class name定位 .find_element(By.CLASS_NAME, 'value')
tag name定位 .find_element(By.TAG_NAME, 'value')
link text定位 .find_element(By.LINK_TEXT, 'value')
partial link text定位 .find_element(By.PARTIAL_LINK_TEXT, 'value')
xpath定位 .find_element(By.XPATH, 'value')
css selector定位 .find_element(By.CSS_SELECTOR, 'value')
  • 上面这八种方法里最强大的就是XPath了,很方便。

用百度举个例子。
用XPath来定位,可以直接右键代码。

复制它的XPath粘贴到 .find_element(By.XPATH, 'value') value中
.find_element(By.XPATH, '//*[@id="kw"]')
其实可以看到我们也可以用id定位
.find_element(By.ID, 'kw')
但是有时候在一些小网站会出现相同的id,就会定位不准确。

Selenium库常用的方法

方法 描述
back() 控制浏览器回退
clear() 清空文本
click() 单击元素
forward() 控制浏览器前进
get_attribute(name) 获取元素属性
is_displayed() 设置元素用户是否可见
refresh() 刷新当前页面
send_keys(‘value’) 模拟输入
set_window_size() 设置浏览器窗口大小
size() 设置元素尺寸
submit() 提交表单
text 获取元素文本

Selenium实战练习

这里通过一个淘宝“抢购”脚本来练习学习一下Selenium的基础操作。

准备工作

我们先进入淘宝将整个流程操作一遍。大致可以得出以下流程

  1. 进入淘宝登陆页面
  2. 登陆成功进入购物车(可以点击页面购物车按钮/访问购物车链接)
  3. 等待抢购时间到达
  4. 选择购物车中的商品(此处简化购物车中只有待“抢购”商品,直接点击全选按钮)
  5. 点击“结算”按钮
  6. 点击“提交订单”(提交订单即为锁单成功,可以手动支付)

代码实现

设置用户代理
在开始之前我们要先设置一个请求头User-Agent(用户代理),它可以让服务器识别你使用的操作系统版本、CPU类型、浏览器信息等等。如果不去设置这个信息,直接使用爬虫打开就会出现访问错误、无权限等错误信息。

复制

options = webdriver.ChromeOptions()
user_ag = "Mozilla/5.0 *********************************** "
options.add_argument(f'user-agent={user_ag}')
driver = webdriver.Chrome(options=options)

打开淘宝
这里用到的是.get()

driver.get("https://login.taobao.com/member/login.jhtml?spm=a21bo.21814703.754894437.1.5af911d9tBuTtn&f=top&redirectURL""=https%3A%2F%2Fwww.taobao.com%2F")# 窗口最大化
driver.maximize_window()

登录淘宝

账号密码登录

driver.find_element(By.XPATH, '//*[@id="fm-login-id"]').send_keys('user_id')
driver.find_element(By.XPATH, '//*[@id="fm-login-password"]').send_keys('password')
driver.find_element(By.XPATH, '//*[@id="login-form"]/div[4]/button').click()

这个方法登录一般情况会出现验证码,而且会一直验证失败

这里就需要注入js反反爬了,较为复杂且不是本文章的主要目的。

所以我们选择二维码登录
首先找到二维码登录的按钮,获取它的XPath。

driver.find_element(By.XPATH, '//*[@id="login"]/div[1]/i').click()

进入购物车
扫码登陆成功进入购物车

driver.get('https://cart.taobao.com/')

选择商品
这里为了方便直接点击全选,找到全选的XPath路径。

driver.find_element(By.XPATH, '//*[@id="J_SelectAll2"]').click()

结算

driver.find_element(By.XPATH, '//*[@id="J_Go"]/span').click()

提交订单

driver.find_element(By.XPATH, '//*[@id="submitOrderPC_1"]/div[1]/a[2]').click()

大家可以试一下用其他定位方法尝试一下,还是很简单的。

完整代码

from datetime import datetimefrom selenium import webdriver
import time
import jsonfrom selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 方法一,密码登录
def login1():driver.find_element(By.XPATH, '//*[@id="fm-login-id"]').send_keys('15097922996')driver.find_element(By.XPATH, '//*[@id="fm-login-password"]').send_keys('sr1317ba1')driver.find_element(By.XPATH, '//*[@id="login-form"]/div[4]/button').click()try:# 找到滑块slider = driver.find_element(By.XPATH, '//*[@id="nc_1_n1z"]')# 判断滑块是否可见if slider.is_displayed():# 点击并且不松开鼠标ActionChains(driver).click_and_hold(on_element=slider).perform()# 往右边移动258个位置ActionChains(driver).move_by_offset(xoffset=258, yoffset=0).perform()# 松开鼠标ActionChains(driver).pause(0.5).release().perform()except:time.sleep(7)# 方法二,二维码登录(最稳定)
def login2():driver.find_element(By.XPATH, '//*[@id="login"]/div[1]/i').click()# 扫码登陆print('扫码')# 设置等待时间time.sleep(10)print('即将开始')# driver.find_element(By.XPATH, '//*[@id="login-form"]/div[4]').click()time.sleep(3)if __name__ == '__main__':# 抢购时间设置# 获取电脑现在的时间,                      year month daynow = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')times = f'{now[:8]}{input("日:")} {input("时:")}:{input("分:")}:{input("秒:")}.000000'options = webdriver.ChromeOptions()user_ag = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 " \"Safari/537.36 "options.add_argument('user-agent=%s' % user_ag)driver = webdriver.Chrome(executable_path="chromedriver", options=options)# 注入js代码反反爬driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})# 打开淘宝登录页面# 窗口最大化driver.maximize_window()# 登录login1()time.sleep(1)# 登录后跳转购物车driver.get('https://cart.taobao.com/')not_already = Truewhile not_already:try:print('等待抢购时间到达')# 脚本注入当前页面sreach_window = driver.window_handlesdriver.switch_to.window(sreach_window[-1])# 获取电脑现在的时间,                      year month daynow = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')# 对比时间,时间到的话就点击结算print(now)print('抢购时间:\n', times)# 判断是不是到了秒杀时间?if now > times:# 刷新界面全选购物车while True:try:# driver.refresh()if driver.find_element(By.XPATH, '//*[@id="J_SelectAll2"]'):driver.find_element(By.XPATH, '//*[@id="J_SelectAll2"]').click()# driver.find_element(By.XPATH, '//*[@id="J_SelectAll2"]').click()print("全选商品")time.sleep(2)breakexcept Exception as e:print(e)print('全选失败')# driver.close()time.sleep(0.01)while True:try:# print("点击结算按钮")breakexcept Exception as e:print(e)print("结算失败")# driver.close()passtime.sleep(0.01)while True:try:sreach_window = driver.window_handlestime.sleep(1)driver.switch_to.window(sreach_window[-1])if driver.find_element(By.XPATH, '//*[@id="submitOrderPC_1"]/div[1]/a[2]'):print("提交订单")driver.find_element(By.XPATH, '//*[@id="submitOrderPC_1"]/div[1]/a[2]').click()print('over')not_already = Falsetime.sleep(3)breakexcept Exception as e:print(e)print("提交订单失败")# driver.close()passtime.sleep(0.01)except:passtime.sleep(0.01)driver.close()

Selenium认识与实战(学习版)相关推荐

  1. HarmonyOS分布式软总线研究,【钟洪发老师公开课】实战学习HarmonyOS重点之分布式软总线...

    3月26号(周五)晚8点,我将给大家做一场直播<实战学习HarmonyOS重点之分布式软总线>. 从去年9月10号鸿蒙开源到现在,仅仅过去了短短半年的时间.学习鸿蒙的体验,是不断滴在刷新着 ...

  2. 如何查看文件是否为csv格式_Spark实战第二版(涵盖Spark3.0)第七章 从文件接入数据...

    关注公众号:登峰大数据,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架!如果您觉得作者翻译的内容有帮助,请分享给更多人.您的分享,是作者翻译的动力! 本章涵盖了 解析器的常 ...

  3. dataframe两个表合并_Spark实战第二版(涵盖Spark3.0)第三章 宏伟的角色dataframe

    关注公众号: 登峰大数据 ,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架! 如果您觉得作者翻译的内容有帮助,请分享给更多人.您的分享,是作者翻译的动力! 本章涵盖了 使用 ...

  4. R语言必看推荐:R语言入门经典版(中文版)+R语言实战第二版(中文完整版)

    R语言入门经典(中文版)R for beginners R语言经典教材 第二版 适合初学者 作者:Emmanuel Paradis R 语言实战第二版(中文完整版) R语言实战(第2版)注重实用性,是 ...

  5. 第三课 大数据技术之Fink1.13的实战学习-时间和窗口

    第三课 大数据技术之Fink1.13的实战学习-时间和窗口 文章目录 第三课 大数据技术之Fink1.13的实战学习-时间和窗口 第一节 时间定义 1.1 Flink中的时间语义 1.2 两种时间语义 ...

  6. MongoDB 入门教程实战学习笔记-31-mongo 聚合查询管道 Aggregation Pipieline

    aggregation 聚合操作处理数据记录并返回计算结果. 聚合操作将多个文档中的值组合在一起, 并且可以对分组数据执行各种操作以返回单个结果. mongodb 提供了三种执行聚合的方法: 聚合管道 ...

  7. 系统入门到实战学习某项技术、有问题找“百度“、学习优秀的技术博客、找开源代码等资料

    一.系统入门到实战学习某项技术 先看视频入门到实战(B站.慕课网) 然后看书,再把知识的体系串起来 二.有问题找"百度" 1.学习各种疑惑,问搜索引擎[最大的学习资料库] ■ 搜索 ...

  8. 视频教程-微信公众平台开发实战PHP版-微信开发

    微信公众平台开发实战PHP版 互联商通创始人/架构师, 在IT领域摸爬滚打20年的全栈老程序员(架构师.培训讲师).熟悉iOS.Android及LNMP的架构下快速开发互联网相关项目.精通微信和支付宝 ...

  9. Python数据分析实战学习

    Python数据分析实战学习\displaystyle\boxed{Python数据分析实战学习}Python数据分析实战学习​ AprilJulyOctober2015AprilJulyOctobe ...

  10. 第六课 大数据技术之Fink1.13的实战学习-Table Api和SQL

    第六课 大数据技术之Fink1.13的实战学习-Table Api和SQL 文章目录 第六课 大数据技术之Fink1.13的实战学习-Table Api和SQL 第一节 Fink SQL快速上手 1. ...

最新文章

  1. 逼学生作弊的AI阅卷老师
  2. CYQ.Data 轻量数据层之路 使用篇三曲 MAction 取值赋值(十四)
  3. 高级软件工程第五次作业:东理三剑客团队作业-2
  4. Quartz-DateBuilder解读
  5. Java static作用
  6. iphone全部机型_苹果12,十三岁iPhone最鸡贼的一次发布会
  7. Cygwin Application initialization failed: no display name and no $DISPLAY environment
  8. sobel边缘检测java_Sobel边缘检测
  9. 推荐一款2.5v 基准 电压源 芯片
  10. linux上进行base64编码解码
  11. Luogu P3717 [AHOI2017初中组]cover
  12. 人体反应测试仪 c语言,有趣的人体反应速度测试电路
  13. 久邦GOMO总裁朱志在2018校招生交流会分享
  14. Arun Gupta通过将HTML5与Java EE 7拥抱来提高生产力
  15. NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突
  16. IT咨询和IT外包有什么区别?
  17. unity3D游戏开发十一之物理引擎
  18. 及时总结工作中的经验是个人成长的关键
  19. 赵承熙获美国人宽恕,马加爵呢
  20. muduo网络库源码复现笔记(十七):什么都不做的EventLoop

热门文章

  1. 外贸软件进口业务流程管理方案
  2. linux离线安装系统工具arping
  3. jsp中java代码注释_JSP页面中的三种代码注释方法
  4. 使用pdfobject.js实现在线浏览PDF
  5. Inkscape将位图转换为矢量图
  6. 远程连接virtualBox本地虚拟机并访问虚拟机服务
  7. 论文阅读:基于Himawari-8 数据的日间海雾检测方法
  8. 新版谷歌flash的问题
  9. CAD如何一键解决批量打印
  10. Linux使用lrzsz快速上传和下载