Skip to main content

Identificación de objetos por CSS Selector

Esta página no está en español en la antigua dokuwiki, preguntar a Ana, ¿si la hemos quitado  por algún motivo? o no está por otro.

Como se dijo en Identificación de Objetos,  CSS Selector es una forma simple y fácil de identificar objetos en HTML (identificando uno o muchos elementos) y muy útil.

Cuando se selecciona un objeto, en las pruebas, es necesario ser específico, y para ello, el uso de CSS tiende a conducir a selectores como span[name='coches'] en lugar de la forma XPath 

 bodydiv/spn/span/table/tr/tr/tr/td/td/td/td/span[@name='cars'].

CSS Selector se basa en definir el tipo de elemento añadido a la definición de uno o varios atributos. También es posible definir sólo el tipo de elemento (esto tiende a ser inexacto) o sólo los atributos (uno o más). Al final de la página, algunos ejemplos muestran la forma de hacerlo.

Formula:

La formulación de CSS Selector puede definirse de dos maneras:

  • element[attribute(*|^|$|~)='value']
  • element(sym)'value'

La parte del elemento será qué tipo de elemento necesita ser seleccionado. La parte del atributo será el atributo que el usuario está seleccionando. La parte (*|^|$|~) es un operador de comparación opcional dependiendo de lo que se necesite (Por ejemplo: Igual a ( = ); Empieza por ( ^= ); Termina por ( $= ); Contiene ( *= ); Contiene en una lista ( ~= )). (sym) representa el acceso directo creado para los dos atributos más utilizados (ID y clase).

En caso de que el usuario desee especificar más de un atributo para reconocer el elemento, esto también es posible concatenando más de una especificación, una justo después de la otra. De esta forma, buscamos el elemento que cumpla ambas condiciones, como en la sentencia elementtype[atributo1(*|^|$|~)='valor1'][atributo2(*|^|$|~)='valor2']. El elemento tiene que ser un elemento "elementtype", con el "valor1" en el "atributo1" y el "valor2" en el "atributo2".

También sería posible utilizar el selector [attribute(*|^|$|~)='value'] pero de esta forma el selector se ejecutaría sobre todos los elementos, y no sólo sobre los que coinciden con el tipo de elemento que buscamos, por lo que es muy recomendable utilizar el tipo de elemento para agilizar el proceso.

Para algunos de los atributos más utilizados, hay algunos atajos que se pueden utilizar para facilitar el trabajo del probador o tester. Funcionan como la siguiente sentencia element(sym)'value' donde la parte element representa el tipo de elemento seleccionado y (sym) es el símbolo necesario. Los símbolos son # para los ID (element#idvalue o #idvalue) y . para las clases (element.classvalue o .classvalue).

El usuario también puede unir estas dos formas, para crear una sentencia similar a element(sym)'value'[attribute='value'].

También existe la posibilidad de anidar los elementos (es decir, hacer referencia a un elemento en función del elemento padre). Se hace con el símbolo > como en la sentencia parentelement[attribute=attrvalue]>element[attribute=attrvalue] o cualquiera de las otras posibilidades dichas antes en su lugar.

 

Ejemplos:

Las imágenes siguientes muestran, por ejemplo, algunas formas diferentes de identificar un objeto:

In this specific case, there is an ID. It is usually the easiest way to ensure an unique identification, so any of the following are supposed to find the element without problems:

  • input#lst-ib
  • #lst-ib
  • input[id='lst-ib']
  • [id='lst-ib']
  • input[id$='-ib']
  • input#lst-ib[role='combobox']
  • #lst-ib[maxlength='2048']
  • input[id='lst-ib'][style*='image/gif;base64']

The last three are, in this case, unnecessary, due to there are no more elements with the “lst-ib” ID. Even so, it is possible to add as much info as needed to the sentence.

In case the object had no ID determined, it would be possible to concatenate as many attributes as we think are enough for identifying only the desired object:

  • input[title='Suche'][aria-label=“suche”][name='q']

As a second example, in the image at the right side, there is another screenshot where can find no ID attribute for the <div> “Deutschland”. This is an element that has a class “logo-subtext”. The user can face two scenarios (this class represents univocally the element or not). Regarding the first scenario, some possibilities would be:

  • div.logo-subtext
  • .logo-subtext
  • div[class='logo-subtext']
  • [class='logo-subtext']

If the case is not as said before, we can join more than one attribute or condition, in order to make the identification possible. Since this element has no more attributes, the user can get advantage of the nest functionality of CSS Selector:

  • #hplogo>div
  • #hplogo>div.logo-subtext
  • [id='hplogo']>div
  • div[title='Google']>div[class=logo-subtext]

As is seen in the first image, there is a possibility to get directly a CSS Selector by choosing the element and seeing (not possible to copy) the code in the very right bottom of the image. If using Google Chrome, it also possible to click with the right button in the element needed and click on “Copy selector”.

Para más información sobre el selector CSS pulsamos aquí.