Tengo problemas para seleccionar nodos por atributo cuando los atributos contienen más de una palabra. Por ejemplo:
<div class="atag btag" />
Esta es mi expresión xpath:
//*[@class='atag']
La expresión funciona con
<div class="atag" />
pero no para el ejemplo anterior. ¿Cómo puedo seleccionar el <div>
?
div.atag
odiv.btag
. Súper simple, sin coincidencia de cadenas, y MUCHO más rápido (y mejor admitido en los navegadores). XPath (contra HTML) debe relegarse a lo que es útil para ... encontrar elementos por texto contenido y para navegación DOM.Respuestas:
Aquí hay un ejemplo que encuentra elementos div cuyo className contiene
atag
:Aquí hay un ejemplo que encuentra elementos div cuyo className contiene
atag
ybtag
:Sin embargo, también encontrará coincidencias parciales como
class="catag bobtag"
.Si no desea coincidencias parciales, consulte la respuesta de bobince a continuación.
fuente
<div class="Patagonia Halbtagsarbeit">
, lo que contiene las cadenas de destino pero no es un div con las clases dadas.La respuesta de mjv es un buen comienzo, pero fallará si atag no es el primer nombre de clase en la lista.
El enfoque habitual es bastante difícil de manejar:
esto funciona siempre que las clases estén separadas solo por espacios, y no por otras formas de espacios en blanco. Este es casi siempre el caso. Si no es así, debe hacerlo aún más difícil de manejar:
(La selección por cadenas separadas por espacios como nombres de clase es un caso tan común que sorprende que no haya una función XPath específica para ella, como '[class ~ = "atag"]' de CSS3).
fuente
prueba esto:
//*[contains(@class, 'atag')]
fuente
grabatagonabag
? (Sugerencia: aún coincidirá.)EDITAR : vea la solución de bobince que usa contiene en lugar de comenzar con , junto con un truco para garantizar que la comparación se realice al nivel de un token completo (para que el patrón 'atag' no se encuentre como parte de otra 'etiqueta').
"atag btag" es un valor impar para el atributo de clase, pero no obstante, intente:
fuente
Un 2.0 XPath que funciona:
o con una variable:
fuente
@class
tiene más de un elemento? Porque va a devolver una lista de palabras y compararla con una cadena falla con una cardinalidad incorrecta .//*[tokenize(@class)=$classname]
//*[@class=$classname]
Tenga en cuenta que la respuesta de bobince podría ser demasiado complicada si puede suponer que el nombre de la clase que le interesa no es una subcadena de otro posible nombre de clase . Si esto es cierto, simplemente puede usar la coincidencia de subcadenas a través de la función contiene. Lo siguiente coincidirá con cualquier elemento cuya clase contenga la subcadena 'atag':
Si la suposición anterior no se cumple, una coincidencia de subcadena coincidirá con elementos que no desea. En este caso, debe encontrar los límites de las palabras. Al usar los delimitadores de espacio para encontrar los límites del nombre de clase, la segunda respuesta de bobince encuentra las coincidencias exactas:
Esto coincidirá
atag
y nomatag
.fuente
Para agregar a la respuesta de bobince ... Si cualquier herramienta / biblioteca que usa usa Xpath 2.0, también puede hacer esto:
count () aparentemente es necesario porque index-of () devuelve una secuencia de cada índice con el que tiene una coincidencia en la cadena.
fuente
$classname
variable entre comillas? Porque como es, eso es una cadena.'$classname'
de cadena, por supuesto.Puedes probar lo siguiente
By.CssSelector("div.atag.btag")
fuente
Vine aquí buscando una solución para Ranorex Studio 9.0.1. No hay contiene () allí todavía. En cambio, podemos usar expresiones regulares como:
fuente
Para los enlaces que contiene url común hay que consolar en una variable. Luego inténtalo secuencialmente.
fuente