Browser-Script

Sie können Skripte auf Basis von Node.js und APIs auf Basis von Selenium verwenden, um das Testen von Instana im Browser zu ermöglichen. Mithilfe vordefinierter globaler Variablen und der Browser-Test-APIs von Instana können Sie ein Browser-Skripttest erstellen und ausführen, das die Benutzerinteraktion in einem Webbrowser simuliert.

Instana Verweise auf Browser-Skripte

Um einen Browser-Script-Test zum Aktivieren von Browsertests zu erstellen, benötigen Sie globale Variablen und Module.

Globale Variablen

Die in der Tabelle aufgeführten vordefinierten globalen Variablen beschleunigen die Scriptentwicklung.

Name Typ Details zu
$driver @types/selenium-webdriver Typdefinitionen für Selenium WebDriverJS.
$browser ThenableWebDriver Aktiviert den Wrapper eines WebDriver -Clients, der die Steuerung über einen Browser ermöglicht und den direkten Aufruf von WebDriver -Methoden unter Promise<WebDriver> ohne Aufruf von thenermöglicht
$secure Dict<string> Variable für den Zugriff auf Benutzerberechtigungsnachweise.
$util UserUtil Dienstprogrammfunktionen wie $util.secrets.
$network Network Netzdienstprogramm zum Einrichten des Proxys.
$synthetic Dict<string> Umgebungsvariablen.
$attributes UserInsight Variable zum Hinzufügen und Bearbeiten angepasster Attribute.

Die Verwendung und Deklaration der vordefinierten globalen Variablen lauten wie folgt:

$synthetisch

Mit $synthetic.var_name können Sie auf Umgebungs-und Laufzeitvariablen im Script zugreifen. Einige vordefinierte Variablen lauten wie folgt:

  • $synthetic.LOCATION oder $synthetic.pop : Wird verwendet, um auf das Positionslabel zuzugreifen, das den ersten Teil der controller.location Variablen bildet.
  • $synthetic.TEST_ID oder $synthetic.id : Dient zum Abrufen der Kennung des ausgeführten synthetischen Tests.
  • $synthetic.TEST_NAME oder $synthetic.testName : Dient zum Aufrufen der Testbezeichnung des ausgeführten synthetischen Tests.
  • $synthetic.TIME_ZONE oder $synthetic.timeZone : Wird verwendet, um auf die Zeitzone des „ PoP “ zuzugreifen, auf dem der synthetische Test ausgeführt wird.
  • $synthetic.JOB_ID oder $synthetic.taskId : Dient zum Abrufen der Kennung eines Wiedergabeauftrags oder einer Wiedergabetätigkeit und ist gleichzeitig die Ergebnis-ID.
  • $synthetic.testType : Dient zum Aufrufen des Testtyps.
  • $synthetic.description : Zum Aufrufen der Testbeschreibung.
  • $synthetic.labels.xxx : Dient zum Zugriff auf die benutzerdefinierten Eigenschaften, die im customProperties Abschnitt der Testdefinition definiert sind.

Sie können auch benutzerdefinierte Umgebungsvariablen in der values.yaml Datei des Diagramms „ helm “ festlegen. Sehen Sie sich das folgende Beispiel an:

controller:
  customProperties: "tag1=value1;tag2=value2"
 

Für den Zugriff auf diese angepassten Variablen verwenden Sie $synthetic.tag1 und $synthetic.tag2 im Script.

Verwenden Sie für den Zugriff auf die angepassten Eigenschaften, die im Abschnitt customProperties der Testdefinition definiert sind, und den Eigenschaftswert im Script $synthetic.labels.xxx. Sehen Sie sich das folgende Beispiel an:

// to print test custom property defined in customProperties of test definition
console.info('Test custom property -> Team: ' + $synthetic.labels.Team);
console.info('Test custom property -> Purpose: ' + $synthetic.labels.Purpose);
 

$secure

Das Browser-Skript „ Instana “ unterstützt die Speicherung von Benutzerdaten wie Benutzername und Passwort, um vertrauliche Informationen sicher zu verwahren. Sie können $secure.MY_SECURE_CREDENTIAL verwenden, um auf vordefinierte sichere Berechtigungsnachweise in Ihrem Script zu verweisen.

