Selenium是业界广泛使用的用于浏览器自动化的开源工具集。它支持JAVA,Ruby,C#, Python,JavaScript等编程语言。
2004年,由ThoughtWorks的Jason Hugginsy及其团队开发而来。发展至今,经历了Selenium1, Selenium2, Selenium3和Selenium4四个大版本。本文主要关注Selenium4。
Selenium主要由以下三部分组成:
Selenium WebDriver
支持多种开发语言的开源API,可用来模拟真实用户和浏览器进行交互,从而可将用户在浏览器上的访问和交互行为进行自动化。被广泛用于浏览器的自动化测试中。
Selenium IDE
Chrome和Firefox浏览器上的扩展程序,支持录制和重播用户在浏览器上的交互操作。
Selenium Grid
Selenium支持分布式运行的组件。通过Client-Server的模式,允许测试用例在不同的操作系统平台和不同的浏览器中并行运行。
本文旨在探讨Selenium4中,selenium Client是如何与Browser Driver交互的,先来看看Selenium4的架构图:
Selenium3和Selenium4的最大不同,就是Selenium4放弃了JSON Wire Protocol,转而直接通过W3c web Protocol与各浏览器的Driver进行交互。可能有些同学会问,为什么不早点这么干呢?因为在早期,其实浏览器的Driver都是由Selenium来提供的,浏览器的访问接口也并不统一,所以需要使用JSON Wire Protocol来负责在Selenium Client和各Browser Driver之间传递数据。而在Selenium4阶段,浏览器的访问接口都遵守W3c web Protocol,并且各浏览器自己维护各自的Driver。一句话,浏览器自己的驱动更加标准化了,从而提高了selenium代码的效率和稳定性。
说了这么多,是时候表演真正的技术了。
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
chrome_driver_path = ChromeDriverManager().install()
service = Service(executable_path=chrome_driver_path)
option = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=option)
driver.get("https://www.baidu.com/")
input_box = driver.find_element(By.ID, "kw")
input_box.send_keys("Hello")
input_box.send_keys(Keys.ENTER)
driver.quit()
不好意思,其实这也没什么技术可言,我就是想用这句话衔接一下。
以前用过selenium的人,可能都知道需要下载与浏览器版本对应的driver,要不然你的selenium代码就会罢工。最要命的是,如果你不去特意设置,我们的浏览器都是会自动更新版本的,这就让driver不匹配的问题防不胜防。而到了selenium4时代,引入了ChromeDriverManager,从而可以根据我们的浏览器当前版本,在代码运行时下载对应的Chrome Driver。其它浏览器也支持这样的功能。当然,ChromeDriverManager并不是我们今天要聊的重点。
我们今天的重点是,手动模拟Selenium Client和Chrome Driver之间的交互。
第一步: 启动Chrome Driver服务
命令行执行命令: chromedriver -port=57789