FAQ (Frequently Asked Questions)

Perché l'impostazione del timeout del test non viene applicata

Quando si crea un test del browser, è possibile impostare un valore di timeout per garantire che il test fallisca se l'esecuzione supera la durata specificata. Tuttavia, l'impostazione del timeout ha effetto solo se il valore è inferiore a BROWSERSCRIPT_TIMEOUT, il cui valore predefinito è 5 minuti. timeout di configurazione

Perché un script registrato in Selenium potrebbe non funzionare correttamente su Instana

Selenium I test registrati potrebbero non funzionare correttamente su Instana se nel browser sono presenti cookie e cronologia; inoltre, nei siti web potrebbero non essere visibili le finestre pop-up relative all'accettazione dei cookie. Per evitare questo problema, utilizza un'istanza locale di Instana Synthetic-browser-script per testare il tuo script in locale dopo averlo creato.

Con lo script per browser sintetico Instana è possibile eseguire le seguenti operazioni:

  • Cancella automaticamente i profili utente: anche se riesci a eseguire correttamente gli script in locale con il plug-in IDE di Selenium, gli script potrebbero non funzionare su Instana a causa delle finestre pop-up. È necessario chiudere la finestra a comparsa prima di eseguire un'azione. Utilizzando il programma di esecuzione locale Synthetic - browser - script, i profili utente vengono automaticamente cancellati. Non è necessario cancellare manualmente i cookies dal browser.
  • Prova le API di test estese per browser di Instana : se desideri utilizzare le API di test estese per browser di Instana, puoi avvalerti del runner locale Synthetic-browser-script per eseguire i test. Il runtime del local runner dello script del browser sintetico è lo stesso del motore del browser sintetico Instana.

Selenium IDE è uno strumento di registrazione open-source per generare localizzatori come selettori CSS, XPath, ID e così via. Selenium IDE aiuta a identificare gli elementi web. Tuttavia, presenta le seguenti limitazioni:

Prova il tuo script in locale con il local runner di Synthetic-browser-script, fornito da Instana. Con questo strumento, è possibile vedere che l'interfaccia utente del browser completa richiede ed eseguire le azioni negli script di test per aiutare il debug e la risoluzione dei problemi. Se la logica di test è complessa, ad esempio se prevede l'uso di cicli, puoi anche provare a utilizzare i test con script browser sintetici di Instana, disponibili all'indirizzo JavaScript-based. Come aggiungere passi manuali per supportare lo Shadow DOM e così via, vedere le altre sezioni di questo argomento.

Come risolvere l'errore "L'elemento non è cliccabile"

Il test potrebbe avere esito negativo con uno dei seguenti messaggi di errore:

  • is not clickable at point (285,436) because another element <li> obscures it
  • Failed to execute command clickElement {} element not interactable.

Per risolvere questo problema, spostare il mouse per concentrarsi sull'elemento. È possibile utilizzare uno dei seguenti metodi.

Scorri per visualizzare e clicca

Per scorrere per visualizzare e fare clic, utilizzare il seguente comando JavaScript :

let element = await $browser.waitForAndFindElement(By.xpath(`//a[contains(.,'Customer stories')]`), 30000);
await $browser.executeScript(`arguments[0].scrollIntoView()`, element);
await $browser.executeScript(`arguments[0].click()`, element);
 

Per uno script registrato nell'IDE di Selenium, è possibile utilizzare runScript o executeScript per richiamare le API estese di Instana, in modo da utilizzare lo stesso codice di JavaScript :

{
"id": "b345d354-1d95-45d0-81ab-7c78695ed040",
"comment": "",
"command": "runScript",
"target": "let element = await $browser.waitForAndFindElement(By.xpath(`//a[contains(.,'Customer stories')]`), 30000); await $browser.executeScript(`arguments[0].scrollIntoView()`, element); await $browser.executeScript(`arguments[0].click()`, element)",
"targets": [],
"value": ""
},
 

