Suche…


Syntax

  • ByChained (params By [] bys)

Bemerkungen

Elemente werden in Selen mithilfe von Locators und der By Klasse gefunden. Um ein robustes Automatisierungsprojekt mit Selenium zu erstellen, sollten Locators für Web Elements auf intelligente Weise verwendet werden. Die Locators sollten deskriptiv und eindeutig sein, und es ist unwahrscheinlich, dass sich die Locators ändern, sodass Sie zum Beispiel in Tests keine falschen Ergebnisse erhalten. Die Priorität ist zu verwenden:

  1. ID - da es einzigartig ist und Sie genau das Element erhalten, das Sie möchten.
  2. Klassenname - Beschreibt den Namen und kann in einem bestimmten Kontext eindeutig sein.
  3. CSS ( bessere Leistung als xpath ) - Für kompliziertere Selektoren.
  4. XPATH - Wo CSS nicht verwendet werden kann ( XPATH Axis ), z. B. div::parent .

Der Rest der Locators ist anfällig für Änderungen oder Rendering und sollte möglichst vermieden werden.

Faustregel: Wenn Ihr Code ein bestimmtes Element nicht finden kann, könnte dies daran liegen, dass Ihr Code nicht auf das Herunterladen aller DOM-Elemente gewartet hat. Erwägen Sie, Ihrem Programm zu sagen, dass es eine kurze Zeit "warten" soll (versuchen Sie es mit 3-5 Sekunden und erhöhen Sie es dann nach Bedarf langsam), bevor Sie das Element suchen. Hier ist ein Beispiel aus Python, das aus dieser Frage stammt :

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!

Seitenelemente mit WebDriver suchen

Um mit WebElements auf einer Webseite zu interagieren, müssen wir zuerst den Ort des Elements identifizieren.

Mit ist das Schlüsselwort in Selen verfügbar.

Sie können die Elemente durch suchen.

  1. Nach ID
  2. Nach Klassenname
  3. Von TagName
  4. Nach Name
  5. Durch Link-Text
  6. Durch teilweise Link-Text
  7. Mit der CSS-Auswahl
  8. Mit XPath
  9. Verwendung von JavaScript

Betrachten Sie das folgende Skriptbeispiel

<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" />

Im obigen Code werden der Benutzername und das Passwort mithilfe von IDs festgelegt. Jetzt identifizieren Sie die Elemente mit der ID.

driver.findElement(By.id(username));

driver.findElement(By.id(password));

Da Selen 7 verschiedene Sprachen unterstützt, erhalten Sie in diesem Dokument eine Idee, die Elemente in allen Sprachen zu finden.


Nach ID

Beispiel für das Finden eines Elements mit der 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"));

Nach Klassenname

Beispiel für das Finden eines Elements mithilfe des Klassennamens:

<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"));

Nach Tag-Name

Beispiel für das Finden eines Elements anhand des Tagnamens:

<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"));

Namentlich

Beispiel für das Finden eines Elements anhand des Namens:

<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"));

Beispiel für das Finden eines Elements mit Linktext:

<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"));

Beispiel für die Suche nach einem Element mit teilweise Verknüpfungstext:

<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"));

Mit CSS-Selektoren

Beispiel für das Finden eines Elements mit 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 ist ein Artikel zum Erstellen von CSS-Selektoren: http://www.w3schools.com/cssref/css_selectors.asp


Mit XPath

Beispiel für das Finden eines Elements mit 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 ist ein Artikel über XPath: http://www.w3schools.com/xsl/xpath_intro.asp


Verwendung von JavaScript

Sie können ein beliebiges Javascript ausführen, um ein Element zu finden. Solange Sie ein DOM-Element zurückgeben, wird es automatisch in ein WebElement-Objekt konvertiert.

Einfaches Beispiel für eine Seite, auf der jQuery geladen ist:

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 -

Bitte beachten Sie: Diese Methode funktioniert nicht, wenn Ihr bestimmter WebDriver kein JavaScript unterstützt, z. B. SimpleBrowser .

Auswahl nach mehreren Kriterien [C #]

Es ist auch möglich, Selektoren zusammen zu verwenden. Verwenden Sie dazu das OpenQA.Selenium.Support.PageObjects.ByChained Objekt:

element  = driver.FindElement(new ByChained(By.TagName("input"), By.ClassName("class"));

Beliebig viele By s können verkettet werden und werden als AND-Typ-Auswahl verwendet (dh alle By s stimmen überein).

Elemente auswählen, bevor die Seite nicht mehr geladen wird

Beim Aufruf von driver.Navigate().GoToUrl(url); wird die Codeausführung angehalten, bis die Seite vollständig geladen ist. Dies ist manchmal nicht erforderlich, wenn Sie nur Daten extrahieren möchten.

Hinweis: Die folgenden Codebeispiele können als Hacks angesehen werden. Es gibt keinen "offiziellen" Weg, dies zu tun.


Erstellen Sie einen neuen Thread

Erstellen und starten Sie einen Thread zum Laden einer Webseite, und verwenden Sie dann Wait .

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")));
}

Verwenden Sie Timeouts

Mit einem WebDriverTimeout können Sie eine Seite laden. Nach einer bestimmten Zeit wird eine Ausnahme ausgelöst, die das Laden der Seite stoppt. Im catch-Block können Sie Wait verwenden .

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")));
    }
}

Das Problem : Wenn Sie das Timeout zu kurz einstellen, wird die Seite nicht mehr geladen, unabhängig davon, ob das gewünschte Element vorhanden ist. Wenn Sie das Timeout zu lange einstellen, wird der Leistungsvorteil aufgehoben.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow