Ricerca…


Sintassi

  • ByChained (parametri di [] bys)

Osservazioni

Gli oggetti si trovano nel Selenio attraverso l'uso di localizzatori e la classe By . Per realizzare un solido progetto di automazione con Selenium, è necessario utilizzare i localizzatori per Web Elements in modo intelligente. I localizzatori dovrebbero essere descrittivi, unici e improbabili da modificare, in modo da non ottenere falsi positivi nei test, ad esempio. La priorità è usare:

  1. ID : dal momento che è unico e ottieni esattamente l'elemento che desideri.
  2. Nome classe : è descrittivo e può essere unico in un determinato contesto.
  3. CSS ( prestazioni migliori di xpath ) - Per selettori più complicati.
  4. XPATH - Dove non è possibile utilizzare il CSS ( asse XPATH ), ad es. div::parent .

Il resto dei locatori sono inclini a modifiche o rendering, ed è preferibilmente evitato.

Regola pratica: se il codice non è in grado di individuare un particolare elemento, una ragione potrebbe essere che il codice non ha aspettato il download di tutti gli elementi DOM. Considera di dire al tuo programma di "aspettare" per un breve periodo di tempo (prova 3-5 secondi, e poi aumenta lentamente se necessario) prima di cercare il suddetto elemento. Ecco un esempio in Python, tratto da questa domanda :

from selenium import webdriver
import time

browser = webdriver.Firefox()
browser.get("https://app.website.com")

reports_element = browser.find_element_by_xpath("//button[contains(text(), 'Reports')]")

# Element not found! Try giving time for the browser to download all DOM elements:
time.sleep(10)

reports_element = browser.find_element_by_xpath("//button[contains(text(), 'Reports')]")
# This returns correct value!

Individuazione degli elementi della pagina tramite WebDriver

Per interagire con WebElements in una pagina Web, innanzitutto è necessario identificare la posizione dell'elemento.

Di è la parola chiave disponibile nel selenio.

Puoi localizzare gli elementi di ..

  1. Per ID
  2. Per nome della classe
  3. Con TagName
  4. Per nome
  5. Tramite il testo del collegamento
  6. Con il testo di collegamento parziale
  7. Dal selettore CSS
  8. Con XPath
  9. Utilizzando JavaScript

Considera l'esempio di script seguente

<form name="loginForm">
Login Username: <input id="username" name="login" type="text" />
Password: <input id="password" name="password" type="password" />
<input name="login" type="submit" value="Login" />

Nel codice sopra il nome utente e la password sono impostati usando id. Ora identificherete gli elementi con id.

driver.findElement(By.id(username));

driver.findElement(By.id(password));

Poiché il selenio supporta 7 lingue diverse, questo documento ti dà un'idea per individuare gli elementi in tutte le lingue.


Per ID

Esempio di come trovare un elemento usando l'ID:

<div id="coolestWidgetEvah">...</div>

Java       -  WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
C#         -  IWebElement element = driver.FindElement(By.Id("coolestWidgetEvah"));
Python     -  element = driver.find_element_by_id("coolestWidgetEvah")
Ruby       -  element = driver.find_element(:id, "coolestWidgetEvah")
JavaScript/Protractor -  var elm = element(by.id("coolestWidgetEvah"));

Per nome della classe

Esempio di come trovare un elemento usando il nome della classe:

<div class="cheese"><span>Cheddar</span></div>

Java       -  WebElement element = driver.findElement(By.className("cheese"));
C#         -  IWebElement element = driver.FindElement(By.ClassName("cheese"));
Python     -  element = driver.find_element_by_class_name("cheese")
Ruby       -  cheeses = driver.find_elements(:class, "cheese")
JavaScript/Protractor -  var elm = element(by.className("cheese"));

Per nome tag

Esempio di come trovare un elemento usando il nome del tag:

<iframe src="..."></iframe>

Java       -  WebElement element = driver.findElement(By.tagName("iframe"));
C#         -  IWebElement element = driver.FindElement(By.TagName("iframe"));
Python     -  element = driver.find_element_by_tag_name("iframe")
Ruby       -  frame = driver.find_element(:tag_name, "iframe")
JavaScript/Protractor -  var elm = element(by.tagName("iframe"));

Per nome

Esempio di come trovare un elemento usando il nome:

<input name="cheese" type="text"/>

Java       -  WebElement element = driver.findElement(By.name("cheese"));
C#         -  IWebElement element = driver.FindElement(By.Name("cheese"));
Python     -  element = driver.find_element_by_name("cheese")
Ruby       -  cheese = driver.find_element(:name, "cheese")
JavaScript/Protractor -  var elm = element(by.name("cheese"));

Tramite il testo del collegamento

Esempio di come trovare un elemento usando il testo del link:

<a href="http://www.google.com/search?q=cheese">cheese</a>>

