2011-02-25 25 views
5

Estoy haciendo algunas pruebas de aplicaciones web usando Selenium IDE, y me gustaría introducir algo de aleatoriedad para extender nuestras pruebas. Actualmente estoy usando Selenium's storeAttributeValue, donde le das una expresión XPath y almacena el primer elemento que coincide con ella (sorta). Sin embargo, no quiero almacenar la primera coincidencia, me gustaría que seleccione aleatoriamente un nodo hijo.XPath selecciona un nodo hijo al azar

p. Ej.

//table[@id='mytable']//tr selecciona todos los elementos secundarios de esta tabla. //table[@id='mytable']//tr[0] selecciona el primer tr (suponiendo tablas anidadas ahora) //table[@id='mytable']//tr[3] selecciona el tercer tr, etc.

¿Hay alguna manera (en su totalidad en XPath) lo que puedo decir "Dame un tr azar", es decir, que cada vez que //table[@id='mytable']//tr[SOMETHINGHERE] 'evalulate'/'run' devolverá un tr node que está en el conjunto de //table[@id='mytable']//tr.

+0

'// tabla [@ id = 'mitabla'] // tr [0]' selecciona nada porque '[0]' se ampliaría para '[position() = 0]'. –

+0

@Alejandro ¡Vaya! Corregido culpar a un sueño de la tarde del viernes – Rory

+0

¿Qué quiere decir con "al azar"? Tenga en cuenta que estamos en un entorno declarativo ... –

Respuesta

4

Si la expresión XPath no va a cambiar de una invocación a otra, y la fuente de entrada también será la misma, entonces deberá proporcionar la varianza por parametrización, de lo contrario la misma función con el la misma entrada siempre arrojará el mismo resultado (es por eso que he hecho el comentario sobre el paradigma declarativo).

Algo así como:

/table[@id='mytable']/tbody/tr[$pseudoRandom mod count(../tr) + 1] 

Si no va a ser una evaluación por cada fuente de entrada, el pseudo más sencilla aleatoriedad en XPath sería

/table[@id='mytable']/tbody/tr[count(//node()|//@*) mod count(../tr) + 1] 

En otras palabras, hacer algo de seudo aleatoriedad cálculo con alguna propiedad de toda la fuente de entrada como semilla.

0

Construct dinámicamente la expresión XPath y luego evaluarlo:

/table[@id='mytable']/tbody/tr[position() = {yourRandom}] 

donde

{yourRandom}

debe ser sustituido en el "esqueleto" de la expresión XPath con un número aleatorio obtenido en el PL que aloja XPath.

Por ejemplo, en C# se usaría el método string.Format() para construir la expresión XPath.

Si está utilizando XSLT, el código que invoca la transformación puede proporcionar como parámetro externo una secuencia de números aleatorios codificados en un fragmento XML. Entonces, el código XSLT usaría cada número aleatorio consecutivo para cada expresión XPath.

2

Si está utilizando comandos bash, se puede obtener un número pseudoaleatorio de la variable aleatoria $ como tales:

/table[@id='mytable']/tbody/tr[floor('"${RANDOM}"' mod count(../tr)+1)] 

Esta era la única manera que podría conseguir un número aleatorio en durante el uso de xmllint para tratar de obtener un nodo hijo al azar. Aquí está el comando usando xmllint y algunos NOMBRE DE ARCHIVO.xml:

xmllint --format --recover --xpath '/table[@id='mytable']/tbody/tr[floor('"${RANDOM}"' mod count(../tr)+1)]' FILENAME.xml 
Cuestiones relacionadas