Per uno script IDE di tipo " Selenium ", utilizza il local runner per eseguire o testare le API avanzate di " Instana ". Ad esempio, $browser.waitForAndFindElement poiché l'IDE di Selenium non è in grado di riconoscerli. Se desideri comunque eseguire o testare i tuoi script con l'IDE di Selenium, puoi provare il codice JavaScript riportato nell'esempio seguente. Il comando runScript utilizza document.querySelector, che può essere riconosciuto dai browser. Per un esempio di script, consulta la guida su come scorrere verso il basso e cliccare su "Pagina successiva" nei risultati di ricerca di Google.

{
"id": "d13e50bd-f698-4a04-9420-701a21dcde8d",
"comment": "",
"command": "waitForElementPresent",
"target": "css=#pnnext > span:nth-child(2)",
"targets": [],
"value": "20000"
},
{
"id": "b345d354-1d95-45d0-81ab-7c78695ed040",
"comment": "",
"command": "runScript",
"target": "const el = document.querySelector('#pnnext > span:nth-child(2)'); el.scrollIntoView(); el.click();",
"targets": [],
"value": ""
}
 

ActionChains

Per spostarsi sull'elemento e fare clic, usare ActionChains:

let element = await $browser.waitForAndFindElement($driver.By.linkText(`Business to business (BtoB) activities`), 10000);
await $browser.actions().move({origin: element}).click().perform();
 

MouseOver in uno script IDE di Selenium

Per ulteriori informazioni sul comando "mouseover" nello script dell'IDE di Selenium, consultare il comando MouseOver.

Per utilizzare MouseOver in uno script IDE Selenium :

{
"id": "2d5c6b52-d2d7-4592-8052-87572a09e58b",
"comment": "",
"command": "mouseOver",
"target": "xpath=//dds-megamenu-category-link[contains(.,'Bridge observability and automated resource management')]",
"targets": [],
"value": ""
},
 

MouseOver viene analizzato come mostrato nel seguente codice:

await driver.wait(until.elementLocated(By.xpath(`//dds-megamenu-category-link[contains(.,\'Bridge observability and automated resource management\')]`)), configuration.timeout);
await driver.findElement(By.xpath(`//dds-megamenu-category-link[contains(.,\'Bridge observability and automated resource management\')]`))
.then(element => {
    return driver.actions({
      bridge: true
    }).move({
      origin: element
    }).perform();
  });
 

Dimensioni ragionevoli della finestra

La dimensione della finestra potrebbe essere insolita quando si registrano gli script con Selenium IDE. Potrebbe causare l'errore element not interactable o not clickable at point quando si eseguono i test su Instana.

Per risolvere questo problema, provate a eseguire una delle seguenti operazioni:

  • Rimuovere il comando setWindowSize. Instana regolerà le dimensioni della finestra. Il tuo script può comunque essere eseguito correttamente su un IDE d Selenium.
  • Impostare la dimensione massima della finestra utilizzando il codice JavaScript. Usare il runner locale per testarlo, come mostrato nell'esempio seguente:
{
"id": "4f719a79-aa76-4dc8-a18b-7b46523ae0e6",
"comment": "",
"command": "executeScript",
"target": "await $browser.manage().window().maximize();",
"targets": [],
"value": ""
},
 

Come risolvere l'errore " StaleElementReferenceError "

Potrebbe verificarsi l'errore StaleElementReferenceError: stale element reference: element is not attached to the page document. Si tratta di un errore comune di Selenium.

Questo errore si verifica quando lo script di test fa riferimento a un elemento web che non è più associato al DOM; ciò può accadere con pagine web che utilizzano framework come React o Vue. Per risolvere questo problema, vedere gli esempi.

Verifica se i tuoi localizzatori sono in grado di identificare elementi web univoci

Questo problema potrebbe verificarsi perché il localizzatore restituisce più elementi web e non è in grado di identificare elementi unici. Un localizzatore può essere costituito da selettori CSS, XPath, ID e così via. Si tratta dell'espressione presente nella Target proprietà dell'IDE di Selenium. Nell'esempio seguente, il localizzatore CSS a[href*='/#/home'] span restituisce più elementi web, il che potrebbe causare il fallimento del test a causa di un riferimento a un elemento non aggiornato. Per testare i localizzatori, inserirli nel browser, andare su Altri strumenti > Strumenti per sviluppatori web. Un buon localizzatore può evidenziare l'elemento web unico. È possibile aggiornare o modificare i criteri di ricerca se vengono visualizzati più risultati corrispondenti, come illustrato nell'esempio seguente. localizzatori di test