Um eine Anmeldeinformation mit dem Synthetic Open- API zu erstellen, führen Sie die folgenden Schritte aus:

  1. Stellen Sie sicher, dass Sie über die erforderlichen Berechtigungen verfügen.
  2. Verwenden Sie „Synthetic OpenAPI “ oder den Befehl „synctl“, um eine Anmeldeinformation zu erstellen, indem Sie die Variablen credentialNamecredentialValue und übergeben.

Verwenden Sie anschließend in Ihrem Browser-Skript $secure.credentialName , um auf den erstellten Berechtigungsnachweis zu verweisen, z. B. $secure.password oder $secure.username.

Hinweis: Es wird nur das $secure.credentialName Format unterstützt. Das $secure[credentialName] Format wird nicht unterstützt.
Hinweis: Verweise auf sichere Anmeldedaten ($secure.credentialName) werden vor der Skriptausführung aufgelöst. Sie müssen den Namen der Anmeldeinformationen direkt angeben. Erstellen Sie die Referenz nicht dynamisch mithilfe von Variablen, Zeichenfolgenverkettung oder eval(), da diese Methoden nicht unterstützt werden und nicht ausgewertet werden.

$attributes

Sie können die Variable $attributes verwenden, um Überwachungsdaten angepasste Attribute hinzuzufügen oder abzurufen. Diese angepassten Attribute werden auch in den Überwachungsergebnissen zusammen mit den anderen Standardüberwachungsergebnisattributen gespeichert.

Instana Die synthetische Überwachung unterstützt die folgenden APIs zur Konfiguration benutzerdefinierter Attribute:

  • $attributes.set(key, value): Legt den Schlüssel oder Wert fest.
  • $attributes.get(key): Gibt den Wert für den angegebenen Schlüssel zurück
  • $attributes.getKeys(): Gibt ein Array aller Schlüssel zurück.
  • $attributes.has(key): Gibt true zurück, wenn der Schlüssel vorhanden ist.
  • $attributes.unset(key): Entfernt den angegebenen Schlüssel oder Wert.
  • $attributes.unsetAll(): Entfernt alle angepassten Daten.

Das folgende Beispiel zeigt die Funktion $attributes „ API “:

$attributes.set(xxx, yyy) // sets tag xxx to value yyy
let v = $attributes.get(xxx) // sets variable v to the value of tag xxx
 
Hinweis: Auf die benutzerdefinierten Attribute, die im Skript unter „ $attributesAPI “ festgelegt wurden, sowie auf die benutzerdefinierten Eigenschaften, die customProperties im Abschnitt der Testdefinition definiert wurden, kann in den Testergebnissen über synthetic.tags die Metrik zugegriffen werden. Sie können die synthetic.tags Metrik verwenden, um die Testergebnisse zu filtern, oder einen benutzerdefinierten Wert an die benutzerdefinierte Nutzlast von Smart Alert übergeben.

$network

Die folgenden APIs werden in der synthetischen Überwachung von „ Instana “ zur Konfiguration von Proxy-Servern unterstützt:

  • $network.setProxy(string proxy): Legt einen Proxy-Server fest, der für alle Anfragen verwendet werden soll ( HTTP, HTTPS ).
  • $network.setProxyForHttp(string proxy): Legt einen Proxy-Server fest, der ausschließlich für HTTP -Anfragen verwendet wird.
  • $network.setProxyForHttps(string proxy): Legt einen Proxy-Server fest, der nur für HTTPS-Anforderungen verwendet werden soll
  • $network.setProxyPAC(string pac, object auth): Legt einen Proxy-Server über ein PAC-Script (Proxy Auto-Config) fest.
  • $network.setProxyAdvanced(object proxy): Legt die Proxy-Konfiguration unter Verwendung des von der Chrome-Erweiterung „ Firefox “ ( API ) unterstützten Formats für die Proxy-Einrichtung fest.
  • $network.clearProxy(): Entfernt die Proxy-Konfiguration.
  • $network.getProxy(): Gibt die Proxy-Konfiguration zurück.

$util.secrets

