selenium-webdriver
Lokalizowanie elementów sieci
Szukaj…
Składnia
- ByChained (params By [] bys)
Uwagi
Przedmioty znajdują się w Selenium dzięki użyciu lokalizatorów i By
klasy. Aby wykonać solidny projekt automatyzacji za pomocą Selenium, należy mądrze używać lokalizatorów Web Elements. Lokalizatory powinny być opisowe, unikalne i mało prawdopodobne, aby uległy zmianie, aby na przykład nie uzyskać fałszywych wyników pozytywnych w testach. Priorytetem jest użycie:
- ID - ponieważ jest unikalny, a otrzymasz dokładnie taki element, jaki chcesz.
- Nazwa klasy - ma charakter opisowy i może być unikalny w danym kontekście.
- CSS ( lepsza wydajność niż xpath ) - dla bardziej skomplikowanych selektorów.
- XPATH - tam, gdzie nie można użyć CSS ( oś XPATH ), np.
div::parent
.
Reszta lokalizatorów jest podatna na zmiany lub renderowanie i najlepiej unikać.
Ogólna zasada: jeśli kod nie może zlokalizować określonego elementu, jednym z powodów może być to, że kod nie czekał na pobranie wszystkich elementów DOM. Zastanów się, czy twój program „czeka” przez krótki czas (spróbuj 3-5 sekund, a następnie powoli zwiększaj w razie potrzeby) przed wyszukaniem tego elementu. Oto przykład w Pythonie zaczerpnięty z tego pytania :
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!
Lokalizowanie elementów strony za pomocą WebDriver
Aby wchodzić w interakcje z WebElements na stronie internetowej, najpierw musimy określić lokalizację elementu.
Przez to słowo kluczowe dostępne w selenie.
Możesz zlokalizować elementy według ..
- Według ID
- Według nazwy klasy
- Według TagName
- Według nazwy
- Według tekstu linku
- Przez częściowy tekst linku
- Przez Selektor CSS
- Przez XPath
- Za pomocą JavaScript
Rozważ poniższy przykład skryptu
<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" />
W powyższym kodzie nazwa użytkownika i hasło są ustawione za pomocą identyfikatorów. Teraz będziesz identyfikować elementy za pomocą id.
driver.findElement(By.id(username));
driver.findElement(By.id(password));
Ponieważ selen obsługuje 7 różnych języków, ten dokument daje pomysł na zlokalizowanie elementów we wszystkich językach.
Według ID
Przykład znalezienia elementu za pomocą identyfikatora:
<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"));
Według nazwy klasy
Przykład znalezienia elementu przy użyciu nazwy klasy:
<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"));
Według nazwy znacznika
Przykład znalezienia elementu przy użyciu nazwy znacznika:
<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"));
Wg nazwy
Przykład znalezienia elementu przy użyciu nazwy:
<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"));
Według tekstu linku
Przykład znalezienia elementu za pomocą tekstu linku:
<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"));
Przez częściowy tekst linku
Przykład znalezienia elementu za pomocą częściowego tekstu linku:
<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"));
Przez selektory CSS
Przykład znalezienia elementu przy użyciu Selektorów 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"));
Oto artykuł na temat tworzenia selektorów CSS: http://www.w3schools.com/cssref/css_selectors.asp
Przez XPath
Przykład znalezienia elementu za pomocą 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"));
Oto artykuł o XPath: http://www.w3schools.com/xsl/xpath_intro.asp
Za pomocą JavaScript
Możesz wykonać dowolny skrypt javascript, aby znaleźć element, i dopóki zwrócisz element DOM, zostanie on automatycznie przekonwertowany na obiekt WebElement.
Prosty przykład na stronie, na której załadowano 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 -
Uwaga: Ta metoda nie będzie działać, jeśli Twój konkretny WebDriver nie obsługuje JavaScript, takiego jak SimpleBrowser .
Wybieranie według wielu kryteriów [C #]
Można również używać selektorów razem. Odbywa się to za pomocą obiektu OpenQA.Selenium.Support.PageObjects.ByChained
:
element = driver.FindElement(new ByChained(By.TagName("input"), By.ClassName("class"));
Można połączyć dowolną liczbę By
i użyć ich jako wyboru typu ORAZ (tzn. Wszystkie By
są dopasowane)
Wybieranie elementów przed zatrzymaniem ładowania strony
Podczas wywoływania driver.Navigate().GoToUrl(url);
, wykonywanie kodu zatrzymuje się, aż strona zostanie w pełni załadowana. Jest to czasami niepotrzebne, gdy chcesz po prostu wyodrębnić dane.
Uwaga: poniższe przykłady kodu można uznać za włamania. Nie ma „oficjalnego” sposobu na zrobienie tego.
Utwórz nowy wątek
Utwórz i uruchom wątek do ładowania strony internetowej, a następnie użyj opcji Czekaj .
DO#
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")));
}
Użyj limitów czasu
Korzystając z WebDriverTimeout, możesz załadować stronę, a po pewnym czasie wygeneruje wyjątek, który spowoduje zatrzymanie ładowania strony. W bloku catch możesz użyć opcji Czekaj .
DO#
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")));
}
}
Problem : po ustawieniu zbyt krótkiego limitu czasu strona przestanie się ładować niezależnie od tego, czy żądany element jest obecny. Jeśli zbyt długo ustawisz limit czasu, zignorujesz korzyści związane z wydajnością.