Per selezionare diversi localizzatori con Selenium IDE, fare clic sulla proprietà Target. Considerate la possibilità di scegliere un localizzatore significativo indipendentemente dalla posizione dell'elemento web. Un buon localizzatore è in grado di identificare gli elementi web specifici indipendentemente dalle dimensioni della finestra o dalla posizione dell'interfaccia utente. selenio-locatori

Ritrovare l'elemento dopo che è stato aggiunto al DOM

È possibile scartare il riferimento attuale e sostituirlo, eventualmente individuando nuovamente l'elemento dopo che è stato collegato al DOM.

Oltre al punto 1, l'elemento web può essere stantio per uno dei seguenti motivi:

  • Aggiornamento della pagina
  • Aggiornamento DOM
  • La posizione dell'elemento web viene modificata

L'errore StaleElementReferenceError può verificarsi per i seguenti motivi:

  • L'elemento Web selezionato con cui interagire non è più presente nella pagina Web HTML.
  • L'elemento web selezionato è stato distrutto completamente e ricreato.

Codice di esempio con StaleElementReferenceError:

// retrieving an input HTML element from the page
let nameHtmlElement = await $browser.findElement(nameInputBy);
// setting a name in the input element
await nameHtmlElement.sendKeys("John");

// refreshing the page
await $browser.navigate().refresh()

// nameHtmlElement is now stale
// trying to set a new name, but this will throw a StaleElementReferenceException
await nameHtmlElement.sendKeys("Maria");
 

Per risolvere questo problema, cercate di ritrovare l'elemento prima di utilizzarlo.

// refreshing the page
await $browser.navigate().refresh()
nameHtmlElement = await $browser.findElement(nameInputBy);
await nameHtmlElement.sendKeys("Maria");
 

Alcuni utenti utilizzano soluzioni try-catch-retry. È possibile utilizzare la strategia di riprova su Instana. Se si imposta Strategia di ripetizione come Retazione due volte, quando il test fallisce viene ripetuto fino a 2 volte. In alternativa, è possibile cercare StaleElementReferenceError per trovare altre soluzioni nel campo dei test del browser per risolvere il problema nel codice dello script di test.

In attesa che la pagina si aggiorni

Se il problema non è ancora risolto, provate a usare il comando pause o await $browser.sleep per attendere qualche secondo fino a quando la pagina o l'iframe non vengono aggiornati. Prima di individuare gli elementi e utilizzarli, aspettate che la pagina sia "statica" per evitare il problema dei riferimenti agli elementi non aggiornati. Dedicare un po' pause di tempo e adottare una Retry strategia di " Instana " potrebbe evitare questo tipo di problemi. Per utilizzare una Retry strategia di " Instana ", è possibile impostare il numero di tentativi di ripetizione nella pagina di configurazione del test " Instana ", impostandolo su 1 o 2. Il test viene quindi eseguito al massimo tre volte fino a quando non va a buon fine, dopodiché il risultato viene inviato al backend di Instana.

// wait 5 seconds OR wait until tab is visible
// click the tab
// wait 5 seconds OR wait until button is visible
// Click button
await $browser.sleep(5000);
 
{
"id": "75135e0f-5f38-4004-b0f2-fda657d73bb3",
"comment": "",
"command": "pause",
"target": "2000",
"targets": [],
"value": ""
},
 

La ricerca di parole chiave in GitHub è illustrata nell'esempio di script.

Per risolvere stale element reference l'errore, utilizzare i comandi pausewaitForElementPresent e :

  • Aggiungere il comando pause per attendere l'aggiornamento della pagina prima di cambiare le schede.
  • Aggiungere il comando waitForEelementPresent per attendere la visualizzazione dell'elenco dei suggerimenti prima di inserire i caratteri nel campo.

soluzione al selenio soluzione al selenio

Come verificare i risultati dei test

Come verificare se il vostro caso di test ha avuto successo?