Sie können die $util.secrets Sicherheits API verwenden, um sensible Daten zu schwärzen.

Hinweis: Bevor Sie die Protokolldateien protokollieren und an das Backend senden, maskieren Sie alle bekannten sensiblen Informationen mit dem Sternchen (*)-Zeichen.

Verwenden Sie den Befehl $util.secrets.setURLSecretsRegExps in Ihrem Script, um geheime Schlüssel über URLs neu zu bearbeiten. Sehen Sie sich das folgende Beispiel an:

// to redact 'key', 'password' and 'secret' query parameters in URL
$util.secrets.setURLSecretsRegExps([/key/i, /password/i, /secret/i]);
 

Nachdem Sie diese Funktion „ API “ aufgerufen haben, wird der Wert https://example.com/accounts/status?key=mykey123&secret=mysecret „ URL “ erfasst und in der https://example.com/accounts/status?key=*&secret=* Benutzeroberfläche von „ Instana “ angezeigt.

Instana Synthetic entfernt alle Request- und Response-Header, um die Übereinstimmung mit den aktuellen Designs von Instana zu gewährleisten.

Standardmäßig erfasst „ Instana “ bei der Nachverfolgung von „ HTTP “-Aufrufen keine „ HTTP “-Header, um die Übermittlung sensibler Daten zu vermeiden.

Referenzen zum Browser-Test- API

Browsertests unterstützen Selenium-basierte APIs und mehr als 30 weitere erweiterte Browsertest-APIs. Weitere Informationen finden Sie unter „ API -Referenz “.

Ein Browser-Skript-Test schreiben

Sie können einen Browser-Script-Test für die folgenden Aktionen schreiben, um Browsertests zu aktivieren: Die Beispielcodes veranschaulichen, wie ein Browser-Script-Test mit häufig verwendeten APIs geschrieben wird. Weitere Informationen zum vollständigen Beispielcode finden Sie im Abschnitt Scriptbeispiele .

Grundlegende Maßnahmen umsetzen

Die folgenden Beispielcodes zeigen, wie ein Browser-Script-Test zum Implementieren der folgenden Basisaktionen geschrieben wird:

  • Header vorbereiten: Verwenden Sie den folgenden Befehl, um Anforderungsheader anzupassen, bevor Sie auf Websites zugreifen:

    await $browser.addHeader("test", "test");
    await $browser.addHeaders({ "test1": "test1", "test2": "test2" });
    await $browser.deleteHeaders(["test1", "test2"]);
    $browser.getHeaders().forEach((value, key) => console.log(">>>>>>>>>>>>>>>>>>>", "User customized headers: ", key + "=" + value));
     
  • Zugriff steuern: Verwenden Sie die folgenden Befehle, um den Zugriff mit der Liste "Verweigern" und "Zulassen" zu steuern:

    await $browser.addHostnamesToDenylist(["*google*", "*timeanddate*"]);
    await $browser.deleteHostnameFromDenylist("*timeanddate*");
    await $browser.get("https://www.google.com");
     

    Wenn Sie nach Ausführung dieser Befehle eine Google-Suche durchführen, wird die Meldung angezeigt wwww.google.com is blocked.

  • URL öffnen: Um URL im Browser zu öffnen und auf die Website zuzugreifen, verwenden Sie den folgenden Befehl:

    await $browser.get("http://www.bing.com");
     
  • Ruhezeit festlegen: Verwenden Sie den folgenden Befehl, um die Ruhezeit im Browser festzulegen. Der Parameter gibt die Inaktivitätszeit in Millisekunden an. Im folgenden Beispiel wird der Browser für 2 Sekunden inaktiviert.

    await $browser.sleep(2000);
     
  • Zusicherung mit Seitentitel verwenden: Die Zusicherung ist in Ihren Tests kritisch, um die Testergebnisse festzulegen Verwenden Sie den folgenden Code, um die Zusicherung mit Seitentitel oder Seitenquelle zu verwenden: Sie können die Bibliothek const assert = require("assert").strict; oder die Chai-Zusicherungsbibliothek const { assert } = require("chai");verwenden. Verwenden Sie console.log , um die Konsolenausgabe und die Konsolenprotokolldatei zu protokollieren.

    const { assert } = require("chai");
    
    await $browser.get("http://www.timeanddate.com");
    let page = await $browser.getPageSource();
    assert.isTrue(page.includes("<title>timeanddate.com</title>"));
    console.log(">>>>>>>>>>>>>>>>>>>", "Page title: ", await $browser.getTitle());
     
  • Sitzung abrufen: Verwenden Sie den folgenden Befehl, um Informationen zu einer Sitzung abzurufen:

    let session = await $browser.getSession();
    console.log(">>>>>>>>>>>>>>>>>>>", "Session id: ", session.getId());
     
  • Fenstergröße maximieren: Verwenden Sie den folgenden Befehl, um die Größe des Browserfensters zu maximieren:

    $browser.manage().window().maximize();
     
  • Screenshot erstellen: Verwenden Sie den folgenden Befehl, um den Screenshot des Browsers zu erstellen:

    await $browser.takeScreenshot();
     

