用selenium完成自动化任务
Selenium 是一个控制浏览器的自动化软件,常常用来做自动化UI测试(浏览器端),既然可以代码控制, 那么就是自动化的一个好工具了。这一篇我们就来看看如何使用 Selenium 来搜索一下,由于 Selenium 打开一个全新的浏览器会话,我没有配置全局梯子,我们就以百度搜索为例。
安装
Selenium 一共支持5种语言: C#
, JavaScript
, Java
, Python
, Ruby
。我以Python为例:
$ pip install selenium
...
$
这里我们就安装了语言所需要的部分,但是为了控制浏览器,我们还需要安装浏览器的相关驱动,Selenium 支持 Chrome, Firefox, Edge, Safari 四大浏览器,但是都要下载对应的 Driver 才行:
其余浏览器见 官网
驱动下载解压后,将可执行文件放到 PATH
里,我是直接放到 /usr/local/bin/chromedriver
这里。
简单示例
我们来看看如何进行搜索:
import logging
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
logging.basicConfig(level=logging.INFO)
DEBUG = True
def search_with_baidu(driver):
driver.get("https://www.baidu.com") # 打开页面
input_text = driver.find_element_by_xpath('//*[@id="kw"]') # 找到输入框
click_to_search = driver.find_element_by_xpath('//*[@id="su"]') # 找到搜索按钮
input_text.send_keys("selenium tutorial") # 输入内容
click_to_search.click() # 点击搜索
def search_baidu():
if DEBUG:
driver = webdriver.Chrome()
else:
chrome_options = Options()
chrome_options.add_argument("--headless")
# https://stackoverflow.com/questions/50642308/webdriverexception-unknown-error-devtoolsactiveport-file-doesnt-exist-while-t
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=chrome_options)
try:
search_with_baidu(driver)
time.sleep(10)
except Exception:
logging.exception("failed to search, sleep and retry...")
finally:
driver.close()
driver.quit()
if __name__ == "__main__":
search_baidu()
可以看到,大体的流程是:
- 首先
driver = webdriver.Chrome()
获得一个driver - 之后就可以通过
driver
来进行各种浏览器操作,比如find_element_by_xpath
来找到对应的元素 - 获得的元素也可以进行各种操作,比如
send_keys
,click
- 最后通过
driver.close()
关闭页面,driver.quit()
退出会话
如果在本地执行,我们直接使用 driver = webdriver.Chrome()
,如果想要在服务端运行,
那么就要使用 headless 模式来运行 Chrome,就是在启动的时候加上对应的参数即可。
区别在于,前者会弹出一个浏览器来,而后者是不需要图形界面就可以运行的,前者方便调试,后者方便在服务器上运行。
如果是使用 Selenium 来写UI自动化测试,那么还可以结合 Python 中的 unittest, pytest 等框架实现自动化测试。
API
接下来我们看看 Selenium 都有哪些 API 可以供我们操作。
浏览器相关操作
driver.get("https://selenium.dev")
打开页面driver.current_url
获取当前页面driver.back()
返回上一页driver.forward()
前进一页(相当于点击浏览器的前进)driver.refresh()
刷新页面driver.title
获取当前页面标题driver.close()
关闭当前页面driver.switch_to.window(original_window)
切换窗口(Selenium 不区分Window和Tab)driver.quit()
退出浏览器,请记得一定要执行这个,否则就进程泄漏了width = driver.get_window_size().get("width")
和height = driver.get_window_size().get("height")
获取窗口大小driver.set_window_size(1024, 768)
设置窗口大小driver.maximize_window()
和driver.minimize_window()
最大化和最小化窗口driver.fullscreen_window()
全屏,相当于按F11driver.save_screenshot('./image.png')
截屏保存ele = driver.find_element(By.CSS_SELECTOR, 'h1')
+ele.screenshot('./image.png')
找到某个元素并且截屏driver.execute_script('return arguments[0].innerText', header)
执行脚本
元素定位操作
# 查找单个元素
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
# 查找多个元素
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
输入输出操作
element.send_keys()
输入element.clear()
清除输入key_down()
和key_up()
分别是模拟按下某个键和放开某个键的过程,例如按下Shift然后松开:search = driver.find_element(By.NAME, "q") action = webdriver.ActionChains(driver) # Enters text "qwerty" with keyDown SHIFT key and after keyUp SHIFT key (QWERTYqwerty) action.key_down(Keys.SHIFT).send_keys_to_element(search, "qwerty").key_up(Keys.SHIFT).send_keys("qwerty").perform()
这样就会输出 QWERTY 而不是 qwerty。
其余操作
除了上述常见操作之外,Selenium 还支持很多其它操作,例如执行js脚本, 等待元素加载,设置代理等,详情查看 文档。
总结
这篇文章我们看了一下 Selenium 这个工具的大概用法,了解了之后,就可以借助 Selenium 做很多事情了,比如 常规点的,自动化测试,比如不太常规的,签到,打卡等等。。。
好了,以上就是本篇内容。
ref:
- https://www.selenium.dev/documentation/getting_started/installing_browser_drivers/
- https://www.selenium.dev/documentation/webdriver/browser_manipulation/
- https://selenium-python.readthedocs.io/index.html
更多文章
- socks5 协议详解
- zerotier简明教程
- 搞定面试中的系统设计题
- frp 源码阅读与分析(一):流程和概念
- 用peewee代替SQLAlchemy
- Golang(Go语言)中实现典型的fork调用
- DNSCrypt简明教程
- 一个Gunicorn worker数量引发的血案
- Golang validator使用教程
- Docker组件介绍(二):shim, docker-init和docker-proxy
- Docker组件介绍(一):runc和containerd
- 使用Go语言实现一个异步任务框架
- 协程(coroutine)简介 - 什么是协程?
- SQLAlchemy简明教程
- Go Module 简明教程