Nel campo di test del browser, utilizzare Asserzioni, Attesa esplicita per verificare i risultati del test. In questo modo è possibile garantire che la pagina web venga caricata e resa come previsto. Con il test del browser di Instana, puoi anche generare screenshot della tua sessione di test e controllare i log della console (comando Echo negli script registrati su Selenium ), i log del browser e il grafico della cronologia.

I seguenti comandi possono essere utili:

{
      "id": "938df959-9b65-4ae4-a2f5-59be6188ea5f",
      "comment": "This is how to sleep for 5 seconds.",
      "command": "pause",
      "target": "5000",
      "targets": [],
      "value": ""
},
{
    "id": "2d5c6b52-d2d7-4592-8052-87572a09e58b",
     "comment": "This is how to take screenshot",
     "command": "executeScript",
     "target": "await $browser.takeScreenshot()",
     "targets": [],
     "value": ""
}
 

Si possono anche provare i seguenti comandi di asserzione:

{
    "id": "46eb59c2-5fd6-4481-b3e8-eaaddab79a69",
    "comment": "This is one type of Assertions in browser testing",
    "command": "assertTitle",
    "target": "instana - Google Search",
    "targets": [],
    "value": ""
}
 

L'esempio seguente mostra come utilizzare Explicit Wait per verificare il test in uno script del browser:

await $browser.waitForAndFindElement($driver.By.xpath(`//h1[contains(text(), 'Websites & mobile apps')]`), 30000)
await $browser.wait($driver.until.titleContains(`Websites – Websites & mobile apps`), 30000);
 

Provate ad aggiungere i seguenti comandi nel vostro file laterale registrato:

{
      "id": "615cb3e5-fe2a-4859-b0aa-9df52f22028f",
      "comment": "This is Explicit Wait in browser testing",
      "command": "waitForElementPresent",
      "target": "id=mainmenu",
      "targets": [],
      "value": "30000"
},
{
      "id": "03e23d25-38e3-4051-81ff-740109350ee8",
      "comment": "This is how to add logging message in console logs",
      "command": "echo",
      "target": "Verify UI dashboard",
      "targets": [],
      "value": ""
}
 

Come passare alla modalità frame o iframe

Se il tuo sito web utilizza i frame, potresti riscontrare l'errore nessun elemento di questo tipo .

Per risolvere questo problema, passare al frame o iframe con $browser.switchTo().frame(id: number | WebElement);.

Per passare al frame o all'iframe per il test dello script del browser Instana :

let frameElement = await $browser.waitForAndFindElement($driver.By.xpath('//*[contains(@id, "pop-frame")]'), 10000);
await $browser.switchTo().frame(frameElement);
 

Come individuare gli elementi web

Per individuare gli elementi web, consultare la guida di riferimento disponibile all'indirizzo Selenium sulle strategie di localizzazione.

Funzione Descrizione
$browser.waitForAndFindElement($driver.By.id("boxyear"), 1000) Attendere e trovare l'elemento in base all'ID fino a quando l'elemento non è visibile o non viene raggiunto il valore di timeout
$browser.findElements($driver.By.css('select')) Ricerca di più elementi nella pagina con il selettore CSS
$browser.findElement($driver.By.linkText("About")) Trova elemento per linkText
$browser.findElement($driver.By.xpath('//input[@value='f']')) Trova elemento per XPath

Il formato del selettore CSS è By.css(element[attribute='attribute-value']).

Il formato dell'espressione XPath è By.xpath("//element[@attribute='value']") o By.xpath("//*[@attribute='value']").

Per trovare un elemento per attributi, ad esempio <a href="mysite.com"></a>, eseguire:

// CSS selector
$driver.By.css(a[href*="example"] )
 
// XPath expression
$driver.By.xpath("//a[contains(@href,'Electronics')]")
$driver.By.xpath(`//dds-footer-nav-item[contains(.,'Developer education')]`)
 

Per modificare il localizzatore predefinito sul plug-in IDE Selenium , fare clic sulla destinazione.

Selenium-localizzatori

Come selezionare un elemento dall'elenco a discesa

È possibile selezionare un elemento da un elenco a discesa utilizzando il comando select. Con la proprietà Value, è possibile selezionare un valore da una serie di opzioni con label=, value=, id= o index=. Se non viene fornito alcun prefisso, viene utilizzata una corrispondenza con l'elemento label. Utilizzare label, value o id invece di index. In caso contrario, i risultati tra l'IDE di Instana e quello di Selenium potrebbero non essere compatibili.

