Estou com problemas para selecionar nós por atributo quando os atributos contêm mais de uma palavra. Por exemplo:
<div class="atag btag" />
Esta é a minha expressão xpath:
//*[@class='atag']
A expressão trabalha com
<div class="atag" />
mas não para o exemplo anterior. Como posso selecionar o <div>
?
div.atag
oudiv.btag
. Super simples, sem correspondência de cordas e MUITO MAIS rápido (e com melhor suporte nos navegadores). XPath (contra HTML) deve ser relegado para o que é útil para ... encontrar elementos por texto contido e para navegação DOM.Respostas:
Aqui está um exemplo que encontra elementos div cujo className contém
atag
:Aqui está um exemplo que encontra elementos div cujo className contém
atag
ebtag
:No entanto, também encontrará correspondências parciais como
class="catag bobtag"
.Se você não deseja correspondências parciais, veja a resposta de bobince abaixo.
fonte
<div class="Patagonia Halbtagsarbeit">
, que contém as seqüências de destino, mas não é uma div com as classes especificadas.A resposta do mjv é um bom começo, mas falhará se atag não for o primeiro nome de classe listado.
A abordagem usual é a bastante pesada:
isso funciona desde que as classes sejam separadas apenas por espaços, e não outras formas de espaço em branco. Este é quase sempre o caso. Se não for, você precisa torná-lo ainda mais pesado:
(Selecionar por seqüências separadas por espaço, como o nome da classe, é um caso tão comum que surpreende que não exista uma função XPath específica para ela, como '[class ~ = "atag"]' do CSS3.)
fonte
tente isto:
//*[contains(@class, 'atag')]
fonte
grabatagonabag
? (Dica: ainda vai combinar.)EDIT : veja a solução de bobince que usa contém em vez de iniciar , juntamente com um truque para garantir que a comparação seja feita no nível de um token completo (para que o padrão 'atag' não seja encontrado como parte de outra 'tag').
"atag btag" é um valor ímpar para o atributo de classe, mas, no entanto, tente:
fonte
Um XPath 2.0 que funciona:
ou com uma variável:
fonte
@class
tiver mais de um elemento? Porque ele retornará uma lista de palavras e a comparação com uma string falhará com cardinalidade errada .//*[tokenize(@class)=$classname]
//*[@class=$classname]
Esteja ciente de que a resposta de bobince pode ser muito complicada se você puder assumir que o nome da classe em que você está interessado não é uma subcadeia de outro nome de classe possível . Se isso for verdade, você pode simplesmente usar a correspondência de substring através da função contains. A seguir, corresponderá a qualquer elemento cuja classe contenha a subcadeia 'atag':
Se a suposição acima não for válida, uma correspondência de substring corresponderá aos elementos que você não pretende. Nesse caso, você precisa encontrar os limites da palavra. Usando os delimitadores de espaço para encontrar os limites do nome da classe, a segunda resposta de bobince encontra as correspondências exatas:
Isso vai combinar
atag
e nãomatag
.fonte
Para adicionar à resposta de bobince ... Se qualquer ferramenta / biblioteca que você usar usar o Xpath 2.0, você também poderá fazer isso:
Aparentemente, count () é necessário porque index-of () retorna uma sequência de cada índice com o qual corresponde na string.
fonte
$classname
variável entre aspas? Porque, como é, é uma string.'$classname'
claro.Você pode tentar o seguinte
By.CssSelector("div.atag.btag")
fonte
Eu vim aqui procurando solução para o Ranorex Studio 9.0.1. Ainda não há contains (). Em vez disso, podemos usar regex como:
fonte
Para os links que contêm url comum tem que consolar em uma variável. Em seguida, tente sequencialmente.
fonte