From e7af1a966d0c4517616d53d2d162e54bf8535959 Mon Sep 17 00:00:00 2001
From: Miki <miki@amazon.com>
Date: Thu, 11 Apr 2024 23:18:55 -0700
Subject: [PATCH] Update link-checker and clean up ignore-list

Signed-off-by: Miki <miki@amazon.com>
---
 .github/workflows/links_checker.yml           |  16 +--
 .lycheeexclude                                | 129 ------------------
 .lycheeignore                                 |  88 ++++++++++++
 CHANGELOG.md                                  |   1 +
 test/functional/services/common/browser.ts    |  43 +++---
 .../web_element_wrapper.ts                    |  52 +++----
 6 files changed, 140 insertions(+), 189 deletions(-)
 delete mode 100644 .lycheeexclude
 create mode 100644 .lycheeignore

diff --git a/.github/workflows/links_checker.yml b/.github/workflows/links_checker.yml
index c02921d96f91..ce590fe53b28 100644
--- a/.github/workflows/links_checker.yml
+++ b/.github/workflows/links_checker.yml
@@ -11,21 +11,13 @@ on:
 
 jobs:
   linkchecker:
-
     runs-on: ubuntu-latest
-
     steps:
-    - uses: actions/checkout@v2
-    - name: Load Excludes
-      run: |
-        LYCHEE_EXCLUDE=$(sed -e :a  -e 'N;s/\n/ --exclude /;ta' .lycheeexclude)
-        echo "LYCHEE_EXCLUDE=$LYCHEE_EXCLUDE" >> $GITHUB_ENV
+    - uses: actions/checkout@v4
     - name: Lychee Link Checker
-      id: lychee
-      uses: lycheeverse/lychee-action@v1.0.9
+      uses: lycheeverse/lychee-action@v1
       with:
-        args: --accept=200,403,429 --exclude ${{ env.LYCHEE_EXCLUDE }} --exclude-mail "**/*.html" "**/*.md" "**/*.txt" "**/*.json" "**/*.js" "**/*.ts" "**/*.tsx"
+        fail: true
+        args: --accept=200,403,429 --base . "**/*.html" "**/*.md" "**/*.txt" "**/*.json" "**/*.js" "**/*.ts" "**/*.tsx"
       env:
         GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
