{"id":661,"date":"2026-07-01T06:31:42","date_gmt":"2026-07-01T06:31:42","guid":{"rendered":"https:\/\/vikassrivastava.in\/academy\/?page_id=661"},"modified":"2026-07-01T06:37:07","modified_gmt":"2026-07-01T06:37:07","slug":"website-speed-test","status":"publish","type":"page","link":"https:\/\/vikassrivastava.in\/academy\/website-speed-test\/","title":{"rendered":"Website Speed Test"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"661\" class=\"elementor elementor-661\">\n\t\t\t\t<div class=\"elementor-element elementor-element-178b2d8 e-con e-atomic-element e-flexbox-base e-62b5813 \" data-id=\"178b2d8\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"178b2d8\">\n    \t\t<div class=\"elementor-element elementor-element-40cfefa elementor-widget elementor-widget-html\" data-id=\"40cfefa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"wst-html-speed-test-app\">\r\n  <style>\r\n    #wst-html-speed-test-app {\r\n      --wst-primary: #2563eb;\r\n      --wst-primary-dark: #1d4ed8;\r\n      --wst-green: #16a34a;\r\n      --wst-orange: #f59e0b;\r\n      --wst-red: #dc2626;\r\n      --wst-bg: #f4f7fb;\r\n      --wst-card: #ffffff;\r\n      --wst-text: #1f2937;\r\n      --wst-muted: #6b7280;\r\n      --wst-border: #e5e7eb;\r\n      --wst-shadow: 0 14px 35px rgba(15, 23, 42, 0.09);\r\n      font-family: Arial, Helvetica, sans-serif;\r\n      color: var(--wst-text);\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    #wst-html-speed-test-app *,\r\n    #wst-html-speed-test-app *::before,\r\n    #wst-html-speed-test-app *::after {\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-wrapper {\r\n      max-width: 1180px;\r\n      margin: 0 auto;\r\n      padding: 24px;\r\n      border-radius: 26px;\r\n      background: linear-gradient(135deg, #eef5ff 0%, #f8fafc 45%, #ecfdf5 100%);\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-header {\r\n      background: linear-gradient(135deg, #1d4ed8, #2563eb, #16a34a);\r\n      color: #ffffff;\r\n      padding: 34px;\r\n      border-radius: 24px;\r\n      box-shadow: var(--wst-shadow);\r\n      margin-bottom: 20px;\r\n      position: relative;\r\n      overflow: hidden;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-header::after {\r\n      content: \"\";\r\n      position: absolute;\r\n      width: 210px;\r\n      height: 210px;\r\n      right: -70px;\r\n      top: -80px;\r\n      border-radius: 50%;\r\n      background: rgba(255, 255, 255, 0.15);\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-header h2 {\r\n      position: relative;\r\n      z-index: 1;\r\n      margin: 0 0 10px;\r\n      color: #ffffff;\r\n      font-size: clamp(28px, 4vw, 42px);\r\n      line-height: 1.2;\r\n      font-weight: 900;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-header p {\r\n      position: relative;\r\n      z-index: 1;\r\n      margin: 0;\r\n      max-width: 900px;\r\n      color: rgba(255, 255, 255, 0.94);\r\n      font-size: 16px;\r\n      line-height: 1.65;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-note-pill {\r\n      position: relative;\r\n      z-index: 1;\r\n      display: inline-flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      margin-top: 16px;\r\n      padding: 10px 14px;\r\n      border-radius: 999px;\r\n      background: rgba(255, 255, 255, 0.17);\r\n      color: #ffffff;\r\n      font-size: 13px;\r\n      font-weight: 700;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-card {\r\n      background: var(--wst-card);\r\n      border: 1px solid var(--wst-border);\r\n      border-radius: 22px;\r\n      padding: 22px;\r\n      box-shadow: var(--wst-shadow);\r\n      margin-bottom: 20px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-card h3 {\r\n      margin: 0 0 16px;\r\n      color: #111827;\r\n      font-size: 21px;\r\n      line-height: 1.25;\r\n      font-weight: 900;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-form {\r\n      display: grid;\r\n      grid-template-columns: 1fr auto;\r\n      gap: 14px;\r\n      align-items: end;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-field {\r\n      display: flex;\r\n      flex-direction: column;\r\n      gap: 8px;\r\n    }\r\n\r\n    #wst-html-speed-test-app label {\r\n      color: #374151;\r\n      font-size: 14px;\r\n      font-weight: 900;\r\n    }\r\n\r\n    #wst-html-speed-test-app input,\r\n    #wst-html-speed-test-app select {\r\n      width: 100%;\r\n      min-height: 52px;\r\n      border: 1px solid #d1d5db;\r\n      border-radius: 15px;\r\n      padding: 13px 15px;\r\n      color: #111827;\r\n      background: #ffffff;\r\n      font-size: 15px;\r\n      outline: none;\r\n      transition: 0.2s ease;\r\n    }\r\n\r\n    #wst-html-speed-test-app input:focus,\r\n    #wst-html-speed-test-app select:focus {\r\n      border-color: var(--wst-primary);\r\n      box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.13);\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-helper {\r\n      margin: 6px 0 0;\r\n      color: var(--wst-muted);\r\n      font-size: 12px;\r\n      line-height: 1.45;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-btn {\r\n      border: none;\r\n      border-radius: 15px;\r\n      padding: 13px 18px;\r\n      min-height: 52px;\r\n      font-size: 14px;\r\n      font-weight: 900;\r\n      cursor: pointer;\r\n      transition: 0.2s ease;\r\n      line-height: 1;\r\n      white-space: nowrap;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-btn:hover {\r\n      transform: translateY(-1px);\r\n      filter: brightness(0.98);\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-btn:disabled {\r\n      opacity: 0.6;\r\n      cursor: not-allowed;\r\n      transform: none;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-btn-primary {\r\n      background: var(--wst-primary);\r\n      color: #ffffff;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-btn-dark {\r\n      background: #111827;\r\n      color: #ffffff;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-btn-light {\r\n      background: #eef2ff;\r\n      color: #1e40af;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-btn-danger {\r\n      background: #fee2e2;\r\n      color: var(--wst-red);\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-message {\r\n      display: none;\r\n      margin-top: 14px;\r\n      padding: 13px 15px;\r\n      border-radius: 15px;\r\n      font-size: 14px;\r\n      line-height: 1.5;\r\n      font-weight: 800;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-message.wst-success {\r\n      display: block;\r\n      color: #166534;\r\n      background: #dcfce7;\r\n      border: 1px solid #bbf7d0;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-message.wst-error {\r\n      display: block;\r\n      color: #991b1b;\r\n      background: #fee2e2;\r\n      border: 1px solid #fecaca;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-message.wst-info {\r\n      display: block;\r\n      color: #1e40af;\r\n      background: #dbeafe;\r\n      border: 1px solid #bfdbfe;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-loader {\r\n      display: none;\r\n      align-items: center;\r\n      gap: 12px;\r\n      margin-top: 16px;\r\n      color: #374151;\r\n      font-weight: 800;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-spinner {\r\n      width: 28px;\r\n      height: 28px;\r\n      border: 4px solid #dbeafe;\r\n      border-top-color: var(--wst-primary);\r\n      border-radius: 50%;\r\n      animation: wst-spin 0.85s linear infinite;\r\n    }\r\n\r\n    @keyframes wst-spin {\r\n      to {\r\n        transform: rotate(360deg);\r\n      }\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-results {\r\n      display: none;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-dashboard {\r\n      display: grid;\r\n      grid-template-columns: repeat(3, 1fr);\r\n      gap: 16px;\r\n      margin-bottom: 20px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-result-card {\r\n      background: #ffffff;\r\n      border: 1px solid var(--wst-border);\r\n      border-radius: 20px;\r\n      padding: 20px;\r\n      box-shadow: var(--wst-shadow);\r\n      min-height: 126px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-result-card .wst-label {\r\n      display: block;\r\n      color: var(--wst-muted);\r\n      font-size: 13px;\r\n      font-weight: 900;\r\n      margin-bottom: 10px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-result-card strong {\r\n      display: block;\r\n      color: #111827;\r\n      font-size: 20px;\r\n      line-height: 1.35;\r\n      word-break: break-word;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-badge {\r\n      display: inline-flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      padding: 8px 12px;\r\n      border-radius: 999px;\r\n      font-size: 13px;\r\n      font-weight: 900;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-fast,\r\n    #wst-html-speed-test-app .wst-good {\r\n      color: #166534;\r\n      background: #dcfce7;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-average,\r\n    #wst-html-speed-test-app .wst-moderate {\r\n      color: #92400e;\r\n      background: #fef3c7;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-slow,\r\n    #wst-html-speed-test-app .wst-heavy {\r\n      color: #991b1b;\r\n      background: #fee2e2;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-score-card {\r\n      text-align: center;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-score-circle {\r\n      width: 96px;\r\n      height: 96px;\r\n      margin: 0 auto 10px;\r\n      border-radius: 50%;\r\n      background: conic-gradient(#2563eb 0deg, #e5e7eb 0deg);\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      position: relative;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-score-circle::before {\r\n      content: \"\";\r\n      width: 74px;\r\n      height: 74px;\r\n      position: absolute;\r\n      border-radius: 50%;\r\n      background: #ffffff;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-score-circle span {\r\n      position: relative;\r\n      z-index: 1;\r\n      color: #111827;\r\n      font-size: 25px;\r\n      font-weight: 900;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-recommendations ul {\r\n      margin: 0;\r\n      padding-left: 22px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-recommendations li {\r\n      color: #374151;\r\n      font-size: 15px;\r\n      line-height: 1.55;\r\n      margin-bottom: 10px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-limit-note {\r\n      margin-top: 14px;\r\n      padding: 14px 16px;\r\n      border-radius: 16px;\r\n      background: #f8fafc;\r\n      border: 1px solid var(--wst-border);\r\n      color: var(--wst-muted);\r\n      font-size: 13px;\r\n      line-height: 1.55;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-actions {\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      gap: 10px;\r\n      margin-top: 16px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-history-header {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      align-items: center;\r\n      gap: 14px;\r\n      margin-bottom: 14px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-history-list {\r\n      display: flex;\r\n      flex-direction: column;\r\n      gap: 12px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-history-item {\r\n      display: grid;\r\n      grid-template-columns: 1fr auto;\r\n      gap: 14px;\r\n      padding: 14px;\r\n      border: 1px solid var(--wst-border);\r\n      background: #f9fafb;\r\n      border-radius: 16px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-history-main strong {\r\n      display: block;\r\n      color: #111827;\r\n      font-size: 15px;\r\n      margin-bottom: 6px;\r\n      word-break: break-word;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-history-meta {\r\n      color: var(--wst-muted);\r\n      font-size: 13px;\r\n      line-height: 1.6;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-history-actions {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-empty-history {\r\n      padding: 18px;\r\n      border: 1px dashed #d1d5db;\r\n      border-radius: 16px;\r\n      background: #f9fafb;\r\n      color: var(--wst-muted);\r\n      text-align: center;\r\n      font-weight: 800;\r\n    }\r\n\r\n    #wst-html-speed-test-app .wst-hidden-frame {\r\n      position: absolute;\r\n      left: -99999px;\r\n      top: -99999px;\r\n      width: 1px;\r\n      height: 1px;\r\n      opacity: 0;\r\n      pointer-events: none;\r\n    }\r\n\r\n    @media (max-width: 960px) {\r\n      #wst-html-speed-test-app .wst-dashboard {\r\n        grid-template-columns: repeat(2, 1fr);\r\n      }\r\n\r\n      #wst-html-speed-test-app .wst-form {\r\n        grid-template-columns: 1fr;\r\n      }\r\n\r\n      #wst-html-speed-test-app .wst-btn-primary {\r\n        width: 100%;\r\n      }\r\n    }\r\n\r\n    @media (max-width: 640px) {\r\n      #wst-html-speed-test-app .wst-wrapper {\r\n        padding: 12px;\r\n        border-radius: 18px;\r\n      }\r\n\r\n      #wst-html-speed-test-app .wst-header {\r\n        padding: 24px 18px;\r\n        border-radius: 20px;\r\n      }\r\n\r\n      #wst-html-speed-test-app .wst-card {\r\n        padding: 16px;\r\n        border-radius: 18px;\r\n      }\r\n\r\n      #wst-html-speed-test-app .wst-dashboard {\r\n        grid-template-columns: 1fr;\r\n      }\r\n\r\n      #wst-html-speed-test-app .wst-history-header,\r\n      #wst-html-speed-test-app .wst-history-item {\r\n        grid-template-columns: 1fr;\r\n        flex-direction: column;\r\n        align-items: stretch;\r\n      }\r\n\r\n      #wst-html-speed-test-app .wst-history-actions {\r\n        justify-content: flex-start;\r\n      }\r\n\r\n      #wst-html-speed-test-app .wst-actions,\r\n      #wst-html-speed-test-app .wst-history-actions {\r\n        flex-direction: column;\r\n      }\r\n\r\n      #wst-html-speed-test-app .wst-btn {\r\n        width: 100%;\r\n      }\r\n    }\r\n  <\/style>\r\n\r\n  <div class=\"wst-wrapper\">\r\n    <div class=\"wst-header\">\r\n      <h2>Website Speed Test Tool<\/h2>\r\n      <p>Test the basic loading speed of any website using a lightweight browser-based tool. Enter a website URL and get loading time, speed status, estimated score, and practical optimization recommendations.<\/p>\r\n      <div class=\"wst-note-pill\">\ud83d\udd12 This HTML tool works in your browser and stores recent history locally only.<\/div>\r\n    <\/div>\r\n\r\n    <div class=\"wst-card\">\r\n      <form class=\"wst-form\" id=\"wst-speed-form\">\r\n        <div class=\"wst-field\">\r\n          <label for=\"wst-url-input\">Website URL<\/label>\r\n          <input type=\"text\" id=\"wst-url-input\" placeholder=\"Enter website URL\" autocomplete=\"url\">\r\n          <p class=\"wst-helper\">Example: example.com, https:\/\/mywebsite.com, https:\/\/businesssite.in<\/p>\r\n        <\/div>\r\n\r\n        <button type=\"submit\" class=\"wst-btn wst-btn-primary\" id=\"wst-test-btn\">Test Website Speed<\/button>\r\n      <\/form>\r\n\r\n      <div class=\"wst-loader\" id=\"wst-loader\">\r\n        <div class=\"wst-spinner\"><\/div>\r\n        <span>Testing website speed. Please wait...<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"wst-message\" id=\"wst-message\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"wst-results\" id=\"wst-results\">\r\n      <div class=\"wst-dashboard\">\r\n        <div class=\"wst-result-card\">\r\n          <span class=\"wst-label\">Website URL<\/span>\r\n          <strong id=\"wst-result-url\">-<\/strong>\r\n        <\/div>\r\n\r\n        <div class=\"wst-result-card\">\r\n          <span class=\"wst-label\">Loading Time<\/span>\r\n          <strong id=\"wst-result-time\">-<\/strong>\r\n        <\/div>\r\n\r\n        <div class=\"wst-result-card\">\r\n          <span class=\"wst-label\">Page Size<\/span>\r\n          <strong id=\"wst-result-size\">-<\/strong>\r\n        <\/div>\r\n\r\n        <div class=\"wst-result-card\">\r\n          <span class=\"wst-label\">Speed Status<\/span>\r\n          <strong id=\"wst-result-speed-status\">-<\/strong>\r\n        <\/div>\r\n\r\n        <div class=\"wst-result-card\">\r\n          <span class=\"wst-label\">Page Size Status<\/span>\r\n          <strong id=\"wst-result-size-status\">-<\/strong>\r\n        <\/div>\r\n\r\n        <div class=\"wst-result-card wst-score-card\">\r\n          <span class=\"wst-label\">Performance Score<\/span>\r\n          <div class=\"wst-score-circle\" id=\"wst-score-circle\">\r\n            <span id=\"wst-result-score\">0<\/span>\r\n          <\/div>\r\n          <strong id=\"wst-result-score-label\">-<\/strong>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wst-card wst-recommendations\">\r\n        <h3>Performance Recommendations<\/h3>\r\n        <ul id=\"wst-recommendation-list\"><\/ul>\r\n\r\n        <div class=\"wst-limit-note\">\r\n          Note: This HTML-only tool provides a basic browser-side speed estimate. For security reasons, browsers may block exact page-size reading for external websites due to CORS restrictions. Actual user experience may vary based on location, device, browser, internet connection, hosting, caching, and third-party services.\r\n        <\/div>\r\n\r\n        <div class=\"wst-actions\">\r\n          <button type=\"button\" class=\"wst-btn wst-btn-dark\" id=\"wst-retest-btn\">Retest URL<\/button>\r\n          <button type=\"button\" class=\"wst-btn wst-btn-light\" id=\"wst-copy-btn\">Copy Result<\/button>\r\n          <button type=\"button\" class=\"wst-btn wst-btn-danger\" id=\"wst-clear-result-btn\">Clear Result<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"wst-card\">\r\n      <div class=\"wst-history-header\">\r\n        <h3 style=\"margin:0;\">Recent Test History<\/h3>\r\n        <button type=\"button\" class=\"wst-btn wst-btn-danger\" id=\"wst-clear-history-btn\">Clear History<\/button>\r\n      <\/div>\r\n\r\n      <div class=\"wst-history-list\" id=\"wst-history-list\">\r\n        <div class=\"wst-empty-history\">No recent website speed tests found.<\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <iframe id=\"wst-test-frame\" class=\"wst-hidden-frame\" title=\"Website Speed Test Frame\"><\/iframe>\r\n\r\n  <script>\r\n    (function () {\r\n      \"use strict\";\r\n\r\n      var WST_HISTORY_KEY = \"wst_html_speed_test_history_v1\";\r\n      var currentResult = null;\r\n      var currentUrl = \"\";\r\n\r\n      function wstEl(id) {\r\n        return document.getElementById(id);\r\n      }\r\n\r\n      function wstTrim(value) {\r\n        return String(value || \"\").trim();\r\n      }\r\n\r\n      function wstNormalizeUrl(url) {\r\n        url = wstTrim(url);\r\n\r\n        if (!url) {\r\n          return \"\";\r\n        }\r\n\r\n        if (!\/^https?:\\\/\\\/\/i.test(url)) {\r\n          url = \"https:\/\/\" + url;\r\n        }\r\n\r\n        return url;\r\n      }\r\n\r\n      function wstIsValidUrl(url) {\r\n        try {\r\n          var parsed = new URL(url);\r\n          return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\r\n        } catch (e) {\r\n          return false;\r\n        }\r\n      }\r\n\r\n      function wstShowMessage(type, message) {\r\n        var box = wstEl(\"wst-message\");\r\n        box.className = \"wst-message \" + (type === \"success\" ? \"wst-success\" : type === \"info\" ? \"wst-info\" : \"wst-error\");\r\n        box.textContent = message;\r\n        box.style.display = \"block\";\r\n      }\r\n\r\n      function wstHideMessage() {\r\n        var box = wstEl(\"wst-message\");\r\n        box.className = \"wst-message\";\r\n        box.textContent = \"\";\r\n        box.style.display = \"none\";\r\n      }\r\n\r\n      function wstSetLoading(isLoading) {\r\n        var btn = wstEl(\"wst-test-btn\");\r\n\r\n        if (isLoading) {\r\n          btn.disabled = true;\r\n          btn.textContent = \"Testing...\";\r\n          wstEl(\"wst-loader\").style.display = \"flex\";\r\n        } else {\r\n          btn.disabled = false;\r\n          btn.textContent = \"Test Website Speed\";\r\n          wstEl(\"wst-loader\").style.display = \"none\";\r\n        }\r\n      }\r\n\r\n      function wstFormatTime(seconds) {\r\n        return seconds.toFixed(2) + \" seconds\";\r\n      }\r\n\r\n      function wstGetSpeedStatus(seconds) {\r\n        if (seconds < 2) {\r\n          return {\r\n            label: \"Fast Website\",\r\n            className: \"wst-fast\"\r\n          };\r\n        }\r\n\r\n        if (seconds <= 4) {\r\n          return {\r\n            label: \"Average Speed\",\r\n            className: \"wst-average\"\r\n          };\r\n        }\r\n\r\n        return {\r\n          label: \"Needs Improvement\",\r\n          className: \"wst-slow\"\r\n        };\r\n      }\r\n\r\n      function wstGetSizeStatus(sizeBytes, isKnown) {\r\n        if (!isKnown) {\r\n          return {\r\n            label: \"Browser Restricted\",\r\n            className: \"wst-moderate\"\r\n          };\r\n        }\r\n\r\n        if (sizeBytes < 1048576) {\r\n          return {\r\n            label: \"Good\",\r\n            className: \"wst-good\"\r\n          };\r\n        }\r\n\r\n        if (sizeBytes <= 3145728) {\r\n          return {\r\n            label: \"Moderate\",\r\n            className: \"wst-moderate\"\r\n          };\r\n        }\r\n\r\n        return {\r\n          label: \"Heavy Page\",\r\n          className: \"wst-heavy\"\r\n        };\r\n      }\r\n\r\n      function wstFormatSize(bytes, isKnown) {\r\n        if (!isKnown) {\r\n          return \"Restricted by browser\";\r\n        }\r\n\r\n        if (bytes >= 1048576) {\r\n          return (bytes \/ 1048576).toFixed(2) + \" MB\";\r\n        }\r\n\r\n        return (bytes \/ 1024).toFixed(2) + \" KB\";\r\n      }\r\n\r\n      function wstCalculateScore(seconds, sizeBytes, isKnown, failed) {\r\n        var score = 100;\r\n\r\n        if (failed) {\r\n          score -= 40;\r\n        }\r\n\r\n        if (seconds > 1) {\r\n          score -= Math.min(45, Math.round((seconds - 1) * 9));\r\n        }\r\n\r\n        if (isKnown && sizeBytes > 1048576) {\r\n          score -= Math.min(30, Math.round(((sizeBytes - 1048576) \/ 1048576) * 10));\r\n        }\r\n\r\n        if (!isKnown) {\r\n          score -= 8;\r\n        }\r\n\r\n        if (score < 0) {\r\n          score = 0;\r\n        }\r\n\r\n        var label = \"Excellent\";\r\n\r\n        if (score >= 90) {\r\n          label = \"Excellent\";\r\n        } else if (score >= 75) {\r\n          label = \"Good\";\r\n        } else if (score >= 50) {\r\n          label = \"Average\";\r\n        } else {\r\n          label = \"Poor\";\r\n        }\r\n\r\n        return {\r\n          score: score,\r\n          label: label\r\n        };\r\n      }\r\n\r\n      function wstScoreColor(score) {\r\n        if (score >= 90) return \"#16a34a\";\r\n        if (score >= 75) return \"#2563eb\";\r\n        if (score >= 50) return \"#f59e0b\";\r\n        return \"#dc2626\";\r\n      }\r\n\r\n      function wstGenerateRecommendations(seconds, sizeBytes, isKnown, failed) {\r\n        var rec = [];\r\n\r\n        if (failed) {\r\n          rec.push(\"Website could not be fully loaded in the browser test frame. Check whether the website blocks iframe loading, has SSL issues, or is unreachable.\");\r\n          rec.push(\"Verify the URL manually and test again after confirming the website is online.\");\r\n        }\r\n\r\n        if (seconds > 4) {\r\n          rec.push(\"Optimize hosting or server response time because the loading time appears high.\");\r\n          rec.push(\"Remove unnecessary WordPress plugins, tracking scripts, popups, and heavy third-party resources.\");\r\n          rec.push(\"Use a CDN to improve delivery speed for visitors from different locations.\");\r\n        } else if (seconds >= 2) {\r\n          rec.push(\"Enable browser caching to improve repeat visits.\");\r\n          rec.push(\"Minify CSS and JavaScript files to reduce loading time.\");\r\n          rec.push(\"Reduce third-party scripts and unnecessary widgets.\");\r\n        } else {\r\n          rec.push(\"Loading time looks good. Continue monitoring after adding new plugins, images, scripts, or ads.\");\r\n        }\r\n\r\n        if (isKnown && sizeBytes > 3145728) {\r\n          rec.push(\"Compress large images and avoid uploading oversized media files.\");\r\n          rec.push(\"Use lazy loading for images, videos, and embedded content.\");\r\n          rec.push(\"Remove unused CSS, JavaScript, fonts, and heavy page sections.\");\r\n        } else if (isKnown && sizeBytes >= 1048576) {\r\n          rec.push(\"Page size is moderate. Compress images and optimize static files for better performance.\");\r\n        } else if (isKnown) {\r\n          rec.push(\"Page size looks good. Keep images optimized and avoid unnecessary scripts.\");\r\n        } else {\r\n          rec.push(\"Exact page size could not be measured in HTML-only mode because most external websites block browser access to response content.\");\r\n        }\r\n\r\n        rec.push(\"Use a lightweight WordPress theme and avoid heavy page builders where possible.\");\r\n        rec.push(\"Enable GZIP or Brotli compression from your hosting panel or caching plugin.\");\r\n        rec.push(\"Optimize images into WebP format where supported.\");\r\n\r\n        return rec;\r\n      }\r\n\r\n      function wstTryFetchSize(url, callback) {\r\n        var start = performance.now();\r\n\r\n        fetch(url, {\r\n          method: \"GET\",\r\n          mode: \"cors\",\r\n          cache: \"no-store\"\r\n        })\r\n          .then(function (response) {\r\n            return response.text();\r\n          })\r\n          .then(function (text) {\r\n            var end = performance.now();\r\n            var bytes = new Blob([text]).size;\r\n            callback({\r\n              success: true,\r\n              seconds: (end - start) \/ 1000,\r\n              sizeBytes: bytes,\r\n              sizeKnown: true\r\n            });\r\n          })\r\n          .catch(function () {\r\n            callback({\r\n              success: false,\r\n              seconds: null,\r\n              sizeBytes: 0,\r\n              sizeKnown: false\r\n            });\r\n          });\r\n      }\r\n\r\n      function wstIframeSpeedTest(url, callback) {\r\n        var frame = wstEl(\"wst-test-frame\");\r\n        var done = false;\r\n        var startTime = performance.now();\r\n        var timeoutLimit = 15000;\r\n\r\n        function finish(success) {\r\n          if (done) return;\r\n          done = true;\r\n\r\n          var endTime = performance.now();\r\n          var seconds = (endTime - startTime) \/ 1000;\r\n\r\n          try {\r\n            frame.src = \"about:blank\";\r\n          } catch (e) {}\r\n\r\n          callback({\r\n            success: success,\r\n            seconds: seconds\r\n          });\r\n        }\r\n\r\n        frame.onload = function () {\r\n          finish(true);\r\n        };\r\n\r\n        frame.onerror = function () {\r\n          finish(false);\r\n        };\r\n\r\n        setTimeout(function () {\r\n          finish(false);\r\n        }, timeoutLimit);\r\n\r\n        try {\r\n          frame.src = url + (url.indexOf(\"?\") > -1 ? \"&\" : \"?\") + \"wst_cache_bust=\" + Date.now();\r\n        } catch (e) {\r\n          finish(false);\r\n        }\r\n      }\r\n\r\n      function wstRunSpeedTest(url) {\r\n        wstHideMessage();\r\n        wstSetLoading(true);\r\n        currentUrl = url;\r\n\r\n        var finalData = {\r\n          url: url,\r\n          seconds: 0,\r\n          pageSizeBytes: 0,\r\n          sizeKnown: false,\r\n          failed: false\r\n        };\r\n\r\n        wstTryFetchSize(url, function (fetchResult) {\r\n          wstIframeSpeedTest(url, function (iframeResult) {\r\n            var measuredSeconds = iframeResult.seconds;\r\n\r\n            if (fetchResult.success && fetchResult.seconds && fetchResult.seconds > 0) {\r\n              measuredSeconds = Math.min(iframeResult.seconds || fetchResult.seconds, fetchResult.seconds);\r\n            }\r\n\r\n            finalData.seconds = measuredSeconds || 0;\r\n            finalData.pageSizeBytes = fetchResult.sizeBytes || 0;\r\n            finalData.sizeKnown = !!fetchResult.sizeKnown;\r\n            finalData.failed = !iframeResult.success && !fetchResult.success;\r\n\r\n            if (!finalData.seconds || finalData.seconds <= 0) {\r\n              finalData.seconds = 15;\r\n              finalData.failed = true;\r\n            }\r\n\r\n            wstRenderResults(finalData);\r\n            wstSaveHistory(currentResult);\r\n            wstSetLoading(false);\r\n\r\n            if (finalData.failed) {\r\n              wstShowMessage(\"error\", \"Unable to fully test this website. The website may block browser loading or may be unreachable.\");\r\n            } else {\r\n              wstShowMessage(\"success\", \"Website speed test completed successfully.\");\r\n            }\r\n          });\r\n        });\r\n      }\r\n\r\n      function wstRenderResults(data) {\r\n        var speedStatus = wstGetSpeedStatus(data.seconds);\r\n        var sizeStatus = wstGetSizeStatus(data.pageSizeBytes, data.sizeKnown);\r\n        var scoreData = wstCalculateScore(data.seconds, data.pageSizeBytes, data.sizeKnown, data.failed);\r\n        var recommendations = wstGenerateRecommendations(data.seconds, data.pageSizeBytes, data.sizeKnown, data.failed);\r\n\r\n        currentResult = {\r\n          url: data.url,\r\n          loadingTime: wstFormatTime(data.seconds),\r\n          pageSize: wstFormatSize(data.pageSizeBytes, data.sizeKnown),\r\n          speedStatus: speedStatus.label,\r\n          sizeStatus: sizeStatus.label,\r\n          score: scoreData.score,\r\n          scoreLabel: scoreData.label,\r\n          testedAt: new Date().toLocaleString(),\r\n          recommendations: recommendations\r\n        };\r\n\r\n        wstEl(\"wst-results\").style.display = \"block\";\r\n        wstEl(\"wst-result-url\").textContent = currentResult.url;\r\n        wstEl(\"wst-result-time\").textContent = currentResult.loadingTime;\r\n        wstEl(\"wst-result-size\").textContent = currentResult.pageSize;\r\n\r\n        wstEl(\"wst-result-speed-status\").innerHTML = '<span class=\"wst-badge ' + speedStatus.className + '\">' + speedStatus.label + '<\/span>';\r\n        wstEl(\"wst-result-size-status\").innerHTML = '<span class=\"wst-badge ' + sizeStatus.className + '\">' + sizeStatus.label + '<\/span>';\r\n\r\n        wstEl(\"wst-result-score\").textContent = scoreData.score;\r\n        wstEl(\"wst-result-score-label\").textContent = scoreData.label;\r\n\r\n        var degrees = Math.round((scoreData.score \/ 100) * 360);\r\n        wstEl(\"wst-score-circle\").style.background = \"conic-gradient(\" + wstScoreColor(scoreData.score) + \" \" + degrees + \"deg, #e5e7eb \" + degrees + \"deg)\";\r\n\r\n        var recHtml = \"\";\r\n        recommendations.forEach(function (item) {\r\n          recHtml += \"<li>\" + wstEscapeHtml(item) + \"<\/li>\";\r\n        });\r\n        wstEl(\"wst-recommendation-list\").innerHTML = recHtml;\r\n\r\n        setTimeout(function () {\r\n          wstEl(\"wst-results\").scrollIntoView({\r\n            behavior: \"smooth\",\r\n            block: \"start\"\r\n          });\r\n        }, 100);\r\n      }\r\n\r\n      function wstEscapeHtml(text) {\r\n        return String(text || \"\").replace(\/[&<>\"']\/g, function (char) {\r\n          return {\r\n            \"&\": \"&amp;\",\r\n            \"<\": \"&lt;\",\r\n            \">\": \"&gt;\",\r\n            '\"': \"&quot;\",\r\n            \"'\": \"&#039;\"\r\n          }[char];\r\n        });\r\n      }\r\n\r\n      function wstGetHistory() {\r\n        try {\r\n          var data = localStorage.getItem(WST_HISTORY_KEY);\r\n          return data ? JSON.parse(data) : [];\r\n        } catch (e) {\r\n          return [];\r\n        }\r\n      }\r\n\r\n      function wstSetHistory(history) {\r\n        localStorage.setItem(WST_HISTORY_KEY, JSON.stringify(history));\r\n      }\r\n\r\n      function wstSaveHistory(result) {\r\n        if (!result) return;\r\n\r\n        var history = wstGetHistory();\r\n\r\n        history = history.filter(function (item) {\r\n          return item.url !== result.url;\r\n        });\r\n\r\n        history.unshift({\r\n          url: result.url,\r\n          loadingTime: result.loadingTime,\r\n          pageSize: result.pageSize,\r\n          score: result.score,\r\n          scoreLabel: result.scoreLabel,\r\n          testedAt: result.testedAt\r\n        });\r\n\r\n        history = history.slice(0, 10);\r\n        wstSetHistory(history);\r\n        wstRenderHistory();\r\n      }\r\n\r\n      function wstRenderHistory() {\r\n        var list = wstEl(\"wst-history-list\");\r\n        var history = wstGetHistory();\r\n\r\n        if (!history.length) {\r\n          list.innerHTML = '<div class=\"wst-empty-history\">No recent website speed tests found.<\/div>';\r\n          return;\r\n        }\r\n\r\n        var html = \"\";\r\n\r\n        history.forEach(function (item) {\r\n          html += '<div class=\"wst-history-item\">';\r\n          html += '<div class=\"wst-history-main\">';\r\n          html += '<strong>' + wstEscapeHtml(item.url) + '<\/strong>';\r\n          html += '<div class=\"wst-history-meta\">';\r\n          html += 'Loading Time: ' + wstEscapeHtml(item.loadingTime) + ' | ';\r\n          html += 'Page Size: ' + wstEscapeHtml(item.pageSize) + ' | ';\r\n          html += 'Score: ' + wstEscapeHtml(item.score) + '\/100 (' + wstEscapeHtml(item.scoreLabel) + ')';\r\n          html += '<br>Date: ' + wstEscapeHtml(item.testedAt);\r\n          html += '<\/div>';\r\n          html += '<\/div>';\r\n          html += '<div class=\"wst-history-actions\">';\r\n          html += '<button type=\"button\" class=\"wst-btn wst-btn-light wst-history-retest\" data-url=\"' + wstEscapeHtml(item.url) + '\">Retest URL<\/button>';\r\n          html += '<\/div>';\r\n          html += '<\/div>';\r\n        });\r\n\r\n        list.innerHTML = html;\r\n      }\r\n\r\n      function wstCopyResult() {\r\n        if (!currentResult) {\r\n          wstShowMessage(\"error\", \"No result available to copy.\");\r\n          return;\r\n        }\r\n\r\n        var text = \"\";\r\n        text += \"Website Speed Test Result\\n\";\r\n        text += \"Website URL: \" + currentResult.url + \"\\n\";\r\n        text += \"Loading Time: \" + currentResult.loadingTime + \"\\n\";\r\n        text += \"Page Size: \" + currentResult.pageSize + \"\\n\";\r\n        text += \"Speed Status: \" + currentResult.speedStatus + \"\\n\";\r\n        text += \"Page Size Status: \" + currentResult.sizeStatus + \"\\n\";\r\n        text += \"Performance Score: \" + currentResult.score + \"\/100 (\" + currentResult.scoreLabel + \")\\n\";\r\n        text += \"Tested At: \" + currentResult.testedAt + \"\\n\\n\";\r\n        text += \"Recommendations:\\n\";\r\n        currentResult.recommendations.forEach(function (item, index) {\r\n          text += (index + 1) + \". \" + item + \"\\n\";\r\n        });\r\n\r\n        if (navigator.clipboard && navigator.clipboard.writeText) {\r\n          navigator.clipboard.writeText(text).then(function () {\r\n            wstShowMessage(\"success\", \"Result copied successfully.\");\r\n          }).catch(function () {\r\n            wstFallbackCopy(text);\r\n          });\r\n        } else {\r\n          wstFallbackCopy(text);\r\n        }\r\n      }\r\n\r\n      function wstFallbackCopy(text) {\r\n        var textarea = document.createElement(\"textarea\");\r\n        textarea.value = text;\r\n        textarea.style.position = \"fixed\";\r\n        textarea.style.opacity = \"0\";\r\n        document.body.appendChild(textarea);\r\n        textarea.select();\r\n\r\n        try {\r\n          document.execCommand(\"copy\");\r\n          wstShowMessage(\"success\", \"Result copied successfully.\");\r\n        } catch (e) {\r\n          wstShowMessage(\"error\", \"Unable to copy result. Please try again.\");\r\n        }\r\n\r\n        document.body.removeChild(textarea);\r\n      }\r\n\r\n      function wstClearResult() {\r\n        currentResult = null;\r\n        currentUrl = \"\";\r\n        wstEl(\"wst-results\").style.display = \"none\";\r\n        wstEl(\"wst-url-input\").value = \"\";\r\n        wstHideMessage();\r\n        wstShowMessage(\"info\", \"Result cleared successfully.\");\r\n      }\r\n\r\n      function wstClearHistory() {\r\n        if (!confirm(\"Are you sure you want to clear all test history?\")) {\r\n          return;\r\n        }\r\n\r\n        localStorage.removeItem(WST_HISTORY_KEY);\r\n        wstRenderHistory();\r\n        wstShowMessage(\"info\", \"Test history cleared successfully.\");\r\n      }\r\n\r\n      wstEl(\"wst-speed-form\").addEventListener(\"submit\", function (event) {\r\n        event.preventDefault();\r\n\r\n        var url = wstNormalizeUrl(wstEl(\"wst-url-input\").value);\r\n\r\n        if (!url) {\r\n          wstShowMessage(\"error\", \"Please enter a website URL.\");\r\n          return;\r\n        }\r\n\r\n        if (!wstIsValidUrl(url)) {\r\n          wstShowMessage(\"error\", \"Please enter a valid website URL.\");\r\n          return;\r\n        }\r\n\r\n        wstEl(\"wst-url-input\").value = url;\r\n        wstRunSpeedTest(url);\r\n      });\r\n\r\n      wstEl(\"wst-retest-btn\").addEventListener(\"click\", function () {\r\n        var url = currentUrl || wstNormalizeUrl(wstEl(\"wst-url-input\").value);\r\n\r\n        if (!url || !wstIsValidUrl(url)) {\r\n          wstShowMessage(\"error\", \"Please enter a valid website URL.\");\r\n          return;\r\n        }\r\n\r\n        wstRunSpeedTest(url);\r\n      });\r\n\r\n      wstEl(\"wst-copy-btn\").addEventListener(\"click\", wstCopyResult);\r\n      wstEl(\"wst-clear-result-btn\").addEventListener(\"click\", wstClearResult);\r\n      wstEl(\"wst-clear-history-btn\").addEventListener(\"click\", wstClearHistory);\r\n\r\n      wstEl(\"wst-history-list\").addEventListener(\"click\", function (event) {\r\n        var url = event.target.getAttribute(\"data-url\");\r\n\r\n        if (url) {\r\n          wstEl(\"wst-url-input\").value = url;\r\n          wstRunSpeedTest(url);\r\n        }\r\n      });\r\n\r\n      wstRenderHistory();\r\n    })();\r\n  <\/script>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Website Speed Test Tool Test the basic loading speed of any website using a lightweight browser-based tool. Enter a website URL and get loading time, speed status, estimated score, and practical optimization recommendations. \ud83d\udd12 This HTML tool works in your browser and stores recent history locally only. Website URL Example: example.com, https:\/\/mywebsite.com, https:\/\/businesssite.in Test Website [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-661","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/vikassrivastava.in\/academy\/wp-json\/wp\/v2\/pages\/661","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vikassrivastava.in\/academy\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vikassrivastava.in\/academy\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vikassrivastava.in\/academy\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vikassrivastava.in\/academy\/wp-json\/wp\/v2\/comments?post=661"}],"version-history":[{"count":5,"href":"https:\/\/vikassrivastava.in\/academy\/wp-json\/wp\/v2\/pages\/661\/revisions"}],"predecessor-version":[{"id":667,"href":"https:\/\/vikassrivastava.in\/academy\/wp-json\/wp\/v2\/pages\/661\/revisions\/667"}],"wp:attachment":[{"href":"https:\/\/vikassrivastava.in\/academy\/wp-json\/wp\/v2\/media?parent=661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}