L'esempio seguente mostra come selezionare giugno nell'elenco a discesa con il comando select. I metodi per selezionare l'opzione Giugno sono mostrati nelle righe 3, 4 e 5. Questi metodi funzionano su Selenium IDE e Instana.

<select id="month" name="month" class="inline six" onchange="document.cf.typ[1].checked=true">
  <option value="1">January</option>
  <option value="2">February</option>
  <option value="3">March</option>
  <option value="4">April</option>
  <option value="5">May</option>
  <option value="6">June</option>
  <option value="7">July</option>
  <option value="8" selected="">August</option>
  <option value="9">September</option>
  <option value="10">October</option>
  <option value="11">November</option>
  <option value="12">December</option>
</select>
 

Selenium-selezione

Come risolvere l'errore "Elemento inesistente"

L'attesa esplicita è una nota best practice dell' Selenium, volta a evitare gli no such element errori e a ridurre i tempi di attesa o di inattività. L'attesa esplicita è preferibile rispetto all'attesa implicita e a $browser.sleep.

Per utilizzare l'attesa esplicita nell' Instana, eseguire i comandi come illustrato negli esempi seguenti:

// wait until the title comes out
await $browser.wait($driver.until.titleContains('Year 2023 Calendar'), 10000);

// Call the wait function.
await $browser.wait(function () {
    return $browser.getTitle().then(function (title) {
      return title.includes("Google");
    });
  }, 10000);

await $browser.wait(async function () {
    const title = await $browser.getTitle();
    return title.includes("Google");
  }, 10000);

// waitForAndFindElement API
const cookies = await $browser.waitForAndFindElement(
    $driver.By.id(`truste-consent-button`),
    30000
);
await cookies.click();
 

Nello script Selenium IDE, si può usare il comando WAIT come mostrato nell'esempio seguente. Inserire il tempo di attesa in millisecondi per la proprietà value.

{
"id": "d13e50bd-f698-4a04-9420-701a21dcde8d",
"comment": "",
"command": "waitForElementPresent",
"target": "id=result-stats",
"targets": [
    ["id=result-stats", "id"],
    ["css=#result-stats", "css:finder"],
    ["xpath=//div[@id='result-stats']", "xpath:attributes"],
    ["xpath=//div[@id='slim_appbar']/div/div", "xpath:idRelative"],
    ["xpath=//div[7]/div/div/div/div/div", "xpath:position"]
],
"value": "10000"
}
 

Come acquisire uno screenshot con lo script IDE " Selenium "

Per richiamare le API estese di Instana, eseguire il runScript comando executeScript o utilizzando gli script dell'IDE di Selenium.

{
"id": "e781c454-0080-447a-b905-7183443956f3",
"comment": "",
"command": "runScript",
"target": "await $browser.takeScreenshot()",
"targets": [],
"value": ""
}
 

Come gestire gli elenchi a discesa nei test con browser sintetico

Gli elementi nell'elenco a discesa vengono selezionati con findElement e fanno clic.

<select id="month" name="month" >
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
...
</select>

// find element by css or xpath
await $browser.findElement($driver.By.css(`#month > option:nth-child(3)`)).click();
await $browser.findElement($driver.By.xpath(`//select[@id='month']/option[3]`)).click();

// wait until element located and do assertion
await $browser.wait($driver.until.elementLocated($driver.By.id("month")), 3000).click();
assert.equal(5, await $browser.findElement($driver.By.id("month")).getAttribute("value"));
await $browser.findElement($driver.By.xpath("//select[@id='month']/option[3]")).click();
assert.equal(3, await $browser.findElement($driver.By.id("month")).getAttribute("value"));
 

Come gestire gli elementi Shadow DOM

Per verificare gli elementi DOM shadow, utilizzare la funzione getShadowRoot() .

Nota: la getShadowRoot() funzione è supportata su Instana Synthetic PoP Helm chart 1.1.1 o versioni successive. Per poter utilizzare l'interazione Shadow DOM, è necessario aggiornare Synthetic PoP alla versione 1.1.1 o successive.

