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:

  1. ID - ponieważ jest unikalny, a otrzymasz dokładnie taki element, jaki chcesz.
  2. Nazwa klasy - ma charakter opisowy i może być unikalny w danym kontekście.
  3. CSS ( lepsza wydajność niż xpath ) - dla bardziej skomplikowanych selektorów.
  4. 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 ..

  1. Według ID
  2. Według nazwy klasy
  3. Według TagName
  4. Według nazwy
  5. Według tekstu linku
  6. Przez częściowy tekst linku
  7. Przez Selektor CSS
  8. Przez XPath
  9. 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ą.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow