最近要一直在网站上填报东西,不胜其烦,突然想到就没有什么东西能自动控制浏览器吗,于是就去一顿的搜索和ai询问,得到一个解决方案就是 selenium 的网站自动化测试工具可以实现。
一、初入江湖篇
- 首先,先去官网看了看介绍 selenium 官网地址:https://www.selenium.dev/ 里面有 webDriver 、IDE 、Gird, 看完介绍,在浏览器安装一个 IDE 来试试先。 先体验一下自动化的感觉。
微信截图_20240704092811.png -
然后你就会得到一个浏览器的插件 ,安装好插件以后,运行就会出来一个单独的浏览器框。
微信截图_20240704093032.png
微信截图_20240704093221.png
微信截图_20240704093257.png
3.最后按照教程去看看这玩意儿怎么用,大概就是创建一个任务,输入一个要访问的网站的链接,然后你就可以开始录制你的操作了,可以暂停,开始、最后录制完成点停止。然后就可以点击播放 将你刚刚录制的操作都重新来一遍以后就会暂停了。 最后,这个东西还可以导出代码。
二、小试牛刀
- 我在selenium IDE 导 代码的基础上进行了些调整,废话不多说 ,先贴完成的代码:
# Generated by Selenium IDE
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# options = Options()
# 指定Chrome的debug地址 和前面命令行中启动参数一致
# 这样,就会直接自动化刚才启动的浏览器
# options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
# driver = webdriver.Chrome(options=options)
driver = webdriver.Chrome()
driver.implicitly_wait(200)
driver.get("http://你自己的网站地址")
# 2 | setWindowSize | 1936x1056 |
driver.set_window_size(1936, 1056)
namelist = [
'J2023-003号地块', 'KC2011-41号地块'
]
noR = []
driver.find_element(By.CSS_SELECTOR, '[placeholder="请输入专场标题"]').send_keys("2024昆明土地推介专场")
driver.find_element(By.CSS_SELECTOR, ".el-tag > .el-select__tags-text")
index = 0
print(len(namelist))
def test(i):
if i > len(namelist)-1:
over()
return
print(f'现在执行到{i}')
print(namelist[i])
v = namelist[i]
# 清空输入框
driver.find_element(By.CSS_SELECTOR, ".el-transfer-panel:nth-child(1) .el-input__inner").clear()
time.sleep(1)
# 将地块名称写入输入框
driver.find_element(By.CSS_SELECTOR, ".el-transfer-panel:nth-child(1) .el-input__inner").send_keys(v)
time.sleep(2)
querResult = driver.find_element(By.CSS_SELECTOR,
".el-transfer > .el-transfer-panel:first-child > .el-transfer-panel__body > .is-filterable").is_displayed() # 判断元素是否是可见的
print(querResult)
# # 判断是否有查询结果,如果没有查询结果就存到一个数组中打印出来
if querResult:
# 选中查询结果 .is-filterable > .el-checkbox:first-child
driver.find_element(By.CSS_SELECTOR,
".el-transfer > .el-transfer-panel:first-child > .el-transfer-panel__body > .is-filterable > .el-checkbox:first-child").click()
time.sleep(1)
# 点击移动按钮将数据移动到右边的框中 .el-transfer__buttons > .el-button:nth-child(2)
driver.find_element(By.CSS_SELECTOR, ".el-transfer__buttons > .el-button:nth-child(2)").click()
time.sleep(1)
else:
noR.append(v)
print(f"没查到数据的地块:{noR}")
test(i + 1)
def over():
print('结束')
print(f'没有找到地块的数据:{noR}')
# .form-btn > .btn-preserve
driver.find_element(By.CSS_SELECTOR, ".form-btn > .btn-preserve").click()
time.sleep(2)
# driver.find_element(By.CSS_SELECTOR, ".el-transfer-panel:nth-child(1) .el-input__inner").click()
driver.close()
test(index)
现在解释一下以上代码,主要是使用地块的名字主动去平台查询数据,容纳后查询出来的数据要自动填充到对应的框框内,使用的是递归的方式完成。 这里面要重点提几点:
1.首先你得去安装 selenium WebDriver , 可以使用命令 : pip install selenium。然后导入使用
- 不得不说一下这个方法 driver.implicitly_wait(200),简单的说,这是一个等待,传入的是等待的时间是以秒为单位,等待的是什么呢? 等待的就是如果你的 driver.find_element() 方法里面的元素没有出现在页面,没找到的时候,他就开始等待,当出现了代码才会继续执行,但不是无休止的等待下去,只会等待你设置的时间,时间一到还是没有出现你所要找的元素,就会报错。
- 可以看到我代码里面基本都用了 time.sleep() 方法,是因为有时候网络不好,请求数据出不来的时候,就会出现找不要的数据,所以为了保险起见,我都加了一个 sleep 。
具体的Selenium 的入门教程,推介去看B站这个老师的课程:https://www.bilibili.com/video/BV1RZ4y147zD?p=1&vd_source=5bf7f57e54503e3b35b5bf5d5138b720