Seitenelemente finden und mit ihnen interagieren

  • Warten Sie und suchen Sie ein Element auf der Seite: Sie können die Befehle in der folgenden Tabelle für bestimmte Suchen verwenden:

    Name verwenden
    $browser.waitForAndFindElement($driver.By.id("boxyear"), 1000) Element nach ID suchen, bis das Element sichtbar ist oder der Zeitlimitwert erreicht ist
    $browser.findElements($driver.By.css('select')) Mit dem CSS-Selektor nach mehreren Elementen auf der Seite suchen
    $browser.findElement($driver.By.linkText("About")) Element nach linkTextsuchen.
    $browser.findElement($driver.By.xpath('//input[@value='f']')) Element anhand von XPath suchen
    $browser.$('#boxyear') Element nach ID suchen.
    $browser.$$(".rd-box") Elemente nach Klasse suchen.
    elem.$('h2').$('a').getText() Element nach Elementname suchen.

    Der folgende Beispielcode zeigt, wie Sie warten und ein Element auf der Seite suchen:

    // Find element by XPath and wait for the element until specified timeout value reached
    await $browser.waitForAndFindElement($driver.By.xpath(`//textarea[@inputmode='search']`), 10000);
    
    // Find element by id
    let elem = await $browser.waitForAndFindElement($driver.By.id("boxyear"), 1000);
    assert.equal("2022", await elem.getAttribute("value"));
    assert.equal("2022", await $browser.$('#boxyear').getAttribute("value"));
    
    // Find elements by CSS selector
    let selects = await $browser.findElements($driver.By.css('select'));
    assert.equal(2, selects.length);
    
    // Find elements by class
    let elems = await $browser.$$(".rd-box");
    console.log(await elems[0].$('h2').$('a').getText());
     
  • Elemente suchen und Aktionen ausführen: Das folgende Beispiel zeigt, wie man ein Element anhand eines CSS-Selektors findet und Tastenbefehle mit ActionSequence sendet:

    <input id="sb_form_q" name="q" type="search">
     
    let textarea = await $browser.waitForAndFindElement($driver.By.css('#sb_form_q'), 10000);
    // Actions to send keys
    await $browser
      .actions()
      .move({ origin: textarea })
      .sendKeys("synthetic")
      .pause(5000)
      .sendKeys($driver.Key.ENTER)
      .perform();
     

Anwendungsbedingungen

  • Warten, bis -Titel kommt Bedingung: Verwenden Sie den folgenden Befehl, um zu warten, bis der Titel kommt Bedingung:

    await $browser.wait($driver.until.titleContains('Year 2022 Calendar'), 10000);
     
  • Bedingung 'Wait and poll until timeout': Verwenden Sie die folgenden Befehle, um die Bedingung 'wait and poll until timeout' anzuwenden:

    Hinweis: Das folgende Beispiel zeigt einen Aufruf einer Promise-Kette, der mit einer früheren Version kompatibel ist. Verwenden Sie den Code nicht in der aktuellen Version von „ JavaScript “. Verwenden Sie stattdessen modernen asynchronen JavaScript Code mit Async und Await.
    $browser.get("https://www.google.com");
    $browser.wait(function () {
      return $browser.getTitle().then(function (title) {return title.includes("Google");});
    }, 10000).then(function () {
      return $browser.findElement($driver.By.linkText("About")).click();
    }).then(function () {
      return $browser.navigate().back();
    });
     

