Python Selenium页面加载慢超时解决方案:设置pageLoadStrategy为none
本文介绍Python Selenium中解决页面加载超时导致程序阻塞的问题。通过设置Chrome的pageLoadStrategy为none,使get()方法在HTML加载完成后立即返回,不再等待JS或图片资源。该方法避免了set_page_load_timeout导致的driver失效风险,实现了快速定位元素并继续操作的目标。
Selenium页面加载超时问题背景
开发环境配置如下:
操作系统为win10-64位,Python版本为2.7.16,Chrome浏览器版本为77。
from selenium import webdriver
driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get('http://全部加载完成超级慢的网站')
user = 'abc'
pwd = '123
driver.find_element_by_id('email').send_keys(user)
driver.find_element_by_id('pass').send_keys(pwd)
首先观察一段典型的Selenium代码:
当执行driver.get()后,程序会进入阻塞状态,直到网站所有资源完全加载。在此期间,无法执行后续任何代码,必须等待get操作彻底完成。
这种等待时间可能长达5分钟或更久。
实际上,网页主体可能在5秒内已打开,但后台仍在加载JavaScript脚本和图片等资源,导致加载速度极慢。然而,此时人工已可操作网页。
针对此问题,网上提供了多种解决方案。
其中一种常见做法如下(引用自网络):
set_page_load_timeout方法的缺陷
from selenium import webdriver
driver=webdriver.Chrome()
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)#这两种设置都进行才有效
try:
d.get(s)
except:
d.execute_script('window.stop()')#这句话好像没什么软用
该方案声称可在页面停止加载后继续操作。
通过设置driver.set_page_load_timeout(5),确实能在5秒后停止加载。但随之而来的是driver进程崩溃,后续所有操作均返回timeout错误。即使尝试使用try-except捕获异常,driver也已彻底失效,只能重新启动浏览器。
注意:使用set_page_load_timeout时,若页面未加载任何内容(如HTML源码未完整加载)即因超时而停止,会导致driver失效。后续对driver的任何操作均无法执行。因此,超时设置应确保页面内容至少加载一部分,且超时时间不宜过短。如图所示,在页面此种状态下停止加载后driver失效。
有人指出不能设置过短,否则driver会失效。但实际测试表明,即使设置为5分钟,只要发生一次超时,driver即告失效,导致程序直接崩溃。
接下来介绍另一种方法。
WebDriverWait方法的局限性
# coding = utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
driver = webdriver.Chrome()
class button():
def __call__(self, driver):
if driver.find_element_by_id('js_love_url'):
return True
else:
return False
driver.implicitly_wait(60)
time_start = time.time()
driver.get('https://www.163.com/')
# driver.find_element_by_id('js_love_url').click()
WebDriverWait(driver,2,0.5).until(button())
time_end = time.time()
print('access time is : ', time_end - time_start)
time.sleep(2)
driver.quit()
使用WebDriverWait进行显式等待。经测试,若driver.get()未执行完毕,后续代码根本不会执行,因此该方法依然无法解决阻塞问题。
经过多种尝试和失败后,最终找到了正确的解决方法。
其核心原理是将driver.get()操作改为非阻塞模式,即打开网页后直接返回,无需等待所有资源加载完成。
随后,可直接等待所需元素出现并进行后续操作。
配置过程非常简单。
通过pageLoadStrategy解决非阻塞加载
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
#get直接返回,不再等待界面加载完成
desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(executable_path='chromedriver.exe')
只需配置一个参数,即页面加载策略(pageLoadStrategy)。系统默认值为“normal”,即等待页面完全加载。将其设置为“none”,即可实现get操作完成后立即结束阻塞状态。
至此,关于Python Selenium页面加载慢超时问题的解决方案介绍完毕。更多相关Python Selenium加载慢内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