-    - name: Fail if there were link errors
-      run: exit ${{ steps.lychee.outputs.exit_code }}
\ No newline at end of file
diff --git a/.lycheeexclude b/.lycheeexclude
deleted file mode 100644
index e8e86359b462..000000000000
--- a/.lycheeexclude
+++ /dev/null
@@ -1,129 +0,0 @@
-# Copyright OpenSearch Contributors
-# SPDX-License-Identifier: Apache-2.0
-
-# Local or predefined end points
-http://localhost
-https://localhost
-http://127.0.0.1/
-https://127.0.0.1/
-http://127.0.0.1:10002/bar
-http://127.0.0.1:10002/
-http://opensearch
-https://opensearch
-https://opensearch-dashboards
-http://opensearch-dashboards
-https://opensearch.internal.org/
-https://maps.search-services.aws.a2z.com/
-https://tiles.maps.search-services.aws.a2z.com/
-https://telemetry.opensearch.org/
-https://telemetry-staging.opensearch.org/
-https://api.github.com/repos/opensearch-project/OpenSearch-Dashboards/
-https://www.quandl.com/api/v1/datasets/
-file:///*
-git://*
-
-# Dummy urls in tests
-http://domain.
-http://www.domain.
-http://somehost
-https://somehost
-http://some.host
-https://some-host.com/
-https://other.some-host.com/
-http://test:user@somehost/
-https://some.another.host/
-http://noone.nowhere.none/
-http://bar
-http://foo
-http://test.com/
-https://test.com/
-https://manifest.foobar
-https://files.foobar/
-https://tiles.foobar/
-https://1.1.1.1:9200/
-http://192.168.1.1:1234/
-http://9.8.7.6/
-http://1.2.3.4/
-http://8.8.8.8/
-https://path.to/
-https://example.com/
-http://example.com/
-https://example.org/
-http://some-url/
-http://buildurl/
-https://dryrun/
-https://url/
-http://url/
-http://notfound.svg/
-https://validurl/
-https://myopensearch-dashboardsdomain.com
-http://myopensearch-dashboardsdomain.com
-https://other-opensearch-dashboards.external:8080/
-http://myotherdomain.com:5601/
-http://myopensearch-dashboardsdomain.com:5601/
-https://your-cdn-host.com/
-http://not-your-opensearch-dashboards.com/
-http://www.mysite.com/
-http://myserver.mydomain.com:5601/
-https://myexternaldep.com/
-http://notlocalhost/
-http://site.com/
-http://node-b/
-http://node-a:9200/
-https://node-c/
-https://elsewhere
-https://opensearch:changeme@example.com:9200
-http://test:user@somehost/
-https://mycloudinstance:9200/
-https://dev-url.co/
-https://extenal.org/_search
-http://plugins.example.com/
-https://build-url/
-http://test.com/
-https://path.to/
-http://site.com/
-http://not-your-opensearch-dashboards.com/
-http://evil.com/
-https://opensearch.org/cool/path
-https://opensearch.org/redirect
-http://www.opensearch.org/painlessDocs
-https://www.hostedgraphite.com/
-https://connectionurl.com
-http://169.254.169.254/latest/meta-data/
-http://company.net/*
-http://fakenews.co/opensearch-dashboards-test/v6.8.2.json
-
-# External urls
-https://www.zeek.org/
-http://google.com/
-https://api.worldbank.org/
-https://vega.github.io/
-http://twitter.com/
-https://twitter.com/
-https://storage.googleapis.com/
-http://tools.ietf.org/
-https://github.com/
-http://github.com/
-http://jsperf
-https://jsperf
-https://gist.githubusercontent.com/
-https://codeload.github.com/gist/
-https://nodejs.org/
-https://www.npmjs.com/
-https://microsoft.github.io/
-http://api.worldbank.org/
-https://f1542b814f674090afd914960583265f.apm.us-central1.gcp.cloud.es.io/
-http://www.matthewcopeland.me/
-http://threedubmedia.googlecode.com/*
-https://developer.mozilla.org/
-https://a.tile.openstreetmap.org/
-http://www.creedthoughts.gov
-https://media-for-the-masses.theacademyofperformingartsandscience.org/
-https://yarnpkg.com/latest.msi
-https://forum.opensearch.org/
-https://facebook.github.io/jest/*
-http://helpmenow.com/problem2
-https://sass-lang.com/*
-http://api.jquery.com/*
-http://brandonaaron.net
-https://www.circl.lu/doc/misp/
diff --git a/.lycheeignore b/.lycheeignore
new file mode 100644
index 000000000000..f60f7cba87e3
--- /dev/null
+++ b/.lycheeignore
@@ -0,0 +1,88 @@
+# Copyright OpenSearch Contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# Local or predefined end points
+localhost
+//opensearch
+//telemetry.*\.opensearch\.org/
+https://api.github.com/repos/opensearch-project/OpenSearch-Dashboards/
+file:///*
+git://*
+
+# Dummy urls in tests and examples
+//(www\.)?domain
+//foo
+//bar
+//test
+//notfound
+//asdf
+//elsewhere
+//build-?url
+//dev-url
+//some-url
+//validurl
+//path\.to/
+//evil\.com/
+//dryrun/
+//codeload/
+//user/
+//www/
+//url/
+some.*host
+//node-.(:\d+)?/
+//company\.net/
+//noone\.nowhere\.none
+\.foobar/
+opensearch\.org/painlessDocs
+//myexternaldep\.com
+//extenal\.org
+//mycloudinstance
+mysite\.com
+//fakeendpoint
+https://ci.opensearch.org/ci/dbc/distribution-build-opensearch-dashboards/
+https://artifacts-api.opensearch.org/
+https://on.cypress.io/
+//\d+\.\d+\.\d+\.\d+(:\d+)?/
+\.external:
+//myopensearch-dashboardsdomain\.com
+https://build.ci.opensearch.org/job/integ-test-opensearch-dashboards/
+http://www.creedthoughts.gov
+//feeds(-staging)?\.opensearch\.org/
+http://not-your-opensearch-dashboards.com/
+my(other)?domain\.com
+
+
+
+# External urls
+https://connectionurl.com/
+https://www.hostedgraphite.com/
+http://google.com/
+https://api.worldbank.org/
+https://vega.github.io/
+//twitter.com/
+https://storage.googleapis.com/
+http://tools.ietf.org/
+//github.com/
+//jsperf
+https://nodejs.org/
+https://mirrors.nodejs.org/
+https://www.npmjs.com/
+https://microsoft.github.io/
+http://api.worldbank.org/
+https://f1542b814f674090afd914960583265f.apm.us-central1.gcp.cloud.es.io/
+http://threedubmedia.googlecode.com/
+https://developer.mozilla.org/
+https://a.tile.openstreetmap.org/
+https://media-for-the-masses.theacademyofperformingartsandscience.org/
+https://forum.opensearch.org/
+http://api.jquery.com/
+http://brandonaaron.net/
+https://oss-dependencies.opensearch.org/
+https://tiles.maps.opensearch.org/
+https://playground.opensearch.org/
+http://threedubmedia.com/
+https://gist.githubusercontent.com/
+https://your-cdn-host.com/
+https://unpkg.com/@elastic/
+https://codeload.github.com/
+https://www.quandl.com/api/v1/datasets/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c47868108004..401de104ecf1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -121,6 +121,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 - Re-enable CI workflows for feature branches ([#2908](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2908))
 - [Tests] Add Github workflow for Test Orchestrator in FT Repo to run cypress tests within Dashboards repo ([#5725](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/5725))
 - Upgrade yarn version to be compatible with @opensearch-project/opensearch ([#3443](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/3443))
+- Update link-checker and clean up ignore-list ([#6425](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6425))
 
 ### đź“ť Documentation
 
diff --git a/test/functional/services/common/browser.ts b/test/functional/services/common/browser.ts
index 6a49ae0a67ad..48e1f12e02da 100644
--- a/test/functional/services/common/browser.ts
+++ b/test/functional/services/common/browser.ts
@@ -70,7 +70,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Returns instance of Actions API based on driver w3c flag
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#actions
+     * https://www.selenium.dev/documentation/webdriver/actions_api/
      */
     public getActions() {
       return driver.actions();
@@ -89,8 +89,8 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
     }
 
     /**
-     * Retrieves the a rect describing the current top-level window's size and position.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_Window.html
+     * Retrieves the rect describing the current top-level window's size and position.
+     * https://www.selenium.dev/documentation/webdriver/interactions/windows/#get-window-size
      *
      * @return {Promise<{height: number, width: number, x: number, y: number}>}
      */
@@ -100,7 +100,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Sets the dimensions of a window.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_Window.html
+     * https://www.selenium.dev/documentation/webdriver/interactions/windows/#set-window-size
      *
      * @param {number} width
      * @param {number} height
@@ -166,7 +166,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Gets the URL that is loaded in the focused window/frame.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#getCurrentUrl
+     * https://www.selenium.dev/documentation/webdriver/interactions/#get-current-url
      *
      * @return {Promise<string>}
      */
@@ -182,7 +182,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Gets the page/document title of the focused window/frame.
-     * https://www.selenium.dev/selenium/docs/api/javascript/module/selenium-webdriver/chrome_exports_Driver.html#getTitle
+     * https://www.selenium.dev/documentation/webdriver/interactions/#get-title
      */
     public async getTitle() {
       return await driver.getTitle();
@@ -190,7 +190,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Navigates the focused window/frame to a new URL.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/chrome_exports_Driver.html#get
+     * https://www.selenium.dev/documentation/webdriver/interactions/navigation/#navigate-to
      *
      * @param {string} url
      * @param {boolean} insertTimestamp Optional
@@ -211,7 +211,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
     /**
      * Moves the remote environment’s mouse cursor to the specified point {x, y} which is
      * offset to browser page top left corner.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#move
+     * https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#offset-from-viewport
      *
      * @param {x: number, y: number} point on browser page
      * @return {Promise<void>}
@@ -223,7 +223,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Does a drag-and-drop action from one point to another
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#dragAndDrop
+     * https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#drag-and-drop-by-offset
      *
      * @param {{element: WebElementWrapper | {x: number, y: number}, offset: {x: number, y: number}}} from
      * @param {{element: WebElementWrapper | {x: number, y: number}, offset: {x: number, y: number}}} to
@@ -251,7 +251,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Reloads the current browser window/frame.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_Navigation.html#refresh
+     * https://www.selenium.dev/documentation/webdriver/interactions/navigation/#refresh
      *
      * @return {Promise<void>}
      */
@@ -261,7 +261,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Navigates the focused window/frame back one page using the browser’s navigation history.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_Navigation.html#back
+     * https://www.selenium.dev/documentation/webdriver/interactions/navigation/#back
      *
      * @return {Promise<void>}
      */
@@ -271,7 +271,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Moves forwards in the browser history.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_Navigation.html#forward
+     * https://www.selenium.dev/documentation/webdriver/interactions/navigation/#forward
      *
      * @return {Promise<void>}
      */
@@ -281,7 +281,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Navigates to a URL via the browser history.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_Navigation.html#to
+     * https://www.selenium.dev/documentation/webdriver/interactions/navigation/#navigate-to
      *
      * @return {Promise<void>}
      */
@@ -291,7 +291,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Sends a sequance of keyboard keys. For each key, this will record a pair of keyDown and keyUp actions
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#sendKeys
+     * https://www.selenium.dev/documentation/webdriver/actions_api/keyboard/#send-keys
      *
      * @param  {string|string[]} keys
      * @return {Promise<void>}
@@ -307,7 +307,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
      * Moves the remote environment’s mouse cursor to the specified point {x, y} which is
      * offset to browser page top left corner.
      * Then adds an action for left-click (down/up) with the mouse.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#click
+     * https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#click-and-release
      *
      * @param {x: number, y: number} point on browser page
      * @return {Promise<void>}
@@ -323,7 +323,6 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
     /**
      * Gets the HTML loaded in the focused window/frame. This markup is serialised by the remote
      * environment so may not exactly match the HTML provided by the Web server.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#getPageSource
      *
      * @return {Promise<string>}
      */
@@ -333,7 +332,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Gets a screenshot of the focused window and returns it as a base-64 encoded PNG
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#takeScreenshot
+     * https://www.selenium.dev/documentation/webdriver/interactions/windows/#takescreenshot
      *
      * @return {Promise<Buffer>}
      */
@@ -343,7 +342,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Inserts action for performing a double left-click with the mouse.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#doubleClick
+     * https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#double-click
      * @param {WebElementWrapper} element
      * @return {Promise<void>}
      */
@@ -354,7 +353,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
     /**
      * Changes the focus of all future commands to another window. Windows may be specified
      * by their window.name attributeor by its handle (as returned by WebDriver#getWindowHandles).
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_TargetLocator.html
+     * https://www.selenium.dev/documentation/webdriver/interactions/windows/#switching-windows-or-tabs
      *
      * @param {string} handle
      * @return {Promise<void>}
@@ -365,7 +364,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Gets a list of identifiers for all currently open windows.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#getAllWindowHandles
+     * https://www.selenium.dev/documentation/webdriver/interactions/windows/#switching-windows-or-tabs
      *
      * @return {Promise<string[]>}
      */
@@ -414,7 +413,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
     /**
      * Closes the currently focused window. In most environments, after the window has been
      * closed, it is necessary to explicitly switch to whatever window is now focused.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#close
+     * https://www.selenium.dev/documentation/webdriver/interactions/windows/#closing-a-window-or-tab
      *
      * @return {Promise<void>}
      */
@@ -424,7 +423,7 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
 
     /**
      * Executes JavaScript code within the focused window/frame. The code should return a value synchronously.
-     * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#executeScript
+     * https://www.selenium.dev/documentation/webdriver/interactions/windows/#execute-script
      *
      * @param  {string|function} fn
      * @param  {...any[]} args
diff --git a/test/functional/services/lib/web_element_wrapper/web_element_wrapper.ts b/test/functional/services/lib/web_element_wrapper/web_element_wrapper.ts
index fa273b318a24..8a2515d413b0 100644
--- a/test/functional/services/lib/web_element_wrapper/web_element_wrapper.ts
+++ b/test/functional/services/lib/web_element_wrapper/web_element_wrapper.ts
@@ -165,7 +165,7 @@ export class WebElementWrapper {
    *  - Elements with opacity: 0
    *  - Elements with no offsetWidth or offsetHeight
    *
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#isDisplayed
+   * https://www.selenium.dev/documentation/webdriver/elements/information/#is-displayed
    *
    * @return {Promise<boolean>}
    */
@@ -177,7 +177,7 @@ export class WebElementWrapper {
 
   /**
    * Tests whether this element is enabled, as dictated by the disabled attribute.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#isEnabled
+   * https://www.selenium.dev/documentation/webdriver/elements/information/#is-enabled
    *
    * @return {Promise<boolean>}
    */
@@ -189,7 +189,7 @@ export class WebElementWrapper {
 
   /**
    * Tests whether this element is selected.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#isSelected
+   * https://www.selenium.dev/documentation/webdriver/elements/information/#is-selected
    *
    * @return {Promise<boolean>}
    */
@@ -201,7 +201,7 @@ export class WebElementWrapper {
 
   /**
    * Clicks on this element.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#click
+   * https://www.selenium.dev/documentation/webdriver/elements/interactions/#click
    *
    * @return {Promise<void>}
    */
@@ -238,7 +238,7 @@ export class WebElementWrapper {
   /**
    * Clear the value of this element. This command has no effect if the underlying DOM element
    * is neither a text INPUT element nor a TEXTAREA element.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#clear
+   * https://www.selenium.dev/documentation/webdriver/elements/interactions/#clear
    *
    * @param {{ withJS: boolean }} options option to clear input with JS: `arguments[0].value=''`
    * @default { withJS: false }
@@ -292,7 +292,7 @@ export class WebElementWrapper {
    * The input.Key.NULL key is encountered in the sequence. When this key is encountered, all
    * modifier keys current in the down state are released (with accompanying keyup events). The NULL
    * key can be used to simulate common keyboard shortcuts.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#sendKeys
+   * https://www.selenium.dev/documentation/webdriver/elements/interactions/#send-keys
    *
    * @param {string|string[]} value
    * @param {charByChar: boolean} options
@@ -315,7 +315,7 @@ export class WebElementWrapper {
 
   /**
    * Sends keyboard event into the element.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#sendKeys
+   * https://www.selenium.dev/documentation/webdriver/elements/interactions/#send-keys
    *
    * @param  {string|string[]} keys
    * @return {Promise<void>}
@@ -340,7 +340,7 @@ export class WebElementWrapper {
    * case the value of the property with the same name is returned. If neither value is set, null
    * is returned (for example, the "value" property of a textarea element). The "style" attribute
    * is converted as best can be to a text representation with a trailing semi-colon.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#getAttribute
+   * https://www.selenium.dev/documentation/webdriver/elements/information/#fetching-attributes-or-properties
    *
    * @param {string} name
    */
@@ -354,7 +354,7 @@ export class WebElementWrapper {
    * Retrieves the value of a computed style property for this instance. If the element inherits
    * the named style from its parent, the parent will be queried for its value. Where possible,
    * color values will be converted to their hex representation (e.g. #00ff00 instead of rgb(0, 255, 0)).
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#getCssValue
+   * https://www.selenium.dev/documentation/webdriver/elements/information/#get-css-value
    *
    * @param {string} propertyName
    * @return {Promise<string>}
@@ -368,7 +368,7 @@ export class WebElementWrapper {
   /**
    * Get the visible (i.e. not hidden by CSS) innerText of this element, including sub-elements,
    * without any leading or trailing whitespace.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#getText
+   * https://www.selenium.dev/documentation/webdriver/elements/information/#text-content
    *
    * @return {Promise<string>}
    */
@@ -380,7 +380,7 @@ export class WebElementWrapper {
 
   /**
    * Retrieves the element's tag name.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#getTagName
+   * https://www.selenium.dev/documentation/webdriver/elements/information/#tag-name
    *
    * @return {Promise<string>}
    */
@@ -395,7 +395,7 @@ export class WebElementWrapper {
   /**
    * Returns an object describing an element's location, in pixels relative to the document element,
    * and the element's size in pixels.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#getRect
+   * https://www.selenium.dev/documentation/webdriver/elements/information/#size-and-position
    *
    * @return {Promise<{height: number, width: number, x: number, y: number}>}
    */
@@ -408,7 +408,7 @@ export class WebElementWrapper {
   /**
    * Returns an object describing an element's location, in pixels relative to the document element,
    * and the element's size in pixels.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#getRect
+   * https://www.selenium.dev/documentation/webdriver/elements/information/#size-and-position
    *
    * @return {Promise<{height: number, width: number, x: number, y: number}>}
    */
@@ -420,7 +420,7 @@ export class WebElementWrapper {
 
   /**
    * Moves the remote environment’s mouse cursor to the current element with optional offset
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#move
+   * https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#move-by-offset
    * @param { xOffset: 0, yOffset: 0 } options
    * @return {Promise<void>}
    */
@@ -438,7 +438,7 @@ export class WebElementWrapper {
   /**
    * Inserts an action for moving the mouse to element center, unless optional offset is provided.
    * Then adds an action for left-click (down/up) with the mouse.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#click
+   * https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#click-and-release
    *
    * @param { xOffset: 0, yOffset: 0 } options Optional
    * @return {Promise<void>}
@@ -457,7 +457,7 @@ export class WebElementWrapper {
 
   /**
    * Inserts action for performing a double left-click with the mouse.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#doubleClick
+   * https://www.selenium.dev/documentation/webdriver/actions_api/mouse/#double-click
    * @param {WebElementWrapper} element
    * @return {Promise<void>}
    */
@@ -470,7 +470,7 @@ export class WebElementWrapper {
 
   /**
    * Gets the first element inside this element matching the given CSS selector.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#first-matching-element
    *
    * @param {string} selector
    * @return {Promise<WebElementWrapper>}
@@ -486,7 +486,7 @@ export class WebElementWrapper {
 
   /**
    * Gets all elements inside this element matching the given CSS selector.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#all-matching-elements
    *
    * @param {string} selector
    * @param {number} timeout
@@ -539,7 +539,7 @@ export class WebElementWrapper {
 
   /**
    * Gets the first element inside this element matching the given CSS class name.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#first-matching-element
    *
    * @param {string} className
    * @return {Promise<WebElementWrapper>}
@@ -555,7 +555,7 @@ export class WebElementWrapper {
 
   /**
    * Gets all elements inside this element matching the given CSS class name.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#all-matching-elements
    *
    * @param {string} className
    * @param {number} timeout
@@ -574,7 +574,7 @@ export class WebElementWrapper {
 
   /**
    * Gets the first element inside this element matching the given tag name.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#first-matching-element
    *
    * @param {string} tagName
    * @return {Promise<WebElementWrapper>}
@@ -594,7 +594,7 @@ export class WebElementWrapper {
 
   /**
    * Gets all elements inside this element matching the given tag name.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#all-matching-elements
    *
    * @param {string} tagName
    * @param {number} timeout
@@ -621,7 +621,7 @@ export class WebElementWrapper {
 
   /**
    * Gets the first element inside this element matching the given XPath selector.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#first-matching-element
    *
    * @param {string} selector
    * @return {Promise<WebElementWrapper>}
@@ -637,7 +637,7 @@ export class WebElementWrapper {
 
   /**
    * Gets all elements inside this element matching the given XPath selector.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#all-matching-elements
    *
    * @param {string} selector
    * @param {number} timeout
@@ -656,7 +656,7 @@ export class WebElementWrapper {
 
   /**
    * Gets the first element inside this element matching the given partial link text.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#first-matching-element
    *
    * @param {string} linkText
    * @return {Promise<WebElementWrapper[]>}
@@ -672,7 +672,7 @@ export class WebElementWrapper {
 
   /**
    * Gets all elements inside this element matching the given partial link text.
-   * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElement.html#findElement
+   * https://www.selenium.dev/documentation/webdriver/elements/finders/#all-matching-elements
    *
    * @param {string} linkText
    * @param {number} timeout