selenium-webdriver
Individuazione degli elementi Web
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:
- ID : dal momento che è unico e ottieni esattamente l'elemento che desideri.
- Nome classe : è descrittivo e può essere unico in un determinato contesto.
- CSS ( prestazioni migliori di xpath ) - Per selettori più complicati.
- 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 ..
- Per ID
- Per nome della classe
- Con TagName
- Per nome
- Tramite il testo del collegamento
- Con il testo di collegamento parziale
- Dal selettore CSS
- Con XPath
- 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.