python html selenium dom selenium-webdriver

¿Cómo puedo asegurarme de que algunos elementos HTML estén cargados para Selenium+Python?



dom selenium-webdriver (2)

Encontré la respuesta al verificar el comportamiento de carga de HTML.

Básicamente, el HTML se carga al revés, dicho esto, solo tengo que comprobar si hay un elemento detrás del elemento, por ejemplo, si aparece otro elemento, solo comprobar si se presenta otro elemento o no. Si es así, entonces todos los elementos deben estar cargados.

Desde este enlace, asumo que el DOM debe cargarse como un todo al principio en la RAM.

¿Cómo funciona / se carga DOM? (en HTML)

Pero luego hago pruebas en Selenium con una excepción de tiempo de espera. Parece que incluso la excepción de tiempo de espera está activada, ya se pueden encontrar algunos elementos, por lo que no es un objeto vacío.

Pero me pregunto, ¿cómo puedo asegurarme de que algunos elementos ya estén cargados? Por ejemplo, el ejemplo de HTML, ¿cómo puedo asegurarme de que todos los elementos <th> estén cargados? Dado el hecho de que en realidad no sé el número de los elementos <th> .

Código de prueba:

driver = webdriver.Chrome() driver.set_page_load_timeout(10) try: driver.get(url) print(''load success!'') except TimeoutException: print(self.page_source)

Ejemplo de HTML:

<table width="910" border="0" cellpadding="3" cellspacing="0" id="fth1_" class="fth1_" style="display: none; position: fixed; top: 29px; left: 99px;"> <thead style="background-color: rgb(233, 233, 233);"> <tr align="center"> <th id="f13" style="width: 121px;"><a href="t/?i=614&amp;o=1">Symbol</a></th> <th id="f13" style="width: 267px;"><a href="t/?i=614&amp;o=2">Name</a></th> </tr> </thead> </table>


Según las pruebas de código, utiliza ChromeDriver y Chrome Browser para automatizar los pasos. Como ha configurado set_page_load_timeout(10) la excepción de tiempo de espera se activa porque la página no se ha cargado completamente dentro del período de tiempo configurado a través de set_page_load_timeout() . Pero a medida que invoca print(self.page_source) los elementos representados en el DOM de HTML parcialmente representado.

Ahora acerca de sus consultas individuales:

  • How can I make sure some elements are already loaded? : Un testcase ideal tendría un paso definido, por ejemplo, para validar la presencia de un elemento, para validar la visibilidad de un elemento o para validar la interactividad (mientras hace clic) del elemento. Desde esta perspectiva, la verificación de que los elementos ya están cargados puede no incluir el elemento deseado. Por lo tanto, en lugar de un criterio de búsqueda más amplio, necesita reducir su criterio de búsqueda a algo definido, por ejemplo,

    • Título de la página
    • Encabezado de página
    • Presencia de una alerta
    • Atributo de un elemento
    • Presencia de un elemento.
    • Presencia de un conjunto de elementos.
    • Visibilidad de un elemento.
    • Visibilidad de un conjunto de elementos.
    • Clickablity de un elemento
    • StalenessOf de un elemento
    • FrameToBeAvailableAndSwitchToIt

La implementación de estos criterios de búsqueda reducidos puede ahorrar mucho tiempo de ejecución con la ayuda de WebDriverWait expected_conditions con expected_conditions .

  • How can I make sure all elements are loaded? : Nuevamente, nuestras pruebas deben enfocarse solo en el elemento / elementos con los que necesitamos interactuar y dejar de lado para verificar el estado / condición de otros elementos que no son de nuestro interés.

  • Ahora, siguiendo los dos puntos mencionados anteriormente, estos son los 3 casos de uso más utilizados:

    • presence_of_element_located : una expectativa para verificar que un elemento esté presente en el DOM de una página. Esto no significa necesariamente que el elemento sea visible.
    • visibility_of_element_located : una expectativa para verificar que un elemento esté presente en el DOM de una página y sea visible. Visibilidad significa que el elemento no solo se muestra, sino que también tiene una altura y un ancho que es mayor que 0.
    • element_to_be_clickable : una expectativa para verificar un elemento es visible y está habilitada de tal manera que puede hacer clic en él
  • De acuerdo con el caso de uso que mencionó, puede hacer que una Lista de todos los elementos <th> visibles dentro del Árbol DOM mientras espera una cantidad de tiempo configurable que induce a WebDriverWait de la siguiente manera:

    from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC headerList = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class=''fth1_'' and @id=''fth1_'']/thead/tr//th")))

Nota : el xpath utilizado en esta ilustración es un ejemplo de xpath que se utiliza solo para fines de demostración.