Maus bewegen und Tastenanschläge senden

  • Mausklick: Verwenden Sie den folgenden Befehl, um die Maus zu bewegen:

    const element = await $browser.waitForAndFindElement(by, timeout);
    const out = $browser.actions().move({origin: element}).press().release().perform();
     
  • Maus bewegen: Verwenden Sie den folgenden Befehl, um die Maus über ein Browserelement zu bewegen:

    const element = await $browser.waitForAndFindElement(by, timeout);
    const out = $browser.actions().move({origin: element, duration: 2000}).perform();
     
  • Tasten senden: Verwenden Sie den folgenden Befehl, um Tasten zu senden:

    await $browser.actions().sendKeys("synthetic").perform();
     

Umgang mit Shadow-DOM-Elementen

Für den Zugriff auf DOM-Spiegelelemente können Sie die Funktion getShadowRoot() verwenden. Die neue Methode wird für das Diagramm 'Synthetic PoP Helm ' 1.1.1 oder höher unterstützt. Sie müssen ein Upgrade für Ihren synthetischen PoP -Version auf 1.1.1 oder höher durchführen, um die Unterstützung für die Schatten-DOM-Interaktion zu aktivieren.

let shadowHost = await $browser.waitForAndFindElement(shadowHostSelector, timeout);
let shadowRoot = await shadowHost.getShadowRoot();
let element = await shadowRoot.findElement(elementSelector);
console.log("element text is:", await element.getText(), ", id is:", await element.getId());
 

Proxy einrichten, um auf Websites zuzugreifen

  • Um einen Proxy für Anfragen an HTTP und HTTPS mithilfe der Variablen $network$browser oder einzurichten, verwenden Sie den folgenden Befehl. Sie können den Proxy mit string oder url.URLdefinieren.

    await $network.clearProxy();
    await $network.setProxyForHttp(proxyServer);
    website = await accessWebSite();
    checkHostname("www.google.com.hk", website)
    
    await $network.clearProxy();
    let testURL = new URL("http://" + sslProxyServer);
    await $network.setProxyForHttps(testURL);
    website = await accessWebSite();
    checkHostname("www.google.com", website);
     
  • Verwenden Sie den folgenden Befehl, um den Proxy für alle Anforderungen mit der Umgehungsliste zum Filtern festzulegen. Nach der Ausführung dieses Befehls im folgenden Beispiel ist kein Proxy für www.google.comverfügbar.

    await $network.clearProxy();
    await $network.setProxy(proxyServer, "www.google.com");
    console.log(">>>>>>>>>>>>>>>>>>>", "Bypass list: ", $network.getProxy().rules.bypassList);
    website = await accessWebSite();
    checkHostname("www.google.com.hk", website);
     

Geheimnisse schwärzen

Um sensible Daten in „ URL “ zu schwärzen, verwenden Sie den folgenden Befehl. Im folgenden Beispiel wird die „ URL “ als "url": "https://www.bing.com/?mkt=zh-CN&toHttps=1&redig=*"„.“ unkenntlich gemacht.

$util.secrets.setURLSecretsRegExps([/redig/i]);
console.log(">>>>>>>>>>>>>>>>>>>", "Access bing");
await $browser.get("http://cn.bing.com");
await $browser.wait($driver.until.titleContains('Bing'), 10000);
 

Module verwalten

Sie können Module anderer Anbieter, Kernmodule oder optionale Module in Ihr Browser-Testscript importieren.

Optionales Modul importieren

Das folgende Beispiel zeigt den Befehl zum Import des Zusicherungsmoduls chai:

var assert = require('chai').assert;
 

Unterstützte Kernmodule

Instana Die Browser-Tests unterstützen die Kernmodule von Node.js in Node.js v18 oder höher.

