51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 544|回复: 0
打印 上一主题 下一主题

[转贴] Selenium为什么慢?那是你加载策略设置不对

[复制链接]
  • TA的每日心情
    无聊
    前天 09:06
  • 签到天数: 941 天

    连续签到: 3 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-7-27 10:07:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    一、前言
      有不少粉丝,甚至一些行业中有一定经验的朋友都说selenium性能差、很慢,打开一个网页要等半天才开始执行。初学的粉丝提出这个问题我能够理解,行业工作经验数年还这样说我就有点诧异了。看来很多小伙伴还是没有阅读官方文档的习惯,这里就简单的讲解一下为什么你会觉得selenium慢以及如何解决这个问题:
      当我们通过webdriver(比如启动谷歌浏览器:webdriver.Chrome())启动浏览器时,会启动一个没有任何缓存、cookie的浏览器。这个时候通过driver.get("https://xxx")去访问页面自然是慢的,因为它需要加载该页面的资源,如果它的图片、样式、js文件过大时,这个时候就会变得更慢。
      跟我们平时直接将浏览器清除缓存再访问是一个道理,这并不是Selnium本身性能存在缺陷。
      但这时小伙伴们肯定会有疑惑,就算清了浏览器缓存重新访问,也没有通过Selnium来跑的那么慢呀!想要点击的按钮都出现半天了,它都还不进行点击,这不叫慢吗?
      这其实跟Selenium的页面加载策略有关。
      二、Selenium的页面加载策略详解
      Selnium的页面加载策略(pageLoadStrategy)有三种:
      normal:等待整个页面加载完毕再开始执行操作。
      eager:等待整个dom树加载完成,即DOMContentLoaded这个事件完成,也就是只要 HTML 完全加载和解析完毕就开始执行操作。放弃等待图片、样式、子帧的加载。
      none:等待html下载完成,哪怕还没开始解析就开始执行操作。
      默认情况下,当 Selenium WebDriver 加载页面时,它遵循的是normal加载策略,所以就会导致页面加载过慢,特别是在图片、样式等文件过大时,慢的就尤其明显了。
      所以我们可以根据实际情况调整Selenium的页面加载策略来缩短等待时间,提高执行速度。
      默认情况(未手动指定加载策略)来访问爱奇艺首页,然后点击电影,共耗时:7s左右。
      使用eager加载策略来访问爱奇艺首页,然后点击电影,共耗时:3.6s左右。
      配置代码如下:
    1. chrome_options = Options()
    2.   chrome_options.page_load_strategy = 'eager'
    3.   driver = webdriver.Chrome(options=chrome_options)
    复制代码
    可以明显的看到访问速度变快了。
      以为就这样了吗?还可以更快!
      加载策略设置为none,并引入retry做重试(目的是为了防止报错,当然设置隐式等待也可,但没retry稳妥)可以只用2s左右就能执行完成,完整代码如下:
    1. import datetime
    2.   from retrying import retry  # 需第三方库,需pip进行安装
    3.   from selenium import webdriver
    4.   from selenium.webdriver.chrome.options import Options
    5.   from selenium.webdriver.common.by import By
    6.   @retry(wait_fixed=10, stop_max_attempt_number=1)
    7.   def click(path):
    8.       driver.find_element(By.XPATH, path).click()
    9.   chrome_options = Options()
    10.   chrome_options.page_load_strategy = 'none'
    11.   driver = webdriver.Chrome(options=chrome_options)
    12.   start_time = datetime.datetime.now()
    13.   driver.get('https://www.iqiyi.com/')
    14.   click('//*[@id="block-C"]/div/div/div/div[1]/div[1]/div/div[1]/div/div/a/span[2]')
    15.   end_time = datetime.datetime.now()
    16.   print(end_time - start_time)
    复制代码
     三、总结
      所以selenium并不慢,只是你加载策略没有选择对而误认为它慢。
      当我们遇到比较费解或疑惑的问题时,应该第一时间去看看官方文档,说不定它已经有了解决方案了。



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-2 01:20 , Processed in 0.067244 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表