¿Alguna vez has mapeado un elemento en tu objeto de página, se ejecuta increíble la primera vez y luego… ¿De repente dejas de encontrar el elemento de un momento a otro? Esto puede ocurrir por muchas razones. Una de las razones podría ser que el elemento que estas tratando de mapear, es dinámico.
Por dinámico, quiero decir que el localizador del elemento cambia cada vez que se carga la página. Los desarrolladores hacen esto por varias razones que pueden inspirar un artículo completamente diferente.
Tomemos como ejemplo un elemento de este blog. Si va a la página de inicio e inspecciona las publicaciones que aparecen, notará que los ID son algo así como
“post-XXX” Y ellos no muestran un patrón numérico claro. Si creamos un script que mapeo “post-294” exactamente, existe la posibilidad de que en el futuro este elemento nos pueda causar problemas.
Pero, ¿Qué podemos hacer para resolver esto?
Hay varias formas de abordar este problema. Cubriremos las más comunes:
Encuentre formas alternativas de localizar el elemento dinámico
Ahora mostraremos nuestra primera solución. Si un método para localizar el elemento (usando su ID directamente) no funciona, ¡pruebe con otro! Selenium ofrece una gran variedad de métodos para localizar un elemento. Lo más probable es que encuentre otro qué mejor se adapte a sus necesidades.
Echemos un vistazo más profundo a nuestro elemento:
Aquí podemos ver que tenemos un <artículo> que está dentro de un <main> que está dentro de un <div>, cada uno de ellos con una identificación aparentemente única. Esto significa que podríamos usar un Xpath relativo o un Selector CSS para llegar al elemento dinámico que queremos.
Un Xpath como este:
| //div/main/article[1]
O un selector de CSS como este:
| div>main>article:first-of-type
Sería suficiente para lograr lo que queremos. Pero, ¿qué pasa si no somos tan afortunados y no tenemos una estructura similar en nuestro HTML que nos permita hacer esto? Bueno, entonces tendríamos que mirar aún más allá.
Revisa los atributos del elemento dinámico
Si echamos otro vistazo a nuestro <artículo>, notaremos que tiene un montón de clases asignadas. Quizás una de esas clases es única y puede ayudarnos a lograr nuestro objetivo.
Por ejemplo:
| post = self.driver.find_element((By.CLASS_NAME, “blog-post”)
Si utilizamos el método predeterminado find_element proporcionado por Selenium, devolverá el primer elemento encontrado que cumpla con los criterios especificados. Que en este caso, es exactamente lo que queremos. Pero, de nuevo, ¿Qué sucede si el elemento dinámico que estamos buscando tampoco tiene una clase única que podamos usar para encontrarlo?
Bueno, ahí es cuando sacamos las grandes armas
Ahí es cuando vamos a nuestro último recurso. Use una XPath que seleccione el elemento dinámico en función de la parte de la ID que no cambia.
| //article[contains(@id, ‘post-‘)][1]
En este XPath, estamos seleccionando primero <article> que su ID contiene “post-“.
Dicho esto, también podemos combinar algunos de estos consejos dependiendo de cuán específicos queremos ser con nuestro localizador, pero ten en cuenta que cuanto más específico es el localizador, más frágil se vuelve.
This article was written by Mike Arias
Senior Software Testing Engineer of TechAID.
Twitter: @theqaboy
Blog: qaboy.com/