def finalizar_tiempo_de_ejecucion(self):
     self.datetime_final = Temporizador.obtener_fecha_tiempo_actual()
     self.tiempo_fin_de_ejecucion = Temporizador.obtener_tiempo_timer()
     self.establecer_tiempo_de_ejecucion()
 def inicializar_tiempo_de_ejecucion(self):
     self.datetime_inicial = Temporizador.obtener_fecha_tiempo_actual()
     self.tiempo_inicio_de_ejecucion = Temporizador.obtener_tiempo_timer()
    def establecer_tiempo_de_finalizacion(objeto_json):
        objeto_json['time'] = Temporizador.obtener_tiempo_timer()
        # objeto_json['status'] = constantes_json.STATUS_CORRECTO
        objeto_json['end'] = Temporizador.obtener_fecha_tiempo_actual()

        return objeto_json
    def navegacion_de_carpetas_por_segundos(lista_carpetas,
                                            driver,
                                            result_list,
                                            numero_de_segundos=120):

        result_navegacion_carpetas = Result()
        result_navegacion_carpetas.inicializar_tiempo_de_ejecucion()
        tiempo_por_verificar = numero_de_segundos + Temporizador.obtener_tiempo_timer(
        )
        tiempo_de_inicio = Temporizador.obtener_tiempo_timer()
        segundos = 0

        # verifica se tenga al menos una carpeta
        if len(lista_carpetas) == 0:
            result_navegacion_carpetas.finalizar_tiempo_de_ejecucion()
            result_navegacion_carpetas.establecer_tiempo_de_ejecucion()
            result_navegacion_carpetas.validacion_correcta = False
            result_navegacion_carpetas.mensaje_error = 'No fue posible localizar las carpetas dentro de la sesi\u00f3n Exchange OWA'
            result_list.result_validacion_navegacion_carpetas = result_navegacion_carpetas
            SeleniumTesting.log.info(
                'No se localizaron carpetas por navegar dentro de la sesion en la plataforma Exchange OWA'
            )

            return result_list

        # verifica que no haya algun mensaje de error en la plataforma, en caso contrario
        # se muestra el mensaje de error que aparace en la plataforma dentro del result
        elif SeleniumTesting.verificar_error_plataforma(driver):

            result_navegacion_carpetas.finalizar_tiempo_de_ejecucion()
            result_navegacion_carpetas.establecer_tiempo_de_ejecucion()
            result_navegacion_carpetas.validacion_correcta = False
            result_navegacion_carpetas.mensaje_error = 'No fue posible realizar la navegacion entre carpetas, se presenta '\
                                                       'el siguiente error dentro de la plataforma: '\
                                                       '{}'.format(SeleniumTesting.txt_mensaje_error_encontrado_owa)
            result_list.result_validacion_navegacion_carpetas = result_navegacion_carpetas

            return result_list

        while Temporizador.obtener_tiempo_timer() <= tiempo_por_verificar:
            for carpeta in lista_carpetas:
                segundos = Temporizador.obtener_tiempo_timer(
                ) - tiempo_de_inicio

                if segundos > numero_de_segundos:
                    SeleniumTesting.log.info(
                        'Ha transcurrido un lapso aproximado de 2 minutos, se procede a cerrar la sesion dentro de la plataforma OWA'
                    )
                    break

                SeleniumTesting.log.info(
                    'Ingresando a la carpeta: {}'.format(carpeta))

                try:

                    if SeleniumTesting.owa_descubierto == 2016:
                        script_click_carpeta = \
                        '''
                            var carpeta = document.querySelector("span._n_C4[title='{}']");
                            return carpeta;
                        '''.format(carpeta)

                        elemento_html_carpeta = driver.execute_script(
                            script_click_carpeta)
                        elemento_html_carpeta.click()
                        time.sleep(6)
                    elif SeleniumTesting.owa_descubierto == 2010:
                        elemento_html_carpeta = driver.find_element_by_xpath(
                            '//a[@name="lnkFldr"][@title="{}"]'.format(
                                carpeta))
                        time.sleep(3)
                        SeleniumTesting.verificar_dialogo_de_interrupcion(
                            driver, result_navegacion_carpetas)
                        time.sleep(3)
                        elemento_html_carpeta.click()
                    elif SeleniumTesting.owa_descubierto == 2013:
                        script_click_carpeta = \
                        '''
                            var carpeta = document.querySelector("span._n_Z6[title='{}']");
                            return carpeta;
                        '''.format(carpeta)

                        elemento_html_carpeta = driver.execute_script(
                            script_click_carpeta)
                        elemento_html_carpeta.click()
                        time.sleep(6)

                except StaleElementReferenceException as e:
                    SeleniumTesting.log.error(
                        'Una de las carpetas no se localiza dentro del DOM de la plataforma OWA, se intentara ingresar nuevamente'
                    )
                    SeleniumTesting.log.error('error: {}'.format(e.msg))

                    driver.refresh()
                    SeleniumTesting.log.error(
                        'Sucedio error al refrescar la plataforma OWA')
                    time.sleep(3)
                except ElementClickInterceptedException as e:
                    SeleniumTesting.log.error(
                        'No fue posible navegar a la carpeta seleccionada, se tiene un elemento HTML interfiriendo en la '\
                        'navegacion de la carpeta, se intentara ingresar nuevamente')

                    SeleniumTesting.log.error('error: {}'.format(e.msg))

                    driver.refresh()
                    SeleniumTesting.log.error(
                        'Sucedio error al refrescar la plataforma OWA')
                    time.sleep(3)
                except NoSuchElementException as e:
                    SeleniumTesting.log.error(
                        'No fue posible localizar la carpeta por navegar dentro de la plataforma OWA, se intentara ingresar nuevamente'
                    )
                    SeleniumTesting.log.error('error: {}'.format(e.msg))

                    driver.refresh()
                    SeleniumTesting.log.error(
                        'Sucedio error al refrescar la plataforma OWA')

                    time.sleep(3)
                except TimeoutException as e:
                    SeleniumTesting.log.error(
                        'Se presenta error de tiempo de carga en la plataforma OWA, se intentara actualizar la plataforma nuevamente'
                    )
                    SeleniumTesting.log.error('error: {}'.format(e.msg))
                    driver.refresh()
                    time.sleep(3)
                except WebDriverException as e:
                    SeleniumTesting.log.error(
                        'Se presenta error del webdriver para la navegacion web dentro de la plataforma OWA'
                    )
                    SeleniumTesting.log.error('error: {}'.format(e.msg))
                    time.sleep(3)

        result_navegacion_carpetas.finalizar_tiempo_de_ejecucion()
        result_navegacion_carpetas.establecer_tiempo_de_ejecucion()

        # verifica que no haya algun mensaje de error en la plataforma, en caso contrario
        # se muestra el mensaje de error que aparace en la plataforma dentro del result
        if SeleniumTesting.verificar_error_plataforma(driver):
            result_navegacion_carpetas.validacion_correcta = False
            result_navegacion_carpetas.mensaje_error = 'No fue posible realizar la navegacion entre carpetas, se presenta '\
                                                       'el siguiente error dentro de la plataforma: '\
                                                       '{}'.format(SeleniumTesting.txt_mensaje_error_encontrado_owa)
        else:
            result_navegacion_carpetas.validacion_correcta = True
            result_navegacion_carpetas.mensaje_error = constantes_json.OUTPUT_EXITOSO_2_1

        result_list.result_validacion_navegacion_carpetas = result_navegacion_carpetas

        return result_list
    def obtener_carpetas_en_sesion(driver):
        lista_de_carpetas_localizadas = []
        lista_nombres_de_carpetas_formateadas = []
        clase_css_carpeta_owa_2016 = "_n_C4"
        clase_css_carpeta_owa_2013 = '_n_Z6'
        xpath_carpeta_owa_2010 = "//a[@name='lnkFldr']"
        se_encontraron_carpetas = False
        tiempo_de_inicio = Temporizador.obtener_tiempo_timer()
        tiempo_de_finalizacion = 0

        while tiempo_de_finalizacion < 60:

            time.sleep(10)

            if SeleniumTesting.verificar_elemento_encontrado_por_clase_js(
                    driver, clase_css_carpeta_owa_2016):
                SeleniumTesting.owa_descubierto = 2016
                se_encontraron_carpetas = True
            elif SeleniumTesting.verificar_elemento_encontrado_por_clase_js(
                    driver, clase_css_carpeta_owa_2013):
                SeleniumTesting.owa_descubierto = 2013
                se_encontraron_carpetas = True
            elif SeleniumTesting.verificar_elemento_encontrado_por_xpath(
                    driver, xpath_carpeta_owa_2010):
                SeleniumTesting.owa_descubierto = 2010
                se_encontraron_carpetas = True

            tiempo_de_finalizacion = Temporizador.obtener_tiempo_timer(
            ) - tiempo_de_inicio

            if tiempo_de_finalizacion % 20 == 0:
                SeleniumTesting.navegar_a_sitio(
                    SeleniumTesting.url_owa_exchange)
                driver.refresh()

            if se_encontraron_carpetas:
                SeleniumTesting.log.info('Se localizan con exito las carpetas dentro de la plataforma OWA, en un lapso aproximado'\
                    ' de {} seg'.format(FormatUtils.truncar_float_cadena(tiempo_de_finalizacion)))
                break
            else:
                SeleniumTesting.log.info(
                    'Fue imposible localizar las carpetas dentro de la plataforma OWA, se intentara nuevamente'
                )
                SeleniumTesting.log.info(
                    'Titulo actual de la plataforma: {}'.format(driver.title))
                SeleniumTesting.log.info(
                    'URL actual de la plataforma: {}'.format(
                        driver.current_url))

        if se_encontraron_carpetas == False:
            tiempo_de_finalizacion = Temporizador.obtener_tiempo_timer(
            ) - tiempo_de_inicio
            SeleniumTesting.log.error('Han transcurrido mas de {} seg sin localizar'\
                ' las carpetas dentro de la plataforma OWA'.format(FormatUtils.truncar_float_cadena(tiempo_de_finalizacion)))
            SeleniumTesting.log.error(
                'Title actual de la plataforma: {}'.format(driver.title))
            SeleniumTesting.log.error('Url actual de la plataforma: {}'.format(
                driver.current_url))

        else:
            SeleniumTesting.log.info(
                'Plataforma OWA version {} identificada'.format(
                    SeleniumTesting.owa_descubierto))
            time.sleep(4)
            if SeleniumTesting.owa_descubierto == 2010:
                lista_de_carpetas_localizadas = driver.find_elements_by_xpath(
                    xpath_carpeta_owa_2010)
            elif SeleniumTesting.owa_descubierto == 2013:
                script_js = '''
                        var elementos = document.getElementsByClassName('_n_Z6');
                        return elementos;
                        '''
                lista_de_carpetas_localizadas = driver.execute_script(
                    script_js)
            elif SeleniumTesting.owa_descubierto == 2016:
                script_js = '''
                        var elementos = document.getElementsByClassName('_n_C4');
                        return elementos;
                        '''
                lista_de_carpetas_localizadas = driver.execute_script(
                    script_js)

        for carpeta in lista_de_carpetas_localizadas:

            if SeleniumTesting.owa_descubierto == 2010:
                nombre_de_carpeta = carpeta.text
            else:
                nombre_de_carpeta = FormatUtils.remover_backspaces(
                    carpeta.get_attribute('innerHTML'))

            SeleniumTesting.log.info(
                'Se obtiene la carpeta: {}'.format(nombre_de_carpeta))
            lista_nombres_de_carpetas_formateadas.append(nombre_de_carpeta)

        return lista_nombres_de_carpetas_formateadas
    def iniciar_sesion_en_owa(driver, correo_en_prueba, result_list):
        # verificacion en texto de mensajes de error en inicio de sesion
        error_security_context = 'NegotiateSecurityContext'

        # se obtiene la cuenta sin el origen del dominio
        SeleniumTesting.cuenta_sin_dominio = FormatUtils.formatear_correo(
            correo_en_prueba.correo)
        SeleniumTesting.url_owa_exchange = correo_en_prueba.url

        #xpath de botones owa 2010, 2016, 2013
        xpath_btn_owa_2010 = "//input[@type='submit'][@class='btn']"
        xpath_btn_owa_2013_2016 = "//div[@class='signinbutton']"

        driver.accept_insecure_certs = True
        driver.accept_untrusted_certs = True

        resultado = Result()

        resultado.tiempo_inicio_de_ejecucion = Temporizador.obtener_tiempo_timer(
        )
        resultado.datetime_inicial = Temporizador.obtener_fecha_tiempo_actual()

        # resultado.inicializar_tiempo_de_ejecucion()
        mensaje_error_de_credenciales = None

        try:
            # obtiene los elementos html para los campos de usuario, password y el boton de inicio de
            # sesion
            time.sleep(3)

            input_usuario = driver.find_element_by_id('username')
            input_password = driver.find_element_by_id('password')
            check_casilla_owa_2010_version_ligera = None
            boton_ingreso_correo = None

            # verifica si se encuentra la casilla con el id chkBsc, el cual pertenece a la version
            # ligera de la plataforma de Exchange 2010
            if SeleniumTesting.verificar_elemento_encontrado_por_id(
                    driver, 'chkBsc'):

                # selecciona el check para ingresar a la plataforma ligera
                check_casilla_owa_2010_version_ligera = driver.find_element_by_id(
                    'chkBsc')
                check_casilla_owa_2010_version_ligera.click()
                SeleniumTesting.owa_descubierto = 2010

            if SeleniumTesting.verificar_elemento_encontrado_por_xpath(
                    driver, xpath_btn_owa_2010):
                boton_ingreso_correo = driver.find_element_by_xpath(
                    xpath_btn_owa_2010)
                SeleniumTesting.owa_descubierto = 2010

            elif SeleniumTesting.verificar_elemento_encontrado_por_xpath(
                    driver, xpath_btn_owa_2013_2016):
                boton_ingreso_correo = driver.find_element_by_xpath(
                    xpath_btn_owa_2013_2016)

                # establece la bandera version owa por analizar
                SeleniumTesting.owa_descubierto = 2016

            # ingresa los datos en cada uno de los inputs localizados en el sitio de owa, uno por
            # cada segundo
            time.sleep(1)
            input_usuario.send_keys(correo_en_prueba.correo)

            time.sleep(1)
            input_password.send_keys(correo_en_prueba.password)

            time.sleep(1)
            boton_ingreso_correo.click()

            time.sleep(18)

            SeleniumTesting.log.info(
                'Titulo actual de la plataforma: {}'.format(driver.title))
            SeleniumTesting.log.info('URL actual de la plataforma: {}'.format(
                driver.current_url))

        except NoSuchElementException as e:

            resultado.mensaje_error = 'No fue posible iniciar sesion dentro de la plataforma OWA, '\
                                      'no se localizaron los inputs para ingresar las credenciales de la cuenta '\
                                      'de correo electronico Exchange: {}'.format(SeleniumTesting.formatear_excepcion(e))

            resultado.validacion_correcta = False
            SeleniumTesting.log.error(resultado.mensaje_error)

        except WebDriverException as e:

            resultado.mensaje_error = 'No fue posible ingresar a la plataforma de Exchange OWA, favor de verificar'\
                ' si se tiene conectividad por internet, error detallado : {}'.format(SeleniumTesting.formatear_excepcion(e))
            resultado.validacion_correcta = False
            SeleniumTesting.log.error(resultado.mensaje_error)

        # verifica que se haya ingresado correctamente al OWA, se localiza si esta establecido
        # el mensaje de error de credenciales dentro del aplicativo del OWA

        if resultado.validacion_correcta == False:
            try:

                if SeleniumTesting.owa_descubierto == 2010:

                    mensaje_error_de_credenciales = driver.find_element_by_id(
                        'trInvCrd')

                    SeleniumTesting.log.error(
                        'No fue posible ingresar a la plataforma OWA, se tiene error de credenciales'
                    )
                    mensaje_error_de_credenciales = driver.find_element_by_xpath(
                        "//tr[@id='trInvCrd']/td")

                    texto_mensaje_error = mensaje_error_de_credenciales.get_attribute(
                        'innerHTML')

                    SeleniumTesting.log.error('Se muestra el siguiente mensaje de error de credenciales: {} '\
                                            .format(texto_mensaje_error))

                    resultado.mensaje_error = 'No fue posible ingresar a la plataforma OWA, se tiene error de credenciales: {}'\
                        .format(mensaje_error_de_credenciales.get_attribute('innerHTML'))

                    resultado.validacion_correcta = False

                elif SeleniumTesting.owa_descubierto == 2016 or SeleniumTesting.owa_descubierto == 2013:

                    mensaje_error_de_credenciales = driver.execute_script('''
                    var mensaje_error = document.querySelector("#signInErrorDiv").innerText;
                    return mensaje_error;
                    ''')

                    SeleniumTesting.log.error(
                        'No se puede ingresar al aplicativo debido a error de credenciales:'
                    )
                    SeleniumTesting.log.error('Se muestra el siguiente mensaje de advertencia: {} '\
                                             .format(mensaje_error_de_credenciales))

                    resultado.mensaje_error = 'No fue posible ingresar a la plataforma OWA, se tiene error de credenciales: '\
                                              '{}'.format(mensaje_error_de_credenciales)

                    resultado.validacion_correcta = False

            except NoSuchElementException as e:
                resultado.mensaje_error = constantes_json.OUTPUT_EXITOSO_1_1
                resultado.validacion_correcta = True
                SeleniumTesting.log.info(resultado.mensaje_error)
            except InvalidSessionIdException as e:
                resultado.mensaje_error = 'No fue posible ingresar a la plataforma de Exchange OWA, favor de verificar '\
                                          'si se tiene conectividad por internet, error detallado : {}'.format(e)
                resultado.validacion_correcta = False
                SeleniumTesting.log.error(resultado.mensaje_error)
            except JavascriptException as e:
                # Se ingresa correctamente, debido a que no se encontro el mensaje de error de credenciales incorrectas
                resultado.mensaje_error = constantes_json.OUTPUT_EXITOSO_1_1
                resultado.validacion_correcta = True
                SeleniumTesting.log.info(resultado.mensaje_error)
            except WebDriverException as e:
                # Se ingresa correctamente, debido a que no se encontro el mensaje de error de credenciales incorrectas
                resultado.mensaje_error = constantes_json.OUTPUT_EXITOSO_1_1
                resultado.validacion_correcta = True
                SeleniumTesting.log.info(resultado.mensaje_error)

        # realiza la validacion de ingreso correcto de sesion
        # se verifica que no haya algun error que se presente en la plataforma
        # en caso contrario se obtiene el mensaje del error y se establecer en el
        # objeto resultado

        if SeleniumTesting.verificar_error_plataforma(driver):
            resultado.mensaje_error = 'No fue posible ingresar a la sesion, se presenta '\
                'el siguiente mensaje de error en la plataforma: {}'.format(SeleniumTesting.txt_mensaje_error_encontrado_owa)
            resultado.validacion_correcta = False

        resultado.finalizar_tiempo_de_ejecucion()
        resultado.establecer_tiempo_de_ejecucion()
        result_list.result_validacion_acceso_portal_owa = resultado

        return result_list