Buscar..


Sintaxis

  • ByChained (params By [] bys)

Observaciones

Los artículos se encuentran en Selenium mediante el uso de localizadores y la clase By . Para realizar un robusto proyecto de automatización con Selenium, se deben usar localizadores para elementos web de forma inteligente. Los localizadores deben ser descriptivos, únicos y es poco probable que cambien, por lo que no obtendrá falsos positivos en las pruebas, por ejemplo. La prioridad es utilizar:

  1. ID : ya que es único y obtendrá exactamente el elemento que desea.
  2. Nombre de clase : es descriptivo y puede ser único en un contexto dado.
  3. CSS ( mejor rendimiento que xpath ): para selectores más complicados.
  4. XPATH : donde no se puede usar CSS ( XPATH Axis ), por ejemplo, div::parent .

El resto de los localizadores son propensos a cambios o renderización, y preferiblemente deben evitarse.

Regla de oro: si su código no puede localizar un elemento en particular, una razón podría ser que su código no ha esperado a que se descarguen todos los elementos de DOM. Considere pedirle a su programa que "espere" por un corto período de tiempo (intente de 3 a 5 segundos y luego aumente lentamente según sea necesario) antes de buscar dicho elemento. Aquí hay un ejemplo en Python, tomado de esta pregunta :

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!

Localización de elementos de página usando WebDriver

Para interactuar con WebElements en una página web, primero necesitamos identificar la ubicación del elemento.

Por es la palabra clave disponible en selenio.

Puedes localizar los elementos por ...

  1. Por identificación
  2. Por nombre de clase
  3. Por nombre de etiqueta
  4. Por nombre
  5. Por enlace de texto
  6. Por texto de enlace parcial
  7. Por CSS Selector
  8. Por XPath
  9. Usando JavaScript

Considere el siguiente ejemplo de script

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

En el código anterior, el nombre de usuario y la contraseña se configuran utilizando los ID. Ahora vas a identificar los elementos con id.

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

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

Como Selenio admite 7 idiomas diferentes, este documento le da una idea para ubicar los elementos en todos los idiomas.


Por identificación

Ejemplo de cómo encontrar un elemento usando 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"));

Por nombre de clase

Ejemplo de cómo encontrar un elemento usando el nombre de clase:

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

Por nombre de etiqueta

Ejemplo de cómo encontrar un elemento usando el nombre de etiqueta:

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

Por nombre

Ejemplo de cómo encontrar un elemento usando nombre:

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

Por enlace de texto

Ejemplo de cómo encontrar un elemento usando el texto del enlace:

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

Por texto de enlace parcial

Ejemplo de cómo encontrar un elemento utilizando texto de enlace parcial:

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

Por los selectores de CSS

Ejemplo de cómo encontrar un elemento utilizando los selectores de 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"));

Aquí hay un artículo sobre la creación de selectores de CSS: http://www.w3schools.com/cssref/css_selectors.asp


Por XPath

Ejemplo de cómo encontrar un elemento usando 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"));

Aquí hay un artículo sobre XPath: http://www.w3schools.com/xsl/xpath_intro.asp


Usando JavaScript

Puede ejecutar un javascript arbitrario para encontrar un elemento y siempre que devuelva un elemento DOM, se convertirá automáticamente en un objeto WebElement.

Ejemplo simple en una página que ha cargado 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 -

Tenga en cuenta: este método no funcionará si su WebDriver en particular no es compatible con JavaScript, como SimpleBrowser .

Seleccionando por criterios múltiples [C #]

También es posible utilizar selectores juntos. Esto se hace usando el objeto OpenQA.Selenium.Support.PageObjects.ByChained :

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

Cualquier número de By s se puede encadenar y se utiliza como una selección de tipo AND (es decir, todos los By s coinciden)

Seleccionar elementos antes de que la página se detenga.

Al llamar a driver.Navigate().GoToUrl(url); , la ejecución del código se detiene hasta que la página está completamente cargada. Esto a veces es innecesario cuando solo desea extraer datos.

Nota: los ejemplos de código a continuación podrían considerarse hacks. No hay una manera "oficial" de hacer esto.


Crear un nuevo hilo

Cree e inicie un hilo para cargar una página web, luego use Esperar .

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

Usar tiempos de espera

Usando un WebDriverTimeout, puede cargar una página, y después de un cierto período de tiempo, lanzará una excepción, lo que hará que la página deje de cargarse. En el bloque catch, puedes usar Wait .

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

El problema : cuando configura el tiempo de espera demasiado corto, la página dejará de cargarse independientemente de si su elemento deseado está presente. Cuando configura el tiempo de espera demasiado tiempo, negará el beneficio de rendimiento.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow