目录
大家期待已久的自动化小系列之浏览器篇来啦!
在开始今天的文章前,我想问问大家,在日常工作生活中,不知你有没有碰到以下一些问题呢:
周五下班回家了,结果忘记登入工作日志,家里又没有电脑,怎么办呀?
今天某某商城搞了一个秒杀,我手速太慢了,怎么才能打败别人抢到商品啊?
今天又是一年一度的选修抢课,之前练习了好多次,都没有抢到想要的课程。
如果不巧你也有这样的烦恼,那定不要错过本期内容!

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 ~
解决生活中真实遇到的问题,而不是为了编码而编码,这或许才是我们应该反思的!
版权申明:文章由神州数码武汉云基地团队实践整理输出,转载请注明出处。
微信公众号后台回复“技术合集”,可获取更多干货内容!