Per utilizzare la funzione getShadowRoot() , eseguire il seguente comando:

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());
 

Oppure utilizza le API avanzate di Instana negli script registrati nell'IDE di Selenium e usa il runner locale per testarli:

{
"id": "4f602785-2a19-4b5f-a23c-7ae6f6e58d5d",
"comment": "",
"command": "executeScript",
"target": "let shadowHost = await $browser.waitForAndFindElement($driver.By.css(`.field > q2-input`), 10000); let shadowRoot = await shadowHost.getShadowRoot(); let element = await shadowRoot.findElement($driver.By.css(`*[type='text']`)); await element.sendKeys(`user1`); ",
"targets": [],
"value": ""
},
 

Come verificare il testo nella pagina con corrispondenza parziale

Per verificare il testo sulla pagina con una corrispondenza parziale, è possibile utilizzare findElement per XPath.

Verifica dei contenuti della pagina nel test dello script del browser

Per verificare il contenuto della pagina sul test dello script del browser:

let element = await $browser.findElement(By.xpath(`//h1[contains(text(), 'Action Result')]`));
console.log("Found element:", await element.getTagName(), ", element text is:", await element.getText());

await $browser.waitForAndFindElement(By.xpath(`//label[contains(text(), 'Action Result')]`), 5000);
console.log(">>>>>>>>>>>>>>>>>>>", "Action Result found");
 

Verifica dei contenuti della pagina nel test dello script registrato nell'IDE di Selenium

Per verificare il contenuto della pagina nel test dello script registrato IDE Selenium :

{
"id": "4cbe70ec-48b2-4e57-97cf-6d855fa0f08f",
"comment": "",
"command": "waitForElementVisible",
"target": "//h1[contains(text(), \"Selenium automates\")]",
"targets": [],
"value": "30000"
}
 

Selenium-comando

Come accedere ai siti web con l'autenticazione a due fattori

Per i test di script SIDE BrowserScript e Selenium , è supportato 2FA (autenticazione a due fattori) per accedere ai siti Web.

Per lo script di test completo, consultare l'esempio all'indirizzo BrowserScript e l'esempio SIDE all'indirizzo Selenium.

Per verificare lo script o eseguire lo script in locale, sostituire le variabili url e $secure nel file synb.json con i valori effettivi.

Per passare 2FA, completa la seguente procedura:

  1. Ottieni la chiave segreta TOTP (Time - based One - Time Password), un segreto condiviso generato in modo casuale tra te e il sito web per creare il token TOTP per l'accesso al sito web con autenticazione a due fattori (2FA). Questa chiave segreta viene generalmente fornita sotto forma di un codice QR o di un codice digitale durante la configurazione iniziale di 2FA. Per ottenere il codice digitale, fare clic su uno dei seguenti collegamenti della guida nella pagina di configurazione dell'autenticazione a due fattori:
    • Impossibile eseguire la scansione del codice QR
    • Problemi nella scansione? Immettere invece un codice.
  2. Per proteggere la tua chiave segreta, crea delle credenziali sintetiche per la chiave segreta TOTP utilizzando l'interfaccia Instana. Apri API.
  3. Nel test del browser, utilizza l' API a di test del $browser.generateTOTPToken(key: string) browser per generare un token TOTP a scadenza per i campi di immissione dati.
    • Per utilizzare BrowserScript per l'autenticazione 2FA :
      let totp_token = $browser.generateTOTPToken($secure.totpKey);
      await findElementByIdAndSendKeys("password", totp_token);
       
    • Per utilizzare lo script SIDE Selenium per l'autenticazione 2FA :
      {
         "id": "ec51296b-4d16-4167-ac83-ba87f89cc0c7",
         "comment": "Generate a TOTP token from a TOTP key",
         "command": "executeScript",
         "target": "return $browser.generateTOTPToken($secure.totpKey);",
         "targets": [],
         "value": "totpToken"
      }, {
         "id": "3cbc306a-ed33-46bf-9923-92752b0466f2",
         "comment": "",
         "command": "type",
         "target": "id=password",
         "targets": [],
         "value": "${totpToken}"
      },