扫码阅读
手机扫码阅读

基地树洞 | 自动化小系列之浏览器篇

85 2024-03-14

自动化小系列

之浏览器篇

大家期待已久的自动化小系列之浏览器篇来啦!

在开始今天的文章前,我想问问大家,在日常工作生活中,不知你有没有碰到以下一些问题呢:

  • 周五下班回家了,结果忘记登入工作日志,家里又没有电脑,怎么办呀?

  • 今天某某商城搞了一个秒杀,我手速太慢了,怎么才能打败别人抢到商品啊?

  • 今天又是一年一度的选修抢课,之前练习了好多次,都没有抢到想要的课程。

如果不巧你也有这样的烦恼,那定不要错过本期内容!

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 ~

解决生活中真实遇到的问题,而不是为了编码而编码,这或许才是我们应该反思的!

原文链接: http://mp.weixin.qq.com/s?__biz=Mzg5MzUyOTgwMQ==&mid=2247507378&idx=1&sn=568b3115840b0ebf32e3b2da8dd4a882&chksm=c02fe614f7586f027dfe27256788ff586bca438e930720776b696cd4a70060973e9f27186df6#rd