Я ищу селектор CSS для следующей таблицы:
Peter | male | 34
Susanne | female | 12
Есть ли какой-либо селектор для соответствия всем TD, содержащим «мужской»?
css
css-selectors
jantimon
источник
источник
$x
отвечает на вопрос. на оригинальный вопрос,$x("//td[text()='male']")
делает трюкОтветы:
Если я правильно прочитал спецификацию , нет.
Вы можете сопоставить элемент, имя атрибута в элементе и значение именованного атрибута в элементе. Я не вижу ничего для сопоставления содержимого в элементе, хотя.
источник
:empty
.Используя jQuery:
источник
Похоже, они думали об этом для спецификации CSS3, но это не сработало .
:contains()
CSS3 селектор http://www.w3.org/TR/css3-selectors/#content-selectorsисточник
Looks like they were thinking about it for the CSS3 spec but it didn't make the cut.
И по уважительной причине это нарушило бы всю предпосылку разделения стиля, содержания, структуры и поведения.Вам нужно добавить атрибут данных в строки, вызываемые
data-gender
со значениемmale
или,female
и использовать селектор атрибута:HTML:
CSS:
источник
male
илиfemale
? Тот факт, чтоclass
заполнены другими классами, порядок их не гарантируется, могут быть столкновения с именами других классов и т. Д., Чтоclass
еще хуже для такого рода вещей. Выделенныйdata-*
атрибут изолирует ваши данные от всего этого и упрощает их частичное сопоставление и т. Д. С помощью селекторов атрибутов.На самом деле есть очень концептуальная основа, почему это не было реализовано. Это комбинация в основном 3 аспекта:
Эти 3 вместе означают, что к тому времени, когда у вас будет текстовое содержимое, вы не сможете вернуться к содержащемуся элементу и не сможете стилизовать текущий текст. Это, вероятно, важно, так как по убыванию допускается только отдельное отслеживание контекста и синтаксический анализ в стиле SAX. Восходящие или другие селекторы, включающие другие оси, создают необходимость в более сложных обходных или подобных решениях, которые значительно усложнили бы применение CSS в DOM.
источник
text()
функцию XPath .:contains(<sub-selector>)
выбрать элементы, которые содержат другие конкретные элементы. Какdiv:contains(div[id~="bannerAd"])
избавиться от рекламы и ее контейнера.Вы можете установить контент как атрибут данных, а затем использовать селекторы атрибутов , как показано здесь:
Вы также можете использовать jQuery для простой установки атрибутов содержимого данных:
источник
.text()
и.textContent
довольно тяжелый, стараются избегать их в длинных списках или больших текстов , когда это возможно..html()
и.innerHTML
быстро.$("td:contains(male)")
contenteditable='true'
- в моем случае), недостаточно установить значениеdata-content
атрибута до отображения страницы. Он должен постоянно обновляться. Вот что я использую:<td onkeypress="event.target.setAttribute('data-content', event.target.textContent);">
Поскольку в CSS нет этой функции, вам придется использовать JavaScript для стилизации ячеек по содержимому. Например с XPath
contains
:Затем используйте результат так:
https://jsfiddle.net/gaby_de_wilde/o7bka7Ls/9/
источник
Боюсь, что это невозможно, потому что контент не является атрибутом и не доступен через псевдокласс. Полный список селекторов CSS3 можно найти в спецификации CSS3 .
источник
Для тех, кто хочет сделать выделение текста Selenium CSS, этот скрипт может быть полезным.
Хитрость заключается в том, чтобы выбрать родительский элемент для элемента, который вы ищете, а затем найти дочерний элемент с текстом:
Это вернет первый элемент, если их больше одного, так как в моем случае это всегда один элемент.
источник
TD:contains('male')
если вы используете Selenium: imho используйте его, только если вы не можете обновить исходный код для добавления классов. Например, если вы тестируете устаревший код или ваша компания не позволит вам поговорить с разработчиками (да!), потому что ваши тесты будут хрупкими и сломаются, если кто-то позже изменит текст наmasculine
или изменит язык. Документы SauceLabs показывают использованиеcontains
здесь ( saucelabs.com/resources/articles/selenium-tips-css-selectors ) + cc @matas vaitkevicius Я что-то пропустил?Я согласен, что атрибут data (ответ voyager) таков, как он должен обрабатываться, НО, CSS-правила, такие как:
часто может быть намного проще в настройке, особенно с клиентскими библиотеками, такими как angularjs, которые могут быть такими простыми, как:
Просто убедитесь, что содержание только одно слово! Или вы можете даже сопоставить разные имена классов CSS с помощью:
Для полноты рассмотрим подход с использованием атрибутов данных:
источник
@ voyager ответ об использовании
data-*
атрибута (например,data-gender="female|male"
самый эффективный и соответствующий стандартам подход на 2017 год:Практически большинство целей может быть достигнуто, поскольку есть некоторые, хотя и ограниченные селекторы, ориентированные на текст. :: первой буквой является псевдо-элементом , который может применить ограниченный стиль к первой букве элемента. Также есть :: первая линия кроме того, что выбор первой строки элемента (например, абзаца) также подразумевает, что очевидно, что CSS можно использовать для расширения этой существующей возможности для стилизации определенных аспектов textNode. ,
До тех пор, пока такая адвокация не будет успешной и не будет реализована, следующая лучшая вещь, которую я мог бы предложить, когда это применимо, это
explode
/split
слова, использующие разделитель пробелов, выводить каждое отдельное слово внутриspan
элемента, а затем, если цель слова / стиля является предсказуемой, использовать в сочетании с : n-ю селекторами :Иначе, если не предсказуемо , снова используйте ответ voyager об использовании
data-*
атрибута. Пример использования PHP:источник
Если вы используете Chimp / Webdriver.io , они поддерживают намного больше селекторов CSS чем спецификации CSS.
Это, например, нажмет на первый якорь, который содержит слова «Плохой медведь»:
источник
Большинство ответов здесь пытаются предложить альтернативу тому, как написать HTML-код, чтобы включить больше данных, потому что, по крайней мере, до CSS3 вы не можете выбрать элемент с помощью частичного внутреннего текста. Но это можно сделать, вам просто нужно добавить немного ванильного JavaScript, обратите внимание, так как женский также содержит мужской, он будет выбран:
источник
Я считаю, что вариант с атрибутом - ваш лучший выбор, если вы не хотите использовать javascript или jquery.
Например, чтобы оформить все ячейки таблицы словом «готово», в HTML сделайте следующее:
Тогда в css:
источник
Вы также можете использовать
content
сattr()
и стиль таблицы ячеек, которые ::not
:empty
A
ZeroWidthSpace
используется для изменения цвета и может быть добавлен с помощью ванильного JavaScript:Хотя
<td>
тег s end может быть опущен , это может привести к тому, что он будет рассматриваться как непустой.источник
Если вы не создаете DOM самостоятельно (например, в сценарии пользователя), вы можете сделать следующее с чистым JS:
Консольный вывод
источник
Делать маленькие фильтрующие виджеты вот так:
источник
Синтаксис этого вопроса выглядит как синтаксис Robot Framework. В этом случае, хотя нет никакого селектора css, который вы можете использовать для содержит, есть ключевое слово SeleniumLibrary, которое вы можете использовать вместо этого. Подождите , пока элемент не содержит .
Пример:
источник