selenium-webdriver
Webelementen zoeken
Zoeken…
Syntaxis
- ByChained (params door [] bys)
Opmerkingen
Items worden gevonden in Selenium door het gebruik van locators en de klasse By
. Om een robuust automatiseringsproject met Selenium te maken, moet men slim gebruik maken van locators voor Web Elements. De locators moeten beschrijvend, uniek en waarschijnlijk niet veranderen, zodat u bijvoorbeeld geen valse positieven krijgt in tests. De prioriteit is om te gebruiken:
- ID - omdat het uniek is en u precies het element krijgt dat u wilt.
- Klasse naam - Het is beschrijvend en kan uniek zijn in een bepaalde context.
- CSS ( betere prestaties dan xpath ) - Voor meer gecompliceerde selectors.
- XPATH - Waar CSS niet kan worden gebruikt ( XPATH Axis ), bijvoorbeeld
div::parent
.
De rest van de locators is gevoelig voor wijzigingen of rendering en wordt bij voorkeur vermeden.
Vuistregel: als uw code een bepaald element niet kan vinden, kan een reden zijn dat uw code niet heeft gewacht tot alle DOM-elementen zijn gedownload. Overweeg om uw programma te vertellen dat het een korte tijd moet 'wachten' (probeer 3-5 seconden en verhoog het dan indien nodig langzaam) voordat u naar dit element zoekt. Hier is een voorbeeld in Python, afgeleid van deze vraag :
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!
Pagina-elementen zoeken met WebDriver
Om te kunnen communiceren met WebElements op een webpagina, moeten we eerst de locatie van het element identificeren.
By is het trefwoord dat beschikbaar is in selenium.
U kunt de elementen lokaliseren door ...
- Op ID
- Op klasnaam
- Op tagnaam
- Op naam
- Op linktekst
- Door gedeeltelijke linktekst
- Door CSS Selector
- Door XPath
- Met behulp van JavaScript
Beschouw het onderstaande scriptvoorbeeld
<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" />
In de bovenstaande code worden de gebruikersnaam en het wachtwoord ingesteld met behulp van id's. Nu ga je de elementen identificeren met ID.
driver.findElement(By.id(username));
driver.findElement(By.id(password));
Aangezien selenium 7 verschillende talen ondersteunt, geeft dit document je een idee om de elementen in alle talen te vinden.
Op ID
Voorbeeld van het vinden van een element met behulp van 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"));
Op klassennaam
Voorbeeld van het vinden van een element met behulp van de klassenaam:
<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"));
Op tagnaam
Voorbeeld van het vinden van een element met behulp van de tagnaam:
<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"));
Bij naam
Voorbeeld van het vinden van een element met behulp van naam:
<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"));
Op linktekst
Voorbeeld van het vinden van een element met behulp van linktekst:
<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"));
Door gedeeltelijke linktekst
Voorbeeld van het vinden van een element met behulp van gedeeltelijke linktekst:
<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"));
Door CSS-selectors
Voorbeeld van het vinden van een element met CSS-selectors:
<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"));
Hier is een artikel over het maken van CSS-selectors: http://www.w3schools.com/cssref/css_selectors.asp
Door XPath
Voorbeeld van het vinden van een element met 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"));
Hier is een artikel over XPath: http://www.w3schools.com/xsl/xpath_intro.asp
JavaScript gebruiken
U kunt willekeurige javascript uitvoeren om een element te vinden en zolang u een DOM-element retourneert, wordt het automatisch geconverteerd naar een WebElement-object.
Eenvoudig voorbeeld op een pagina waarop jQuery is geladen:
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 -
Let op: deze methode werkt niet als uw specifieke WebDriver geen JavaScript ondersteunt, zoals SimpleBrowser .
Selecteren op meerdere criteria [C #]
Het is ook mogelijk om selectors samen te gebruiken. Dit wordt gedaan met behulp van het OpenQA.Selenium.Support.PageObjects.ByChained
object:
element = driver.FindElement(new ByChained(By.TagName("input"), By.ClassName("class"));
Elk aantal By
's kan worden gekoppeld en worden gebruikt als een EN-type selectie (dat wil zeggen dat alle By
's overeenkomen)
Elementen selecteren voordat de pagina stopt met laden
Bij het aanroepen van driver.Navigate().GoToUrl(url);
, stopt de uitvoering van de code totdat de pagina volledig is geladen. Dit is soms niet nodig als u alleen gegevens wilt extraheren.
Opmerking: de onderstaande codevoorbeelden kunnen als hacks worden beschouwd. Er is geen "officiële" manier om dit te doen.
Maak een nieuwe thread
Maak en start een thread voor het laden van een webpagina en gebruik Wacht .
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")));
}
Gebruik time-outs
Met behulp van een WebDriverTimeout kunt u een pagina laden en na een bepaalde periode genereert deze een uitzondering waardoor de pagina niet meer wordt geladen. In het catch-blok kun je wachten gebruiken .
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")));
}
}
Het probleem : wanneer u de time-out instelt op te kort, stopt de pagina met laden, ongeacht of het gewenste element aanwezig is. Als u de time-out te lang instelt, gaat u het prestatievoordeel teniet.