866 Stimmen

Gibt es einen CSS-Selektor für Elemente, die einen bestimmten Text 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?

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

70voto

Buksy Punkte 10646

Sie könnten Inhalt als Datenattribut festlegen und dann Attributselektoren wie hier gezeigt:

/* Select every cell matching the word "male" */
td[data-content="male"] {
  color: red;
}

/* Select every cell starting on "p" case insensitive */
td[data-content^="p" i] {
  color: blue;
}

/* Select every cell containing "4" */
td[data-content*="4"] {
  color: green;
}

<table>
  <tr>
    <td data-content="Peter">Peter</td>
    <td data-content="male">male</td>
    <td data-content="34">34</td>
  </tr>
  <tr>
    <td data-content="Susanne">Susanne</td>
    <td data-content="female">female</td>
    <td data-content="14">14</td>
  </tr>
</table>

Sie können auch jQuery verwenden, um die Dateninhaltsattribute einfach festzulegen:

$(function(){
  $("td").each(function(){
    var $this = $(this);
    $this.attr("data-content", $this.text());
  });
});

31voto

user40521 Punkte 1758

Da CSS diese Funktion nicht hat, müssen Sie JavaScript verwenden, um Zellen nach Inhalt zu formatieren. Zum Beispiel mit XPaths contains :

var elms = document.evaluate( "//td[contains(., 'male')]", node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null )

Verwenden Sie das Ergebnis dann wie folgt:

for ( var i=0 ; i < elms.snapshotLength; i++ ){
   elms.snapshotItem(i).style.background = "pink";
}

https://jsfiddle.net/gaby_de_wilde/o7bka7Ls/9/

10voto

den232 Punkte 538

Ab Januar 2021 gibt es etwas, das genau das tut :has() ... nur einen Haken: es wird noch von keinem Browser unterstützt

Beispiel: Der folgende Selektor findet nur Elemente, die direkt ein Kind enthalten:

a:has(> img)

Referenzen:

https://developer.mozilla.org/en-US/docs/Web/CSS/:has

https://caniuse.com/?search=has

8voto

Edwin V. Punkte 1297

Ich fürchte, das ist nicht möglich, denn der Inhalt ist weder ein Attribut noch ist er über eine Pseudoklasse zugänglich. Die vollständige Liste der CSS3-Selektoren ist zu finden unter die CSS3-Spezifikation .

8voto

Matas Vaitkevicius Punkte 53532

Für diejenigen, die Selenium-CSS-Textauswahlen durchführen möchten, könnte dieses Skript von Nutzen sein.

Der Trick besteht darin, das übergeordnete Element des gesuchten Elements auszuwählen und dann nach dem untergeordneten Element zu suchen, das den Text enthält:

public static IWebElement FindByText(this IWebDriver driver, string text)
{
    var list = driver.FindElement(By.CssSelector("#RiskAddressList"));
    var element = ((IJavaScriptExecutor)driver).ExecuteScript(string.Format(" var x = $(arguments[0]).find(\":contains('{0}')\"); return x;", text), list);
    return ((System.Collections.ObjectModel.ReadOnlyCollection<IWebElement>)element)[0];
}

Dies wird das erste Element zurückgeben, wenn es mehr als ein Element gibt, da es in meinem Fall immer ein Element ist.

CodeJaeger.com

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.

Powered by:

X