提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
1,怎么定位多个元素
2,设置元素等待
提示:以下是本篇文章正文内容,下面案例可供参考
一、find_elements(获取多个元素,返回list)
示例:想要一次定位到所有菜单栏
- 先找到菜单栏父级ul标签
- 复制selector,得到 “#menu_global”
- 继续找到 ul下的li下a标签,表达式:“#menu_global > li > a:nth-child(1)”
menu_global 下有多少复合 li > a:nth-child(1)表达式的元素,就能定位到多少个
# 定位多个元素
eles = driver.find_elements(By.CSS_SELECTOR, "#menu_global > li > a:nth-child(1)")
time.sleep(1)
#print(eles[1].text)
# find_elements返回的是list,(这里只演示定位多个元素后,提取文本信息)
for i in eles:
print(i.text)
# 关闭浏览器
driver.quit()
运行结果
二、设置元素等待
分析: 主要解决代码执行方面,元素加载导致找不到的问题
-
time.sleep() 固定等待时间,比较机械
-
driver.implicitly_wait(10) 设置10s
解释:隐式等待1. 只需声明一次,对其后面的每一行元素定位都生效 2. 一般创建浏览器对象后就声明 3. 代码执行后每隔0.5s查找一次,找到后就继续执行后续代码 4. 若达到设置的最大时间后,未找到元素,抛出 timeout 异常 5. 必须要等页面全部加载完成,浪费时间(相对而言)
-
WebDriverWait(driver, 10, 1)
解释:显式等待1. 传入浏览器对象,最大等待时间,轮询时间 2. from selenium.webdriver.support import expected_conditions as ec # 提供等待条件 3. from selenium.webdriver.support.ui import WebDriverWait # 显示等待类 4. 只对设置的元素生效 5. until里设置条件 6. 若达到设置的最大时间后,未找到元素,抛出 timeout 异常
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec # 提供等待条件
from selenium.webdriver.support.ui import WebDriverWait # 显示等待类
driver = webdriver.Chrome()
# 返回的就是你要定位的元素
ele = WebDriverWait(driver, 10, 1).until(
ec.visibility_of_element_located(
(By.ID, "header_global")
)
)
备注:一般使用习惯
- 声明一个隐式等待,全局通用
- 对于一些加载慢的元素,设置显示等待