A continuación es un fragmento de código de mi script de python que es la lectura de un archivo de excel y asignación de celdas en una fila a una variable que se utiliza a continuación para ser escrito en un campo en el navegador. funciona muy bien … para la mayor parte. lo que me gustaría hacer es la instalación de algún tipo de bucle después de que el navegador carga la página, para hacer lo siguiente:

encontrar el elemento por algunos de IDENTIFICACIÓN. si esto falla, espere 5 segundos, a continuación, inténtelo de nuevo. si logra continuar con el resto de la secuencia de comandos. ahora ir fácil en mí, este es mi primer intento real. he tratado de nido de try/except declaraciones, pero que realmente tiene desordenado rápido.

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
import xlrd

workbook = xlrd.open_workbook("my_excel_file.xlsx")
worksheet = workbook.sheet_by_name('Sheet1')
x = 0
for current_row in range(worksheet.nrows):
    try:
        cmt = worksheet.row(current_row)[2].value
        browser = webdriver.Firefox() # Get local session of firefox
        browser.get("http://www.somewebsite.com") # Load page
        time.sleep(5)
        #this timer is the issue, if the field takes 6 seconds to be ready, script fails
        comment = browser.find_element_by_id("slow_comment_box") # Find the comment box
        comment.send_keys(str(cmt) + Keys.RETURN)
        x += 1
    except:
        print ("Error on " + str(x))
        quit ()

hay una manera de configurar este para comportarse de la manera que he dicho anteriormente? sé el selenio espera a que la página se cargue, pero el cuadro de texto no es uno normal y parece tener su propia carga, girar la rueda.

resumen de la solución y
la respuesta es la siguiente. mis cosas tontas había algunos errores de sintaxis. esta página fue muy útil también.

¿Esta ayuda? [stackoverflow.com/questions/16927354/…
me gusta la posibilidad! harán un poco más a la lectura y tratar de implementar.

OriginalEl autor dalearyous | 2014-02-24

2 Comentarios

  1. 9

    Desea utilizar WebDriverWait

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    element = WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.Id, 'id')))
    así que en mi ejemplo, ¿sigue siendo necesario el comentario = navegador.find_element_by_id(«slow_comment_box»)? ¿o es que el WebDriverWait hacer esto por mí si su disposición?
    nada de lo que yo estoy tratando de obras, hay una biblioteca que me estoy perdiendo? ninguna sintaxis o la compilación de errores.
    El webdriverwait sondeará el DOM para un determinado período de tiempo (en este caso 60 seg) y devolverá la webElement una vez que se encuentra (y en este caso también es visible, lo que significa que tiene un tamaño > 1px) o tirar de tiempo de espera si el tiempo de espera es exeeded.
    [code]wait = WebDriverWait(navegador, 30) elemento = esperar.hasta la(EC.element_to_be_clickable ((.ID, «someID»)))[/code] esta fue la única manera que he encontrado que mi script se ejecutará. sin embargo no creo que su trabajo correctamente. yo nunca podría conseguir su ejemplo para trabajar con mi ejemplo.
    si hago un super ejemplo básico con su código, y elegir cualquier sitio web y el tipo en un falso ID nombre errores o se detiene tan pronto como se carga el sitio. lo que significa que nunca se encontró el IDENTIFICADOR y no esperar los 60 segundos. si estaba esperando, no debe de error de hasta el 60 segundos.

    OriginalEl autor Erki M.

  2. 0

    Después de intentar Erki M. la respuesta a la que yo iba de aquí para aprender más acerca de esperar en Selenio:

    http://selenium-python.readthedocs.org/en/latest/waits.html

    El artículo se menciona otra alternativa que es bonito y simple:

    from selenium import webdriver
    
    browser = webdriver.Firefox() 
    browser.implicitly_wait(30)
    browser.get("http://www.somewebsite.com")

    Desde el momento que usted especifique implícito un tiempo de espera en adelante, el navegador va a ser paciente y a la encuesta de la página para ver si puede encontrar el elemento que está buscando. Este método evita la necesidad de un mayor de las importaciones y también la necesidad de especificar qué elemento se espera para antes de tiempo.

    Una cosa que debo mencionar es que a veces todavía me caen de nuevo a tiempo.sleep(1), por ejemplo, después de la incrustación en una entrada. Implicitly_wait dará tiempo para que un elemento aparezca, pero no causará comandos para esperar el tiempo suficiente para que la interfaz de usuario sensible.

    Esto va a ser muy lento para pruebas repetitivas!!
    Bueno, es el sondeo, así lo lento que es depende de lo lento que es el sitio web. Si te refieres a que erroring fuera es lento, por supuesto, usted puede reducir el número de 30.

    OriginalEl autor Doug Bradshaw

Dejar respuesta

Please enter your comment!
Please enter your name here