Hinweis: Um eine sicherere Laufzeitumgebung zu gewährleisten, werden bei Browser-Tests unter Instana einige integrierte Module oder APIs nicht unterstützt, darunter process, child_process, sowie fs Schreib- und Löschvorgänge. Wenn Sie diese APIs in Ihrem Testscript oder in gebündelten Scripts verwenden, schlägt Ihr Testergebnis möglicherweise mit der folgenden Fehlernachricht fehl. Verwenden Sie diese APIs daher nicht in Ihren Testscripts.
[SyntheticPoP] [ERROR] process.exit is not allowed. This API is blocked by playback engine.
 

Unterstützte Module von Drittanbietern

Instana Die synthetische Überwachung unterstützt die folgenden Module von Drittanbietern:

  • @aws-sdk/client-s3 3.626.0
  • atob 2.1.2
  • Authentifikator 1.1.5
  • basic-ftp 4.6.6
  • btoa 1.2.1
  • Chai 4.3.10
  • Farben 1.4.0
  • consoleplusplus 1.4.4
  • crypto-js 4.2.0
  • Faker 5.5.3
  • 11.8.6
  • joi 17.7.1
  • js-yaml 4.1.0
  • ldapauth-fork 5.0.2
  • lodash 4.17.21
  • Moment 2.29.4
  • net-snmp 3.6.3
  • Protokollpuffer 4.2.0
  • q 1.5.1
  • re2 1.18.3
  • ssh2-sftp-client 7.2.3
  • ssl-checker 2.0.7
  • textcodierung 0.7.0
  • Thrift 0.14.2
  • totp-generator 0.0.14
  • tough-Cookie 4.1.3
  • Unterstreichungszeichen 1.13.3
  • url-parse 1.5.10
  • urllib 2.41.0
  • UUID 3.4.0
  • Validator 13.7.0
  • ws 7.5.10
  • xml2js 0.5.0

Scriptbeispiele

Die folgenden Beispiele enthalten die meisten Browser-Test-APIs und vollständigen Beispielcode.

Diese Beispiele dienen nur zu Demonstrationszwecken. Die neuesten Beispiele findest du im öffentlichen Repository „ GitHub “.

Vollständiger Beispielcode für Aktionen

let click = async (message, by, timeout = 60000) => {
  console.log(`Click on ${message} >> ${by} << `);
  try {
    const element = await $browser.waitForAndFindElement(by, timeout);
    return $browser.actions().move({ origin: element }).click().perform();
  } catch (err) {
    console.error(`\ncatch(click): ${err.message}`);
    throw err;
  }
};

let hover = async (message, by, timeout = 60000) => {
  console.log(`Hover on ${message} >> ${by} << `);
  try {
    const element = await $browser.waitForAndFindElement(by, timeout);
    return $browser.actions().move({ origin: element, duration: 3000 }).perform();
  } catch (err) {
    console.error(`\ncatch(hover): ${err.message}`);
    throw err;
  }
};

(async function () {
  console.log(">>>>>>>>>>>>>>>>>>>", "Access bing page");
  await $browser.get("http://www.bing.com");
  console.log(">>>>>>>>>>>>>>>>>>>", "Actions of search");
  await hover("search button", $driver.By.xpath("//label[@id='search_icon']"), 10000);
  await $browser.takeScreenshot();
  await $browser.actions().sendKeys("synthetic").perform();
  await click("search button", $driver.By.xpath("//label[@id='search_icon']"), 10000);
})();
 

Vollständige Beispielcodes für APIs

const { assert } = require("chai");

