Ich bin auf der Suche nach einem CSS-Selektor für die folgende Tabelle:
Peter | male | 34
Susanne | female | 12
Gibt es einen Selektor für alle TDs, die "männlich" enthalten?
Ich bin auf der Suche nach einem CSS-Selektor für die folgende Tabelle:
Peter | male | 34
Susanne | female | 12
Gibt es einen Selektor für alle TDs, die "männlich" enthalten?
Wenn Sie das DOM nicht selbst erstellen (z. B. in einem Benutzerskript), können Sie das Folgende mit reinem JS tun:
for ( td of document.querySelectorAll('td') ) {
console.debug("text:", td, td.innerText)
td.setAttribute('text', td.innerText)
}
for ( td of document.querySelectorAll('td[text="male"]') )
console.debug("male:", td, td.innerText)
<table>
<tr>
<td>Peter</td>
<td>male</td>
<td>34</td>
</tr>
<tr>
<td>Susanne</td>
<td>female</td>
<td>12</td>
</tr>
</table>
Ausgabe auf der Konsole
text: <td> Peter
text: <td> male
text: <td> 34
text: <td> Susanne
text: <td> female
text: <td> 12
male: <td text="male"> male
Hervorragende Antworten, aber ich denke, ich kann etwas hinzufügen, das für mich in einem praktischen Szenario funktioniert hat: die Ausnutzung der aria-label
Attribut für CSS.
Für die Leser, die es nicht wissen: aria-label
ist ein Attribut, das in Verbindung mit anderen ähnlichen Attributen verwendet wird, um einem Screen-Reader mitzuteilen, was etwas ist, falls jemand mit einer Sehbehinderung Ihre Website nutzt. Viele Websites fügen diese Attribute zu Elementen mit Bildern oder Text als "Deskriptoren" hinzu.
Dies macht es sehr website-spezifisch, aber falls Ihr Element dieses Attribut enthält, ist es ziemlich einfach, dieses Element über den Inhalt des Attributs auszuwählen:
HTML:
<td aria-label="male">Male</td>
<td aria-label="female">Female</td>
CSS:
td[aria-label="male"] {
outline: 1px dotted green;
}
Dies ist technisch gesehen das Gleiche wie die Lösung mit den Datenattributen, aber es funktioniert für Sie, wenn Sie nicht der Autor der Website sind, und es handelt sich nicht um eine ausgefallene Lösung, die speziell für diesen Anwendungsfall entwickelt wurde; sie ist an sich ziemlich verbreitet. Der einzige Nachteil ist, dass es keine Garantie dafür gibt, dass das von Ihnen gewünschte Element dieses Attribut auch hat.
Wenn Sie Folgendes verwenden Schimpanse / Webdriver.io sie Unterstützung einer Vielzahl von CSS-Selektoren als die CSS-Spezifikation.
So wird z. B. der erste Anker angeklickt, der die Worte "Böser Bär" enthält:
browser.click("a*=Bad Bear");
Die meisten Antworten hier versuchen, Alternativen anzubieten, wie man den HTML-Code schreiben kann, um mehr Daten einzuschließen, denn zumindest bis CSS3 kann man ein Element nicht durch einen teilweisen inneren Text auswählen. Aber es ist möglich, Sie müssen nur ein bisschen Vanilla JavaScript hinzufügen, beachten Sie, da weiblich auch männlich enthält, wird es ausgewählt werden:
cells = document.querySelectorAll('td');
console.log(cells);
[].forEach.call(cells, function (el) {
if(el.innerText.indexOf("male") !== -1){
//el.click(); click or any other option
console.log(el)
}
});
<table>
<tr>
<td>Peter</td>
<td>male</td>
<td>34</td>
</tr>
<tr>
<td>Susanne</td>
<td>female</td>
<td>14</td>
</tr>
</table>
<table>
<tr>
<td data-content="Peter">Peter</td>
<td data-content="male">male</td>
<td data-content="34">34</td>
</tr>
<tr>
<td data-conten="Susanne">Susanne</td>
<td data-content="female">female</td>
<td data-content="14">14</td>
</tr>
</table>
Ich stimme zu das Datenattribut (Antwort von voyager) ist, wie es gehandhabt werden sollte, ABER, CSS-Regeln wie:
td.male { color: blue; }
td.female { color: pink; }
kann oft viel einfacher einzurichten sein, vor allem mit Client-seitigen Bibliotheken wie Angularjs, die so einfach sein können wie:
<td class="{{person.gender}}">
Achten Sie nur darauf, dass der Inhalt nur aus einem Wort besteht! Oder Sie könnten sogar verschiedene CSS-Klassennamen zuordnen mit:
<td ng-class="{'masculine': person.isMale(), 'feminine': person.isFemale()}">
Der Vollständigkeit halber hier der Ansatz für die Datenattribute:
<td data-gender="{{person.gender}}">
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
1 Stimmen
Das Problem ist, dass dies sehr schwer in einer performanten Weise zu implementieren wäre.
11 Stimmen
Ein XPath-Selektor kann dies mit der Methode .text() tun (wenn Sie es vorziehen, keinen JavaScript-Executor zu verwenden).
19 Stimmen
Hier ein Beispiel dafür, wie man es mit xpath machen kann: //h1[text()='Session'] und Sie können xpath in Chrome testen, indem Sie $x("//h1[text()='Session']") in die Konsole eingeben
2 Stimmen
Das wäre so praktisch. Zum Beispiel könnte eine Tabellenzelle, die ein Häkchen oder die Zeichenfolge "Ja", "Bestanden", "OK" usw. enthält, grün sein.
0 Stimmen
Die
$x
beantwortet die Frage. für die ursprüngliche Frage,$x("//td[text()='male']")
erfüllt den Zweck0 Stimmen
@Ms2ger und das ist der Grund, warum es in der Regel in einer imperformanten Weise mit JavaScript implementiert wird :q
0 Stimmen
Die beste Antwort auf die Frage, wie dies in den aktuellen Standards zu bewerkstelligen ist, findet sich unter der akzeptierten Antwort, hier: stackoverflow.com/a/41281583/1163705 und wenn jQuery keine Option ist, kann es auch in Vanilla JS gemacht werden.
0 Stimmen
Ist es möglich, css-Selektor wie xpath "enthält" Methode zu finden? Ich habe dynamische css für das Element, weil dieses Element zu viele Male auf der Seite sein kann.