文章目录
- Selenium自动化 Web 浏览器操作
- Selenium简介
- 安装Selenium
- 安装WebDriver
- 使用问题
- 驱动加载报错
- 版本不匹配
- 常用API
- 创建实例
- 定位元素
- 鼠标事件
- 表单相关
- 多窗口切换
- 等待
- 显示等待
- 隐式等待
- 文件上传下载
- 经验总结
Selenium自动化 Web 浏览器操作
Selenium简介
Selenium可以模拟浏览器运行,用于web应用程序测试工具。可以直接运行浏览器,像用户自己操作一样。
安装Selenium
pip install selenium
安装WebDriver
WebDriver安装版本要和所安装的浏览器版本一致,这里使用谷歌浏览器
先查看谷歌浏览器版本
chrome://version/
选择版本一致的驱动
https://chromedriver.storage.googleapis.com/index.html(114版本之前)
https://googlechromelabs.github.io/chrome-for-testing/#canary(128版本之后)
若找不到一致的就选择相近的版本
使用问题
驱动加载报错
AttributeError: ‘str’ object has no attribute ‘capabilities’
原因是selenium 版本太高,初始化驱动方式有问题
# 不能使用这种方式
driver = webdriver.Chrome("./chromedriver")
# 应该使用这种方式
driver = webdriver.Chrome()
得出结论,使用一个库时,不能仅网上搜出代码就直接使用,要找到库官方网站对应的版本使用文档,按照文档来使用,就会少出很多问题。
版本不匹配
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114,Current browser version is 128.0.6613.119
下载相应版本,并放到程序同一个目录即可。
常用API
常用API仅做参考,当使用一个库时,要去官方文档看自己使用版本对应的文档,因为随着版本更新,函数API都是会变化的,只要掌握基本思路即可。该Selenium版本是4.24
创建实例
# 加detach 配置 ,让程序执行完,浏览器不关闭,除非程序中指定的关闭
options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)
# 初始化 WebDriver(记得替换路径)
driver = webdriver.Chrome(options=options)
该版本的初始化驱动,会默认从安装驱动的链接去下载,若遇到网络不好,则会一直卡住,需要等待好长时间。下面可以配置自己下载的驱动
driver = webdriver.Chrome(service=Service(executable_path=r'.\chromedriver.exe'),options=options)
定位元素
# 打开浏览器(指定具体页面ip路径)
driver.get("https://www.baidu.com")
# 查找第一个匹配的元素
login_element = driver.find_element(By.CLASS_NAME, 'login')
# 查找匹配到的所有元素
login_element = driver.find_elements(By.CLASS_NAME, 'login')
driver.find_element(By, value),其中By 参数可以是如下:
其中,XPATH是网页元素从根节点到该节点的路径定位,可以唯一定位一个元素(网页元素各个节点构成一个树形结构)
ID 就是元素定义的ID,前端开发时写的
Class_name 元素定义的class
TAG_name 元素名称
其他的就不写了,使用时自己尝试
由于现在web应用基本都是基于vue或react单页面应用了,前端开发时不会定义那么详细ID和class,那么这种场景下,直接使用XPATH是最高效的方法。
鼠标事件
# 模拟鼠标点击
login_element.click()
表单相关
# 模拟输入框输入(send_keys())
driver.find_element(By.XPATH,
"//*[@id='app']/div/div[1]/div[2]/div[2]/div/div[2]/form/div[1]/div/div/input").send_keys(
account)
多窗口切换
在web应用中,点击页面时,往往会打开多个浏览器标签页,也就是多个窗口。
Selenium会为每个窗口创建一个句柄,并存储下来,用来切换窗口。当窗口关闭时,句柄值就会清除。
# 获取当前窗口句柄
driver.getWindowHandle()
# 获取所有打开的窗口句柄
driver.getWindowHandles()
# 切换到新的窗口
curWindow = driver.getWindowHandle()
allWindow = driver.getWindowHandles()
for w in allWindow:
if w!=curWindow:
driver.switchTo().window(w)
对于单页面应用,切换页面不算切换窗口,因为始终是在一个标签页里切换。
等待
由于web网页用了很多新技术,页面加载也有快有慢,若某个元素还未加载出来,便定位获取,就会抛出异常。等待机制就是等元素加载完后再获取元素定位。分为显示等待和隐式等待,意思就是程序暂停多长时间再继续执行。
显示等待
# 等待10s后,判断until后的条件是否满足,是则返回该元素,否则抛出异常
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,'')))
until后的条件有很多,可以自己去探索
隐式等待
# 直接指定等待时间 单位是S
driver.implicitly_wait(10)
这个用于指定所有元素被定位到的等待时间,意思就是 所有元素定位前都要等待这个时间之后再去定位元素
也可以使用time.sleep(3),但效率会比较低。
若要等待新页面加载完后,再执行,可以使用如下:
WebDriverWait(driver,3).until(EC.url_changes(driver.current_url))
文件上传下载
下载比较简单,就是定位到页面的下载链接,直接点击即可
上传
driver.find_element(By.XPATH, '//*[@id="pane-1"]/div[1]/div/input').send_keys(r'C:\Users\xxx\Desktop\1.jpg')
上传思路就是找到对应的文件表单,把要上传的图片直接写进去。该方法没有打开文件资源管理器选择文件步骤
经验总结
1 显示等待和隐式等待不能一起使用,会报超时错误;
2 显示等待有时不太好用,直接使用time.sleep()会稳定很多,但效率会低,看怎么取舍;