Java       -  WebElement element = driver.findElement(By.linkText("cheese"));
C#         -  IWebElement element = driver.FindElement(By.LinkText("cheese"));
Python     -  element = driver.find_element_by_link_text("cheese")
Ruby       -  cheese = driver.find_element(:link, "cheese")
JavaScript/Protractor -  var elm = element(by.linkText("cheese"));

Con il testo di collegamento parziale

Esempio di come trovare un elemento usando il testo del collegamento parziale:

<a href="http://www.google.com/search?q=cheese">search for cheese</a>>

Java       -  WebElement element = driver.findElement(By.partialLinkText("cheese"));
C#         -  IWebElement element = driver.FindElement(By.PartialLinkText("cheese"));
Python     -  element = driver.find_element_by_partial_link_text("cheese")
Ruby       -  cheese = driver.find_element(:partial_link_text, "cheese")
JavaScript/Protractor -  var elm = element(by.partialLinkText("cheese"));

Da selettori CSS

Esempio di come trovare un elemento usando i selettori CSS:

<div id="food" class="dairy">milk</span>

Java       -  WebElement element = driver.findElement(By.cssSelector("#food.dairy")); //# is used to indicate id and . is used for classname.
C#         -  IWebElement element = driver.FindElement(By.CssSelector("#food.dairy"));
Python     -  element = driver.find_element_by_css_selector("#food.dairy")
Ruby       -  cheese = driver.find_element(:css, "#food span.dairy.aged")
JavaScript/Protractor -  var elm = element(by.css("#food.dairy"));

Ecco un articolo sulla creazione di selettori CSS: http://www.w3schools.com/cssref/css_selectors.asp


Con XPath

Esempio di come trovare un elemento usando XPath:

<input type="text" name="example" />

Java       -  WebElement element = driver.findElement(By.xpath("//input"));
C#         -  IWebElement element = driver.FindElement(By.XPath("//input"));
Python     -  element = driver.find_element_by_xpath("//input")
Ruby       -  inputs = driver.find_elements(:xpath, "//input")
JavaScript/Protractor -  var elm = element(by.xpath("//input"));

Ecco un articolo su XPath: http://www.w3schools.com/xsl/xpath_intro.asp


Utilizzando JavaScript

È possibile eseguire un javascript arbitrario per trovare un elemento e fino a quando si restituisce un elemento DOM, verrà automaticamente convertito in un oggetto WebElement.

Semplice esempio su una pagina che ha caricato jQuery:

Java       -  WebElement element = (WebElement) 
((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");

C#         -  IWebElement element = (IWebElement)
((IJavaScriptExecutor)driver).ExecuteScript("return $('.cheese')[0]");

Python     -  element = driver.execute_script("return $('.cheese')[0]");
Ruby       -  element = driver.execute_script("return $('.cheese')[0]")
JavaScript/Protractor -

Nota: questo metodo non funzionerà se il tuo specifico WebDriver non supporta JavaScript, come SimpleBrowser .

Selezione in base a più criteri [C #]

È anche possibile utilizzare i selettori insieme. Questo viene fatto usando l'oggetto OpenQA.Selenium.Support.PageObjects.ByChained :

element  = driver.FindElement(new ByChained(By.TagName("input"), By.ClassName("class"));

Qualsiasi numero di By s può essere incatenato e usato come selezione del tipo AND (cioè tutti i messaggi By sono abbinati)

Selezione degli elementi prima che la pagina smetta di caricarsi

Quando si chiama driver.Navigate().GoToUrl(url); , l'esecuzione del codice si interrompe finché la pagina non è completamente caricata. Questo a volte non è necessario quando si desidera estrarre dati.

Nota: i seguenti esempi di codice potrebbero essere considerati hack. Non esiste un modo "ufficiale" per farlo.


Crea un nuovo thread

Crea e avvia una discussione per caricare una pagina web, quindi usa Aspetta .

C #

using (var driver = new ChromeDriver())
{
    new Thread(() =>
    {
        driver.Navigate().GoToUrl("http://stackoverflow.com");
    }).Start();

    new WebDriverWait(driver, TimeSpan.FromSeconds(10))
      .Until(ExpectedConditions.ElementIsVisible(By.XPath("//div[@class='summary']/h3/a")));
}

Usa i timeout

Usando un WebDriverTimeout, puoi caricare una pagina e, dopo un certo periodo di tempo, genererà un'eccezione, che impedirà il caricamento della pagina. Nel blocco catch, puoi usare Wait .

C #

using (var driver = new ChromeDriver())
{
    driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5));

    try
    {
        driver.Navigate().GoToUrl("http://stackoverflow.com");
    }
    catch (WebDriverTimeoutException)
    {
        new WebDriverWait(driver, TimeSpan.FromSeconds(10))
          .Until(ExpectedConditions.ElementIsVisible
            (By.XPath("//div[@class='summary']/h3/a")));
    }
}

Il problema : quando si imposta il timeout troppo breve, la pagina smetterà di caricarsi indipendentemente dal fatto che l'elemento desiderato sia presente. Quando si imposta il timeout per troppo tempo, si andrà a negare il beneficio delle prestazioni.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow