Je recherche un sélecteur CSS pour le tableau suivant:
Peter | male | 34
Susanne | female | 12
Existe-t-il un sélecteur pour faire correspondre tous les DT contenant "masculin"?
css
css-selectors
jantimon
la source
la source
$x
réponses à la question. pour la question d'origine,$x("//td[text()='male']")
fait l'affaireRéponses:
Si je lis correctement la spécification , non.
Vous pouvez faire correspondre un élément, le nom d'un attribut dans l'élément et la valeur d'un attribut nommé dans un élément. Cependant, je ne vois rien pour faire correspondre le contenu d'un élément.
la source
:empty
.Utilisation de jQuery:
la source
On dirait qu'ils y pensaient pour la spécification CSS3, mais cela n'a pas fait la coupe .
:contains()
Sélecteur CSS3 http://www.w3.org/TR/css3-selectors/#content-selectorsla source
Looks like they were thinking about it for the CSS3 spec but it didn't make the cut.
Et pour une bonne raison, cela violerait toute la prémisse de séparer le style, le contenu, la structure et le comportement.Vous devez ajouter un attribut de données aux lignes appelées
data-gender
avec une valeurmale
oufemale
et utiliser le sélecteur d'attribut:HTML:
CSS:
la source
male
oufemale
? Le fait qu'ilclass
soit rempli d'autres classes, l'ordre de celles-ci n'est pas garanti, il peut y avoir des collisions avec d'autres noms de classe, etc. faitclass
un pire endroit pour ce genre de choses. Undata-*
attribut dédié isole vos données de tout cela et facilite la correspondance partielle, etc., à l'aide de sélecteurs d'attributs.Il existe en fait une base très conceptuelle pour expliquer pourquoi cela n'a pas été mis en œuvre. Il s'agit d'une combinaison de 3 aspects fondamentaux:
Ensemble, ces 3 signifient qu'au moment où vous avez le contenu du texte, vous ne pouvez pas remonter à l'élément contenant, et vous ne pouvez pas styliser le texte actuel. Ceci est probablement significatif car la descente ne permet qu'un suivi singulier du contexte et de l'analyse de style SAX. Des sélecteurs ascendants ou autres impliquant d'autres axes introduisent le besoin d'une traversée plus complexe ou de solutions similaires qui compliqueraient grandement l'application de CSS au DOM.
la source
text()
fonction de XPath .:contains(<sub-selector>)
pour sélectionner un élément qui contient d'autres éléments spécifiques. Vousdiv:contains(div[id~="bannerAd"])
souhaitez vous débarrasser de l'annonce et de son conteneur.Vous pouvez définir le contenu comme attribut de données, puis utiliser des sélecteurs d'attribut , comme illustré ici:
Vous pouvez également utiliser jQuery pour définir facilement les attributs de contenu de données:
la source
.text()
et.textContent
sont assez lourds, essayez de les éviter dans les longues listes ou les gros textes lorsque cela est possible..html()
et.innerHTML
sont rapides.$("td:contains(male)")
contenteditable='true'
- mon cas), il ne suffit pas de définir la valeur de l'data-content
attribut avant le rendu de la page. Il doit être mis à jour en permanence. Voici ce que j'utilise:<td onkeypress="event.target.setAttribute('data-content', event.target.textContent);">
Comme CSS ne dispose pas de cette fonctionnalité, vous devrez utiliser JavaScript pour styliser les cellules en fonction du contenu. Par exemple avec XPath
contains
:Ensuite, utilisez le résultat comme ceci:
https://jsfiddle.net/gaby_de_wilde/o7bka7Ls/9/
la source
J'ai bien peur que ce ne soit pas possible, car le contenu n'est pas un attribut ni accessible via une pseudo classe. La liste complète des sélecteurs CSS3 se trouve dans la spécification CSS3 .
la source
Pour ceux qui cherchent à faire des sélections de texte CSS Selenium, ce script pourrait être d'une certaine utilité.
L'astuce consiste à sélectionner le parent de l'élément que vous recherchez, puis à rechercher l'enfant qui a le texte:
Cela retournera le premier élément s'il y en a plus d'un puisque c'est toujours un élément, dans mon cas.
la source
TD:contains('male')
si vous utilisez Selenium: à mon humble avis, ne l'utilisez que si vous ne pouvez pas mettre à jour la source pour ajouter des classes. Par exemple, si vous testez un code hérité ou que votre entreprise ne vous laissera pas parler aux développeurs (eurgh!) car vos tests seront fragiles et se briseront si quelqu'un change le texte plus tardmasculine
ou change de langue. La documentation de SauceLabs montre comment l'utilisercontains
ici ( saucelabs.com/resources/articles/selenium-tips-css-selectors ) + cc @matas vaitkevicius ai-je oublié quelque chose?Je suis d'accord que l'attribut de données (réponse du voyageur) est la façon dont il doit être géré, MAIS, les règles CSS comme:
peut souvent être beaucoup plus facile à configurer, en particulier avec les bibliothèques côté client comme angularjs qui peuvent être aussi simples que:
Assurez-vous simplement que le contenu n'est qu'un mot! Ou vous pouvez même mapper vers différents noms de classe CSS avec:
Pour être complet, voici l'approche des attributs de données:
la source
@ voyager's answer about using
data-*
attribute (par exemple,data-gender="female|male"
c'est l' approche la plus efficace et conforme aux normes en 2017:La plupart des objectifs peuvent être atteints car il existe des sélecteurs, quoique limités, orientés autour du texte. La :: première lettre est un pseudo-élément qui peut appliquer un style limité à la première lettre d'un élément. Il y a aussi un pseudo-élément :: première ligne en plus de sélectionner évidemment la première ligne d'un élément (comme un paragraphe) implique également qu'il est évident que CSS pourrait être utilisé pour étendre cette capacité existante pour styliser des aspects spécifiques d'un textNode .
Jusqu'à ce qu'un tel plaidoyer réussisse et soit mis en œuvre, la prochaine meilleure chose que je pourrais suggérer le cas échéant est de
explode
/split
mots en utilisant un suppresseur d'espace, sortir chaque mot individuel à l'intérieur d'unspan
élément et puis si l'objectif de mot / style est prévisible, utiliser en combinaison avec : nth selectors :Sinon, si ce n'est pas prévisible , encore une fois, utilisez la réponse de Voyager concernant l'utilisation de l'
data-*
attribut. Un exemple utilisant PHP:la source
Si vous utilisez Chimp / Webdriver.io , ils prennent en charge beaucoup plus de sélecteurs CSS que la spécification CSS.
Celui-ci, par exemple, cliquera sur la première ancre qui contient les mots "Bad bear":
la source
La plupart des réponses ici tentent d'offrir une alternative à la façon d'écrire le code HTML pour inclure plus de données, car au moins jusqu'à CSS3, vous ne pouvez pas sélectionner un élément par du texte interne partiel. Mais cela peut être fait, il vous suffit d'ajouter un peu de JavaScript vanille, notez que puisque la femelle contient également le mâle, il sera sélectionné:
la source
Je trouve que l'option d'attribut est votre meilleur choix si vous ne souhaitez pas utiliser javascript ou jquery.
Par exemple, pour styliser toutes les cellules du tableau avec le mot prêt, en HTML, procédez comme suit:
Puis en css:
la source
Vous pouvez également utiliser
content
avecattr()
et styliser des cellules de tableau qui sont ::not
:empty
A
ZeroWidthSpace
est utilisé pour changer la couleur et peut être ajouté à l'aide de JavaScript vanille:Bien que la
<td>
balise de fin s puisse être omise , cela peut la traiter comme non vide.la source
Si vous ne créez pas le DOM vous-même (par exemple dans un script utilisateur), vous pouvez faire ce qui suit avec du JS pur:
Sortie console
la source
Faire de petits widgets de filtre comme ceci:
la source
La syntaxe de cette question ressemble à la syntaxe de Robot Framework. Dans ce cas, bien qu'il n'y ait pas de sélecteur css que vous puissiez utiliser pour contient, il existe un mot clé SeleniumLibrary que vous pouvez utiliser à la place. L' élément Wait Until contient .
Exemple:
la source