Selenium Python如何等待Google加载图标消失后继续执行测试或爬虫
可行实现方案
1 现有方案的问题修复
你之前方案2运行失败存在两个低级错误:
- CSS类选择器需要以
.开头,你写的nhGGkb.S3PB2d缺少前缀,正确写法是.nhGGkb.S3PB2d - 代码调用
By.CSS_SELECTOR时,错误传入了Xpath路径变量,没有使用定义好的loading_element_css_selector变量
2 不受页面结构变化影响的稳定定位逻辑
不要使用绝对路径的Xpath,直接用加载图标本身的固定属性定位即可。谷歌页面的jsname属性是前端逻辑绑定专用属性,几乎不会变更,定位器可以写成:
- 稳定Xpath:
//g-loading-icon[@jsname="aZ2wEe"] - 稳定CSS选择器:
g-loading-icon[jsname="aZ2wEe"]
3 修正后的完整代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.common.exceptions import TimeoutException def click_more_gpaa(order): short_timeout = 10 long_timeout = 30 # 用元素固定属性定位,完全不受页面嵌套结构变化影响 loading_locator = (By.XPATH, '//g-loading-icon[@jsname="aZ2wEe"]') # 替换为你实际要爬取的PAA问题/答案条目定位器 paa_item_locator = (By.CSS_SELECTOR, 'div.related-question-pair') try: # 等待加载图标出现(最多等10秒,没出现则默认已经加载完成) WebDriverWait(driver, short_timeout).until(EC.presence_of_element_located(loading_locator)) # 等待加载图标消失 WebDriverWait(driver, long_timeout).until_not(EC.presence_of_element_located(loading_locator)) # 额外保险:等待目标PAA条目全部加载完成,彻底避免索引越界错误 WebDriverWait(driver, long_timeout).until(EC.presence_of_all_elements_located(paa_item_locator)) except TimeoutException: # 超时默认加载完成,可根据自身需求补充异常处理逻辑 pass
4 兜底优化方案
如果还是担心加载图标定位异常,可以直接跳过加载图标判断,仅用显式等待你要提取的PAA内容元素数量符合预期,这种逻辑更直接,完全不依赖加载状态元素的定位。
Selenium Python等待机制权威参考
直接查阅Selenium官方文档的Waits章节即可,里面详细覆盖了显式等待、隐式等待、流畅等待的实现逻辑,以及所有内置预期条件(EC)的用法说明,是最权威的参考资料。
内容的提问来源于stack exchange,提问作者nguyenphanhoaiduc
相关产品推荐
相关产品推荐

