selenium使用记录(一)

一 前言

环境: window 10
python3.10 selenium 4.21

随便记录一些容易犯错或理解错误或比较有意思的一些点

二 内容

1 关于驱动webdiver的下载使用

以前通常是,根据浏览器的版本下载好合适的浏览器驱动到本地电脑,然后使用的时候配置好驱动路径
如下:

chromedriver_path = r"D:\xxxxxxxxx"  # 这里替换为你下载的webdriver的路径
service = Service(chromedriver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)

前段时间发现这个版本有个方法能自动下载配置合适的驱动,再也不用手动去下载驱动了,
之前隔一段时间去运行代码都报错,原因就是浏览器更新了,要重新下载合适的驱动

首先要安装一个包 webdriver_manager

# 导入要打开浏览器对应的manager
from webdriver_manager.chrome import ChromeDriverManager

service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)

2 关于用出现的异常来处理业务逻辑

有时,我们希望在selenium在找不到元素的状态下,来进行一些业务逻辑的处理

try:
	xxxxx
	element = driver.find_element(xxxxx)
except Exception as e:
	xxxxx找不到元素时要做的事情xxx

如上一段伪代码,想在找不到某个元素的时候写处理逻辑,但Exception捕获的范围太大了,它不仅能捕获元素未找到的异常,还能捕获很多其他的代码异常,如果是其它异常,这就不是我们想要的了,因为与未找到元素异常下的业务逻辑不相匹配,因此最好是精准捕获元素未找到的异常NoSuchElementException

try:
	xxxxx
	element = driver.find_element(xxxxx)
except NoSuchElementException as e:
	xxxxx找不到元素时要做的事情xxx

3 关于页面元素不可点击

判断一个元素是否可点击,有种常用的方法是

#如果没有抛出异常,说明元素可点击
element = wait.until(EC.element_to_be_clickable((By.xx, xxxxx)))

但有时候,这个方法也不管用,如在豆瓣读书上 点击下一页的时候
image

image

不断点击[后页]按钮,来跳转到新的一页,当其不可点击时,

try:
                
                wait2 = WebDriverWait(driver, 1)
                page_wait = wait2.until(EC.element_to_be_clickable((By.XPATH, '//*[@class="next"]')))
                logger.info(f'page: {page_wait}')
		next_button = driver.find_element(By.XPATH, '//*[@class="next"]')
                next_button.click()
except Exception as e:
                logger.info(f"点击下一页出现异常")
                raise 

如上,在最后一页是不会抛出异常的

当然,上面关于[后页]的xpath定位范围有点大,是定位到span标签的,可以定位到span下面的a标签,最后一页的时候没有a标签,这样就会抛出异常了

4 关于父标签的文本

当一个标签内有多个子标签,如果找到父标签所在元素,然后打印该元素的文本。则会输出父标签的文本信息,还会输出其所有子标签的文本信息

以百度首页为例
image

使用selenium的关键代码部分为

list_text = driver.find_element(By.ID, "hotsearch-content-wrapper").text
print(list_text)

输出结果
image

5 find_element()与find_elements()

看下源代码中find_element的定义
image
如上,可以看到,find_element()里面,会先执行find_elements(),拿到find_elements()结果后,拿结果中的第一个数据作为find_element()的结果

所以,find_element()相当于find_elements()[0]

posted @ 2024-06-26 23:29  工作手记  阅读(7)  评论(0编辑  收藏  举报