selenium-webdriver
Hitta webbelement
Sök…
Syntax
- ByChained (params By [] bys)
Anmärkningar
Föremål finns i Selenium genom användning av lokaliserare och By
klassen. För att göra ett robust automatiseringsprojekt med Selenium bör man använda locators för Web Elements på ett smart sätt. Lokaliserarna bör vara beskrivande, unika och osannolika att förändras så att du inte får falska positiver i exempelvis tester. Prioriteringen är att använda:
- ID - eftersom det är unikt och du får exakt det element du vill ha.
- Klassnamn - Det är beskrivande och kan vara unikt i ett givet sammanhang.
- CSS ( bättre prestanda än xpath ) - För mer komplicerade väljare.
- XPATH - Där CSS inte kan användas ( XPATH Axis ), t.ex.
div::parent
.
Resten av lokalbefolkningen är benägna att ändra eller återge och föredras helst.
Tumregel: om din kod inte kan hitta ett visst element kan en orsak vara att din kod inte har väntat på att alla DOM-element laddas ner. Överväg att säga ditt program att "vänta" under en kort tid (försök 3-5 sekunder, och öka sedan långsamt efter behov) innan du söker efter nämnda element. Här är ett exempel i Python, taget från denna fråga :
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!
Hitta sidelement med hjälp av WebDriver
För att interagera med WebElements på en webbsida måste vi först identifiera elementets plats.
By är nyckelordet som finns i selen.
Du kan hitta elementen efter ..
- Av ID
- Efter klassnamn
- Av TagName
- Vid namn
- Med länktext
- Av partiell länktext
- Av CSS Selector
- Av XPath
- Använda JavaScript
Betrakta exemplet nedan
<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" />
I ovanstående kod anges användarnamn och lösenord med ID: er. Nu ska du identifiera elementen med id.
driver.findElement(By.id(username));
driver.findElement(By.id(password));
Eftersom selen stöder sju olika språk ger detta dokument dig en idé att hitta elementen på alla språk.
Av ID
Exempel på hur man hittar ett element med 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"));
Efter klassnamn
Exempel på hur man hittar ett element med klassnamn:
<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"));
Med tagnamn
Exempel på hur man hittar ett element med taggnamn:
<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"));
Vid namn
Exempel på hur man hittar ett element med namn:
<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"));
Med länktext
Exempel på hur man hittar ett element med hjälp av länktext:
<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"));
Av partiell länktext
Exempel på hur man hittar ett element med hjälp av partiell länktext:
<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"));
Av CSS Selectors
Exempel på hur man hittar ett element med CSS-väljare:
<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"));
Här är en artikel om hur du skapar CSS-väljare: http://www.w3schools.com/cssref/css_selectors.asp
Av XPath
Exempel på hur man hittar ett element med 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"));
Här är en artikel om XPath: http://www.w3schools.com/xsl/xpath_intro.asp
Använda JavaScript
Du kan köra godtyckligt javascript för att hitta ett element och så länge du returnerar ett DOM-element konverteras det automatiskt till ett WebElement-objekt.
Enkelt exempel på en sida som har jQuery laddad:
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 -
Observera: Den här metoden fungerar inte om din specifika WebDriver inte stöder JavaScript, till exempel SimpleBrowser .
Välja med flera kriterier [C #]
Det är också möjligt att använda väljare tillsammans. Detta görs genom att använda OpenQA.Selenium.Support.PageObjects.ByChained
objektet:
element = driver.FindElement(new ByChained(By.TagName("input"), By.ClassName("class"));
Valfritt antal By
s kan kedjad och används som en OCH urval typ (dvs. alla By
s är matchade)
Att välja element innan sidan slutar laddas
När du ringer driver.Navigate().GoToUrl(url);
, kodutförandet stannar tills sidan är fullastad. Det är ibland onödigt när du bara vill extrahera data.
Obs: Kodproven nedan kan betraktas som hacks. Det finns inget "officiellt" sätt att göra detta.
Skapa en ny tråd
Skapa och starta en tråd för att ladda en webbsida, använd sedan Vänta .
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")));
}
Använd timeouts
Med hjälp av en WebDriverTimeout kan du ladda en sida, och efter en viss tid kommer den att kasta ett undantag, vilket gör att sidan slutar ladda. I fångstblocket kan du använda Vänta .
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")));
}
}
Problemet : När du ställer in tidsgränsen för för kort slutar sidan att laddas oavsett om ditt önskade element finns. När du ställer in tidsgränsen för länge kommer du att förneka resultatfördelen.