Selenium - Esperar que un elemento cambie de texto

Zoth

Buenos días.

Estoy aprendiendo appium (selenium para móviles) y tengo un botón que es instalar (lo que sea) y tengo que esperar que termine la descarga para volver a usar el mismo botón (es dinámico, va cambiando su texto según). Estoy mirando los wait pero no me funcionan, ¿sabéis algo que pueda usar?

Gracias.

2infy

Creo que hay una función que se llama sleep(), que paraliza todo el tiempo que le digas. Lo malo de esto, que si el programa tarda más tiempo del que le has puesto a la función, dará error.

1 respuesta
Zoth

#2 Estaba probando ese mismo (creo):

Thread.sleep(120000);

Se supone que son 120segundos (2 minutos) pero estoy mirando el comportamiento y cuando termina de instalar se me sale de la aplicación (ejecutando el test), sino se quedaría en ella. ¿Puede ser que haya un "cambio" en el software y se caiga con el sleep en ejecución?

1 respuesta
arthas_23

No puedes comprobar de alguna manera el cambio del texto y/o la imagen que muestra? ya que el botón es dinamico se regirá por esta lógica.

1 respuesta
2infy

#3 ¿Puede ser que cuando acabe de instalar se ejecute alguna función que cierre el proceso completamente, un break o algo así?

1 respuesta
Zoth

#5 Eso estaba pensando porque da como la impresión de que se cierra ese proceso para volver a ejecutarse.

#4 #5 De momento lo estoy haciendo de la siguiente manera y parece funcionar, pero a mí no me termina de convencer... :

        if(driver.findElement(btGeneral).isDisplayed())
        {
            if(driver.findElement(btGeneral).getText().equals(">  Instalar"))
            {
                Boolean fin = false ;
                driver.findElement(btGeneral).click() ;
                do{
                    Thread.sleep(20000) ;
                    if(!driver.findElement(btGeneral).getText().equals(">  Cancelar"))
                    {
                        fin = true ;
                    }
                }while(fin!=true) ;
            }

        Thread.sleep(5000) ;
        driver.findElement(btGeneral).click() ;
    }
}

Usando de esta manera los sleep sí que me va bien aunque se "cierre" y vuelva a abrir instantáneo. Luego lo paro para que le de tiempo a la aplicación a refrescar el texto del botón y usarlo.

arthas_23

puedes buscar el elemento por xhtml, así es como hacía yo el tema del mapeo. Si depende de un evento de javascript o lo que sea, puedes ponerlo dependiente del evento

1 respuesta
Zoth

#7 En este caso no puedo, estoy con Android y no tiene algunos elementos de búsqueda como ese (o cssSelector)... :(

1 respuesta
arthas_23

#8 pues adios a la otra solucion que te iba a proponer.

Le doy una vuelta a ver si me acuerdo de otro método, ya que para estas soluciones yo utilizé Java.

1 respuesta
Zoth

#9 Para que te hagas una idea:

Eso lo saco con Android Studio. Eso es de un botón, no tengo cojones a localizarlo y hacerle click. Ni por xpath buscando por content-desc ni nada, porque no sé qué otra cosa podría buscar que se diferencie del resto.

1 respuesta
1 mes después
W

#10 Supongo que ya sacarías una manera de hacerlo.. pero has probado a sacarte una lista de webelements y acceder al elemento de forma estática? Me refiero a usar el UiAutomator y echarle un ojo a la estructura del screenshot que te hace, se puede acceder por el index mismo que muestras en la imagen. Yo lo he hecho alguna vez, pero obviamente si cambia la estructura es bastante guarrada...

1 respuesta
Zoth

#11 Por index no lo probé ¿cómo sería? Para un futuro :)

1 respuesta
W

#12 Estoy escribiendo de memoria, pero algo asi.. ten en cuenta de que va a sacar todos los elementos de esa clase que se muestren por pantalla en ese momento, y lo dicho, si eso cambia, pues el número de elementos cambiará también.. lo que yo hacía era meter algunas comprobaciones para ver que la app seguía siendo parecida (el nº de elementos era el mismo, por ejemplo), para intentar no estar accediendo a un null o peor, a otro elemento que no sea el que buscas.

List<WebElement> l = findElementsByClass("android.view.View");
l.get(0).click(); // esto sería el elemento que buscas.

Por curiosidad, ¿en tu trabajo trabajas con appium, o estás por tu cuenta?

1 respuesta
Zoth

#13 Ah perdona, eso sí, me refiero a buscarlo por id, si hay algún comando que lo haga o te refieres con el xPath por ejemplo :)

Sí, en mi trabajo estamos mirando appium, a ver qué tal.

Usuarios habituales