Estoy buscando un selector CSS para la siguiente tabla:
Peter | male | 34
Susanne | female | 12
¿Hay algún selector que coincida con todos los TD que contengan "masculino"?
css
css-selectors
jantimon
fuente
fuente
$x
respuestas a la pregunta. para la pregunta original,$x("//td[text()='male']")
¿el trucoRespuestas:
Si leo la especificación correctamente, no.
Puede coincidir en un elemento, el nombre de un atributo en el elemento y el valor de un atributo con nombre en un elemento. Sin embargo, no veo nada para hacer coincidir el contenido dentro de un elemento.
fuente
:empty
.Usando jQuery:
fuente
Parece que estaban pensando en ello para la especificación CSS3 pero no logró el corte .
:contains()
Selector CSS3 http://www.w3.org/TR/css3-selectors/#content-selectorsfuente
Looks like they were thinking about it for the CSS3 spec but it didn't make the cut.
Y por una buena razón, violaría toda la premisa de separar el estilo, el contenido, la estructura y el comportamiento.Tendría que agregar un atributo de datos a las filas llamadas
data-gender
con un valormale
ofemale
y usar el selector de atributos:HTML:
CSS:
fuente
male
ofemale
? El hecho de queclass
esté lleno de otras clases, el orden de ellas no está garantizado, puede haber colisiones con otros nombres de clase, etc., haceclass
que este lugar sea peor. Undata-*
atributo dedicado aísla sus datos de todas esas cosas y facilita la coincidencia parcial, etc., utilizando selectores de atributos.En realidad, existe una base muy conceptual de por qué esto no se ha implementado. Es una combinación de básicamente 3 aspectos:
Estos 3 juntos significan que cuando tiene el contenido del texto, no puede ascender de nuevo al elemento contenedor y no puede darle estilo al texto actual. Esto es probablemente significativo ya que descender solo permite un seguimiento singular del contexto y el análisis de estilo SAX. Los selectores ascendentes u otros que involucran otros ejes introducen la necesidad de soluciones transversales más complejas o similares que complicarían en gran medida la aplicación de CSS al DOM.
fuente
text()
función XPath .:contains(<sub-selector>)
seleccionar un elemento que contenga otros elementos específicos. Deseadiv:contains(div[id~="bannerAd"])
deshacerse del anuncio y su contenedor.Puede configurar el contenido como atributo de datos y luego usar selectores de atributos , como se muestra aquí:
También puede usar jQuery para configurar fácilmente los atributos de contenido de datos:
fuente
.text()
y.textContent
son bastante pesados, trate de evitarlos en listas largas o textos grandes cuando sea posible..html()
Y.innerHTML
son rápidos.$("td:contains(male)")
contenteditable='true'
- mi caso), no es suficiente establecer el valor deldata-content
atributo antes de que se renderice la página. Tiene que ser actualizado continuamente. Aquí lo que uso:<td onkeypress="event.target.setAttribute('data-content', event.target.textContent);">
Como CSS carece de esta característica, tendrá que usar JavaScript para diseñar las celdas por contenido. Por ejemplo con XPath's
contains
:Luego usa el resultado así:
https://jsfiddle.net/gaby_de_wilde/o7bka7Ls/9/
fuente
Me temo que esto no es posible, porque el contenido no es un atributo ni es accesible a través de una pseudo clase. La lista completa de selectores CSS3 se puede encontrar en la especificación CSS3 .
fuente
Para aquellos que buscan hacer selecciones de texto Selenium CSS, este script podría ser de alguna utilidad.
El truco consiste en seleccionar el elemento primario del elemento que está buscando y luego buscar el elemento secundario que tiene el texto:
Esto devolverá el primer elemento si hay más de uno, ya que siempre es un elemento, en mi caso.
fuente
TD:contains('male')
si estás usando Selenium: solo lo usaré si no puedes actualizar la fuente para agregar clases. por ejemplo, si está probando código heredado o su empresa no le permite hablar con los desarrolladores (¡eurgh!) porque sus pruebas serán frágiles y se romperán si alguien cambia el texto más adelantemasculine
o cambia el idioma. Los documentos de SauceLabs muestran el uso decontains
aquí ( saucelabs.com/resources/articles/selenium-tips-css-selectors ) + cc @matas vaitkevicius ¿Me he perdido algo?Estoy de acuerdo en que el atributo de datos (respuesta del viajero) es cómo debe manejarse, PERO, reglas CSS como:
a menudo puede ser mucho más fácil de configurar, especialmente con libs del lado del cliente como angularjs, que podría ser tan simple como:
¡Solo asegúrate de que el contenido sea solo una palabra! O incluso podría asignar a diferentes nombres de clase CSS con:
Para completar, aquí está el enfoque de atributos de datos:
fuente
La respuesta de @ voyager sobre el uso de
data-*
atributos (por ejemplo,data-gender="female|male"
es el enfoque más efectivo y compatible con los estándares a partir de 2017:Casi la mayoría de los objetivos se pueden alcanzar ya que hay algunos selectores, aunque limitados, orientados alrededor del texto. La :: primera letra es un pseudo-elemento que puede aplicar un estilo limitado a la primera letra de un elemento. También hay una :: primera línea pseudo-elemento , además de seleccionar obviamente la primera línea de un elemento (como un párrafo) también implica que es obvio que CSS podría usarse para extender esta capacidad existente para diseñar aspectos específicos de un nodo de texto .
Hasta que dicha promoción tenga éxito y se implemente, lo mejor que podría sugerir cuando corresponda es a
explode
/split
palabras usando un deliminador de espacio, envíe cada palabra individual dentro de unspan
elemento y luego, si el objetivo de palabra / estilo es predecible, use en combinación con : enésimo selectores :De lo contrario, si no es predecible , nuevamente, use la respuesta del viajero sobre el uso del
data-*
atributo. Un ejemplo usando PHP:fuente
Si está utilizando Chimp / Webdriver.io , admiten muchos más selectores CSS que la especificación CSS.
Esto, por ejemplo, hará clic en el primer ancla que contiene las palabras "Oso malo":
fuente
La mayoría de las respuestas aquí intentan ofrecer una alternativa a cómo escribir el código HTML para incluir más datos porque al menos hasta CSS3 no puede seleccionar un elemento por texto interno parcial. Pero se puede hacer, solo necesita agregar un poco de JavaScript vainilla, tenga en cuenta que ya que la hembra también contiene el macho, se seleccionará:
fuente
Creo que la opción de atributo es su mejor opción si no desea usar javascript o jquery.
Por ejemplo, para diseñar todas las celdas de la tabla con la palabra lista, en HTML haga esto:
Luego en css:
fuente
También puede usar
content
conattr()
y las celdas de tabla de estilo que son ::not
:empty
A
ZeroWidthSpace
se usa para cambiar el color y se puede agregar usando JavaScript de vainilla:Aunque se puede omitir la
<td>
etiqueta de finalización s, al hacerlo puede tratarse como no vacía.fuente
Si no crea el DOM usted mismo (por ejemplo, en un script de usuario), puede hacer lo siguiente con JS puro:
Salida de la consola
fuente
Hacer pequeños widgets de filtro como este:
fuente
La sintaxis de esta pregunta se parece a la sintaxis de Robot Framework. En este caso, aunque no hay un selector css que pueda usar para contiene, hay una palabra clave SeleniumLibrary que puede usar en su lugar. El elemento Esperar hasta que contenga .
Ejemplo:
fuente