基地树洞 | 自动化小系列之浏览器篇
自动化小系列
之浏览器篇
大家期待已久的自动化小系列之浏览器篇来啦!
在开始今天的文章前,我想问问大家,在日常工作生活中,不知你有没有碰到以下一些问题呢:
-
周五下班回家了,结果忘记登入工作日志,家里又没有电脑,怎么办呀?
-
今天某某商城搞了一个秒杀,我手速太慢了,怎么才能打败别人抢到商品啊?
-
今天又是一年一度的选修抢课,之前练习了好多次,都没有抢到想要的课程。
如果不巧你也有这样的烦恼,那定不要错过本期内容!
P.S: 有些东西比较敏感,我不能展开描述,大家要抱着学习的态度,切勿用于违法犯罪用途哟!
快速入门
我们这次做浏览器自动化所使用的主要工具依旧是selenium,下面还是先介绍一下它吧。
什么是selenium
Selenium 是一个用于 Web 应用程序测试的工具。Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。
Selenium 支持的浏览器包括:
-
IE(7, 8, 9, 10, 11)、
-
Mozilla Firefox、
-
Safari、
-
Google Chrome、
-
Opera,
-
Edge等
这个工具的主要功能包括:
-
测试与浏览器的兼容性——测试应用程序,看是否能够很好得工作在不同浏览器和操作系统之上。
-
测试系统功能——创建回归测试检验软件功能和用户需求。
-
支持自动录制动作和自动生成 .Net、Java、Perl 等不同语言的测试脚本。
Selenium 还有以下优点:
-
框架底层使用 JavaScript 模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
-
使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
-
使用简单,可使用 Java,Python 等多种语言编写用例脚本。
But!如果你仅仅把它当成测试工具来玩的话,那你格局就小啦~
不只是测试工具的 Selenium
除了测试,我们可以利用 Selenium 可以执行 JavaScript 代码的特性,来玩更高级爬虫和一些流程操作。
下面我们举一个小小的实例来说明:
Step 1:搭配浏览器驱动
selenium 需要搭配浏览器的驱动,这个到各个浏览器官网去下就行了,然后丢到 python 的安装目录即可。
本项目我用的是微软的 Edge 浏览器,其他浏览器流程差不多,有兴趣的话可以自行百度,但是一定要注意驱动版本要对应浏览器版本。
Step 2:代码测试
导一下包就可以写代码测试啦~
测试代码
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
driver = webdriver.Edge()
driver.get(r'https://www.baidu.com')
# 通过id找到搜索框
inputElement = driver.find_element(By.ID, "kw")
# 向搜索框写入 digital china
inputElement.send_keys("digital china")
# 通过id找到搜索按钮 buttonElement = driver.find_element(By.ID, "su")
# 点击搜索按钮
buttonElement.click()
sleep(5)
driver.close()
/ 测试代码
上述代码的运行效果就是代码启动后,浏览器自动打开百度首页,自动输入 digital china,然后点击搜索,5秒钟后,浏览器自动关闭。
这个操作是很快的,类似于极限的人工模拟操作浏览器,大家可以自己试一下。
代码分析
其实具体我也不需要太细讲,做开发的话自然是一眼懂,基本上套这个模板就 OK 了。
但我还是要着重说几个地方,直接贴图吧~
/ 8 种元素查询方案
/ 多种操作元素的方法
显而易见,我们只需要关注两点:
-
第一个就是 如何找到页面上的元素
-
第二个就是 这个元素可以执行什么方法
由图一可知,我们一共有 8 种元素查询方案。
由图二可知,我们有很多种操作元素的方法,不乏有点击,提交,填充等方法,甚至还可屏幕截图,你就说顶不顶。
好了,你现在已经可以说自己会 selenium 了,剩下的有需要了再自己去百度,套上我的模板,你已经可以做一些自动化的事情了。
实战案例
假设前提
-
某公司的管理系统是内网环境,无法连接任何外部互联网,用户在浏览器端5分钟不操作就会自动退出登录。
-
领导给了你一份秘密文件,让你晚上8点的时候准时发送邮件给总经理,但是你的下班时间是6点,你不想加班。
-
邮件系统已经配置好了,你只用复制粘贴内容点击发送即可。
现在,你是坐办公室等到 8 点,然后发邮件,
还是写一个脚本,然后回家溜溜球?
那当然选后者啦!
解决思路
Step 1:分析系统构成
Step 2:远程发送短信步骤
-
打开浏览器,进入系统首页
-
找到邮件管理菜单并单击进入
-
输入邮件标题、收件用户(这里即总经理的邮箱)、邮件正文
-
点击发送按钮
Step 3:编写代码脚本
startup.bat文件
import time
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
def send_email():
driver = webdriver.Edge()
driver.get(r'http://127.0.0.1')
# 找到账号输入框,并填入账号
userName = driver.find_element(By.XPATH, "//input[@placeholder='请输入手机 号']")
userName.send_keys("13333333333")
# 找到密码输入框,并填入密码
password = driver.find_element(By.XPATH, "//input[@placeholder='请输入密 码']")
password.send_keys("password")
# 点击登录按钮
loginButton = driver.find_element(By.XPATH, '//*
[@id="app"]/div/div/div[2]/div[2]/form/div[3]/div/button/span')
loginButton.click()
# 停 1s 是为了等待 js 加载响应结果至 html,如果网络较慢,请适当增加等待时间
sleep(1)
# 找到邮件管理菜单并进入
menuButton1 = driver.find_element(By.XPATH, '//span[text()="系统配置"]')
menuButton1.click()
menuButton2 = driver.find_element(By.XPATH, '//span[text()="邮件管理"]')
menuButton2.click()
sleep(1)
# 进入发送邮件页面
emailPage = driver.find_element(By.XPATH, '//*[@id="tab-second"]')
emailPage.click()
sleep(1)
input1 = driver.find_element(By.XPATH, "//input[@placeholder='请输入邮件标 题']")
input1.send_keys("神州数码秘密文件")
input2 = driver.find_element(By.XPATH, "//input[@placeholder='请输入收件人 邮箱']")
input2.send_keys("504305797@qq.com")
input3 = driver.find_element(By.ID, "w-e-textarea-1")
input3.send_keys("这是一封神州数码的秘密文件,武汉云基地真的很顶!千万不要告诉别人 呀!")
# 点击发送按钮
send = driver.find_element(By.XPATH, '//span[text()="发送邮件"]')
send.click()
sleep(5)
driver.close()
while True:
current = time.localtime()
hour = current.tm_hour
minute = current.tm_min
second = current.tm_sec
if hour == 20 and minute == 0 and second >= 0:
send_email()
break
代码详解
#1
在脚本中,可以看到我使用了多种查找方式,找到对应的 html 元素。
其中大部分都是直接分析后使用 xpath 来定位。其实还有一个非常方便的方法可以获取元素的 html 元素。选中元素,点击右键,即可复制 xpath。
虽然说这玩意复制来的比较丑,但是,不用你自己动脑子了,还要啥自行车?
#2
多次调用 sleep 是为了等待 js 加载响应结果至 html。但是如果网络较慢,还是要请适当增加等待时间。
#3
其他也没啥好说的了,结果肯定就是成功发送邮件咯~
说在最后
最后,你也体会到 selenium 的妙用了吧,它能够帮我们自动完成很多关于浏览器的操作,大大扩展了我们解决问题的方案池!
现在,你或许可以尝试自己去实现一下怎么实现秒杀、自动填日报、自动抢课了~
最最后,提示大家一点,千万不要过分的去试某宝、某东秒杀。不然你号就无了,这都是过来人的经验,大家珍重哇!这些敏感的东西,我也不好写demo,所以,还是抱着学习的态度去玩吧~
最最最后,上面演示的后台系统为 sherly-springboot 和 sherly-vue3 ,是我们空闲时间做的一个开源系统,在 gitee,如果有兴趣,可以支持一下点个 star 哦~ 爱你们~
Why code?This may an answer ~
解决生活中真实遇到的问题,而不是为了编码而编码,这或许才是我们应该反思的!