Selenium的加载策略

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium的加载策略相关的知识,希望对你有一定的参考价值。

Selenium的加载策略

当我们通过webdriver(比如启动谷歌浏览器:webdriver.Chrome())启动浏览器时,会启动一个没有任何缓存、cookie的浏览器。这个时候通过driver.get("https://xxx")去访问页面自然是慢的,因为它需要加载该页面的资源,如果它的图片、样式、js文件过大时,这个时候就会变得更慢。

跟我们平时直接将浏览器清除缓存再访问是一个道理,这并不是Selnium本身性能存在缺陷。

但这时小伙伴们肯定会有疑惑,就算清了浏览器缓存重新访问,也没有通过Selnium来跑的那么慢呀!想要点击的按钮都出现半天了,它都还不进行点击,这不叫慢吗?

这其实跟Selenium的页面加载策略有关。

0.Selenium的3种加载策略

Selnium的页面加载策略(pageLoadStrategy)有三种:

  • normal:等待整个页面加载完毕再开始执行操作
  • eager:等待整个dom树加载完成,即DOMContentLoaded这个事件完成,也就是只要html 完全加载和解析完毕就开始执行操作。放弃等待图片、样式、子帧的加载。
  • none:等待html下载完成,哪怕还没开始解析就开始执行操作。

默认情况下,当 Selenium WebDriver 加载页面时,它遵循的是normal加载策略,所以就会导致页面加载过慢,特别是在图片、样式等文件过大时,慢的就尤其明显了。

下图是使用eager加载策略来访问爱奇艺首页,然后点击电影,共耗时:3.6s左右

配置代码如下:

chrome_options = Options()
chrome_options.page_load_strategy = 'eager'
driver = webdriver.Chrome(options=chrome_options)

以为就这样了吗?还可以更快!

加载策略设置为none,并引入retry做重试(目的是为了防止报错,当然设置隐式等待也可,但没retry稳妥)可以只用2s左右就能执行完成,完整代码如下:

import datetime
from retrying import retry  # 需第三方库,需pip进行安装
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By


@retry(wait_fixed=10, stop_max_attempt_number=1)
def click(path):
    driver.find_element(By.XPATH, path).click()


chrome_options = Options()
chrome_options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=chrome_options)
start_time = datetime.datetime.now()
driver.get('https://www.iqiyi.com/')
click('//*[@id="block-C"]/div/div/div/div[1]/div[1]/div/div[1]/div/div/a/span[2]')
end_time = datetime.datetime.now()
print(end_time - start_time)

以上是关于Selenium的加载策略的主要内容,如果未能解决你的问题,请参考以下文章

Selenium的加载策略

曲鸟全栈UI自动化教学:Selenium为什么慢?那是你加载策略设置不对

如何使用给定的屏幕坐标选择元素 - selenium,java

selenium等待机制

突破网站对selenium的屏蔽

爬虫之selenium和webdriver—基础