Estou procurando um seletor de CSS para a seguinte tabela:
Peter | male | 34
Susanne | female | 12
Existe algum seletor para corresponder a todos os TDs que contêm "macho"?
css
css-selectors
jantimon
fonte
fonte
$x
respostas a pergunta. para a pergunta original,$x("//td[text()='male']")
faz o truqueRespostas:
Se eu li a especificação corretamente, não.
Você pode corresponder em um elemento, o nome de um atributo no elemento e o valor de um atributo nomeado em um elemento. Não vejo nada para corresponder conteúdo dentro de um elemento.
fonte
:empty
.Usando jQuery:
fonte
Parece que eles estavam pensando sobre isso na especificação CSS3, mas não foi suficiente .
:contains()
Seletor CSS3 http://www.w3.org/TR/css3-selectors/#content-selectorsfonte
Looks like they were thinking about it for the CSS3 spec but it didn't make the cut.
E por boas razões, isso violaria toda a premissa de separar estilo, conteúdo, estrutura e comportamento.Você precisaria adicionar um atributo de dados às linhas chamadas
data-gender
com amale
oufemale
value e usar o seletor de atributos:HTML:
CSS:
fonte
male
oufemale
? O fato declass
ser preenchido com outras classes, a ordem delas não é garantida, pode haver colisões com outros nomes de classes, etc., torna oclass
local pior para esse tipo de coisa. Umdata-*
atributo dedicado isola seus dados de todas essas coisas e facilita a correspondência parcial, etc., usando seletores de atributos.Na verdade, existe uma base muito conceitual para o porquê disso não ter sido implementado. É uma combinação de basicamente três aspectos:
Esses três juntos significam que, quando você tiver o conteúdo do texto, não poderá voltar ao elemento que o contém e não poderá estilizar o texto atual. Provavelmente, isso é significativo, pois a descida permite apenas um rastreamento singular do contexto e da análise do estilo SAX. Os seletores ascendentes ou outros envolvendo outros eixos introduzem a necessidade de soluções transversais ou similares mais complexas que complicariam bastante a aplicação de CSS ao DOM.
fonte
text()
função XPath .:contains(<sub-selector>)
selecionar um elemento que contenha outros elementos específicos. Gostariadiv:contains(div[id~="bannerAd"])
de se livrar do anúncio e do seu contêiner.Você pode definir o conteúdo como atributo de dados e, em seguida, usar seletores de atributo , conforme mostrado aqui:
Você também pode usar o jQuery para definir facilmente os atributos de conteúdo de dados:
fonte
.text()
e.textContent
são bastante pesados, tente evitá-los em listas longas ou em textos grandes sempre que possível..html()
e.innerHTML
são rápidos.$("td:contains(male)")
contenteditable='true'
- meu caso), não será suficiente definir o valor dodata-content
atributo antes que a página seja renderizada. Tem que ser atualizado continuamente. Aqui o que eu uso:<td onkeypress="event.target.setAttribute('data-content', event.target.textContent);">
Como o CSS não possui esse recurso, você precisará usar JavaScript para estilizar as células por conteúdo. Por exemplo, com XPath
contains
:Em seguida, use o resultado da seguinte maneira:
https://jsfiddle.net/gaby_de_wilde/o7bka7Ls/9/
fonte
Receio que isso não seja possível, porque o conteúdo não é um atributo nem é acessível através de uma pseudo classe. A lista completa de seletores CSS3 pode ser encontrada na especificação CSS3 .
fonte
Para aqueles que desejam fazer seleções de texto em CSS do Selenium, esse script pode ser útil.
O truque é selecionar o pai do elemento que você está procurando e procurar o filho que possui o texto:
Isso retornará o primeiro elemento se houver mais de um, pois sempre é um elemento, no meu caso.
fonte
TD:contains('male')
se estiver usando o Selenium: imho só o usará se não puder atualizar a fonte para adicionar classes. por exemplo, se você estiver testando código legado ou sua empresa não permitir que você fale com os desenvolvedores (eurgh!) porque seus testes serão frágeis e serão interrompidos se alguém alterar o texto posteriormentemasculine
ou alterar o idioma. Os documentos do SauceLabs mostram o usocontains
aqui ( saucelabs.com/resources/articles/selenium-tips-css-selectors ) + cc @matas vaitkevicius Perdi alguma coisa?Concordo que o atributo de dados (resposta do viajante) é como ele deve ser tratado, MAS, regras de CSS como:
muitas vezes pode ser muito mais fácil de configurar, especialmente com bibliotecas do lado do cliente, como angularjs, que podem ser tão simples quanto:
Apenas certifique-se de que o conteúdo seja apenas uma palavra! Ou você pode até mapear para diferentes nomes de classes CSS com:
Para completar, eis a abordagem de atributo de dados:
fonte
A resposta da @ voyager sobre o uso do
data-*
atributo (por exemplo,data-gender="female|male"
é a abordagem mais eficaz e compatível com os padrões a partir de 2017:Quase todos os objetivos podem ser alcançados, pois existem alguns seletores, embora limitados, orientados ao redor do texto. A :: first-letter é um pseudo-elemento que pode aplicar um estilo limitado à primeira letra de um elemento. Há também um pseudo-elemento :: first-line , além de obviamente selecionar a primeira linha de um elemento (como um parágrafo) também implica que é óbvio que o CSS pode ser usado para estender esse recurso existente para estilizar aspectos específicos de um textNode .
Até que essa defesa seja bem - sucedida e seja implementada, a próxima melhor coisa que eu poderia sugerir, quando aplicável, é
explode
/split
words usando um delimitador de espaço, produza cada palavra individual dentro de umspan
elemento e, em seguida, se o objetivo da palavra / estilo for previsível, em combinação com : nth seletores :Else se não previsível para, mais uma vez, a resposta uso da Voyager sobre o uso do
data-*
atributo. Um exemplo usando o PHP:fonte
Se você estiver usando o Chimp / Webdriver.io , eles suportam muito mais seletores de CSS do que a especificação de CSS.
Isso, por exemplo, clicará na primeira âncora que contém as palavras "urso ruim":
fonte
A maioria das respostas aqui tenta oferecer uma alternativa a como escrever o código HTML para incluir mais dados, porque pelo menos até CSS3 você não pode selecionar um elemento pelo texto interno parcial. Mas isso pode ser feito, você só precisa adicionar um pouco de JavaScript baunilha, observe que feminino também contém masculino, ele será selecionado:
fonte
Acho que a opção de atributo é sua melhor aposta, se você não quiser usar javascript ou jquery.
Por exemplo, para estilizar todas as células da tabela com a palavra ready, no HTML, faça o seguinte:
Em seguida, em css:
fonte
Você também pode usar
content
comattr()
e células de tabela de estilo que são ::not
:empty
A
ZeroWidthSpace
é usado para alterar a cor e pode ser adicionado usando JavaScript vanilla:Embora a
<td>
tag s end possa ser omitida, isso pode fazer com que ela seja tratada como não vazia.fonte
Se você não criar o DOM (por exemplo, em um script de usuário), poderá fazer o seguinte com JS puro:
Saída do console
fonte
Fazendo pequenos widgets de filtro como este:
fonte
A sintaxe desta pergunta se parece com a sintaxe do Robot Framework. Nesse caso, embora não exista um seletor de CSS que você possa usar contém, existe uma palavra-chave SeleniumLibrary que você pode usar. O elemento Esperar até que contenha .
Exemplo:
fonte