(async function () {
  /**
   * manipulate headers and retrieve all the customized headers
   */
  await $browser.addHeader("test", "test");
  await $browser.addHeaders({ "test1": "test1", "test2": "test2" });
  await $browser.deleteHeaders(["test1", "test2"]);
  $browser.getHeaders().forEach((value, key) => console.log(">>>>>>>>>>>>>>>>>>>", "User customized headers: ", key + "=" + value));

  /**
   * manipulate deny and allow list
   */
  await $browser.addHostnamesToDenylist(["*google*", "*timeanddate*"]);
  await $browser.deleteHostnameFromDenylist("*timeanddate*");

  /**
   * open url www.bing.com
   * find element by class selector
   * send keys to search Synthetic in the page
   */
  console.log(">>>>>>>>>>>>>>>>>>>", "Access bing page");
  await $browser.get("http://www.bing.com");
  console.log(">>>>>>>>>>>>>>>>>>>", "Actions of search");
  // Find element by XPath and wait for the element until specified timeout value reached
  await $browser.waitForAndFindElement($driver.By.xpath(`//textarea[@inputmode='search']`), 10000);
  // Sleep or pause to wait for specified milliseconds
  await $browser.sleep(5000);
  // Take a screenshot
  await $browser.takeScreenshot();
  // Actions to send keys
  await $browser.actions().sendKeys("synthetic").sendKeys($driver.Key.ENTER).perform();

  /* Find element by CSS selector and perform actions
  let textarea = await $browser.waitForAndFindElement($driver.By.css('#sb_form_q'), 10000);
  // Actions to send keys
  await $browser
    .actions()
    .move({ origin: textarea })
    .sendKeys("synthetic")
    .pause(5000)
    .sendKeys($driver.Key.ENTER)
    .perform();
  */

  /**
   * samples of promise chain invocation, which is not recommended but backwards compatible
   * samples of waiting and polling function with timeout value
   */
  await $browser.deleteHostnameFromDenylist("*google*");
  await $browser.get("https://www.google.com");
  // Call the wait function.
  await $browser.wait(function () {
    return $browser.getTitle().then(function (title) {
      return title.includes("Google");
    });
    //If the condition isn't satisfied within 10000 milliseconds (10 seconds), proceed anyway.
  }, 10000).then(function () {
    return $browser.findElement($driver.By.linkText("About")).click();
  }).then(function () {
    return $browser.navigate().back();
  });

})();
 

Vollständiger Beispielcode für Proxy

Hinweis: Führen Sie diesen Beispielcode nicht aus. Sie müssen den Proxy-Server und die Zusicherung ändern.
const url = require("url");
const URL = url.URL;
const { assert } = require("chai");

let website;
let proxyServer = "proxyHost:proxyPort";
let sslProxyServer = "username:password@proxyHost:proxyPort";

async function accessWebSite(url) {
  console.log(">>>>>>>>>>>>>>>>>>>", "Proxy configuration is: ", JSON.stringify($network.getProxy()));
  console.log(">>>>>>>>>>>>>>>>>>>", `Access website ${url}`);
  await $browser.get(url);
  await $browser.findElement($driver.By.name('q')).click();
  await $browser.actions().sendKeys('synthetic').sendKeys($driver.Key.ENTER).perform();
  await $browser.takeScreenshot();
  return $browser.getCurrentUrl();
}

function checkHostname(hostname, website) {
  let actualURL = new URL(website);
  console.log(">>>>>>>>>>>>>>>>>>>", "Hostname is: ", actualURL.hostname);
  assert.equal(actualURL.hostname, hostname);
}

(async function () {
  /**
   * samples of proxy configuration settings with await asynchronous
   * using $network tools
   */
  console.log(">>>>>>>>>>>>>>>>>>>", "Clear proxy configuration");
  await $network.clearProxy();
  console.log(">>>>>>>>>>>>>>>>>>>", "Set proxy configuration for HTTPS request with string");
  await $network.setProxyForHttps(proxyServer);
  website = await accessWebSite("https://www.bing.com");
  checkHostname("www.bing.com", website)

  console.log(">>>>>>>>>>>>>>>>>>>", "Clear proxy configuration");
  await $network.clearProxy();
  console.log(">>>>>>>>>>>>>>>>>>>", "Set proxy configuration for HTTPS request with URL object");
  let testURL = new URL("http://" + sslProxyServer);
  await $network.setProxyForHttps(testURL);
  website = await accessWebSite("https://www.google.com");
  checkHostname("www.google.com", website);


  /**
   * samples of proxy configuration settings with bypass list
   */
  await $network.clearProxy();
  await $network.setProxy(proxyServer, "www.google.com");
  console.log(">>>>>>>>>>>>>>>>>>>", "Proxy config: ", $network.getProxy());
  website = await accessWebSite("https://www.bing.com");
  checkHostname("www.bing.com", website);
})();