Pregunta

Estoy usando selenium RC para recorrer una larga lista de URL, escribiendo secuencialmente el HTML de cada URL en un archivo csv. Problema: el programa sale con frecuencia en varios puntos de la lista debido a la URL "Tiempo de espera agotado después de 30000 ms" excepciones En lugar de detener el programa cuando alcanza un tiempo de espera de URL, estaba tratando de que el programa simplemente escribiera una nota del tiempo de espera en el archivo CSV (en la fila donde se habría ido el HTML para la URL) y mover a la siguiente URL de la lista. Intenté agregar una cláusula 'else' a mi programa, pero no parece ayudar (ver más abajo), es decir: el programa todavía se detiene cada vez que alcanza un tiempo de espera. También parece que obtengo excepciones de tiempo de espera de 30000 ms incluso cuando abro el servidor de selenio con una ventana de tiempo de espera de 60000 ms - por ejemplo: " java -jar selenium-server.jar -timeout 600000 " ???

Cualquier consejo sería muy apreciado. Gracias.

from selenium import selenium
import unittest, time, re, csv, logging

class Untitled(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*firefox", "http://www.MainDomain.com")
        self.selenium.start()

    def test_untitled(self):
        sel = self.selenium
        spamReader = csv.reader(open('SubDomainList.csv', 'rb'))
        for row in spamReader:
            sel.open(row[0])
            sel.wait_for_page_to_load("400000")
            time.sleep(5)
            html = sel.get_html_source()
            ofile = open('output4001-5000.csv', 'ab')
            ofile.write(html + '\n')
            ofile.close
        else:
            ofile = open('outputTest.csv', 'ab')
            ofile.write("URL Timeout" + '\n')
            ofile.close

     def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
     unittest.main()
¿Fue útil?

Solución

Pruebe lo siguiente:

from selenium import selenium
import unittest, time, re, csv, logging

class Untitled(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*firefox", "http://example.com")
        self.selenium.start()
        self.selenium.set_timeout("60000")

    def test_untitled(self):
        sel = self.selenium
        spamReader = csv.reader(open('SubDomainList.csv', 'rb'))
        for row in spamReader:
            try:
                sel.open(row[0])
            except Exception, e:
                ofile = open('outputTest.csv', 'ab')
                ofile.write("error on %s: %s" % (row[0],e))
            else:
                time.sleep(5)
                html = sel.get_html_source()
                ofile = open('output4001-5000.csv', 'ab')
                ofile.write(html.encode('utf-8') + '\n')
            ofile.close()

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
     unittest.main()

Algunos comentarios:

  • No necesita un wait_for_page_to_load después de una apertura, eso causará tiempos de espera porque una vez que la página se carga después de la apertura, comenzará a esperar nuevamente y la página no se cargará.
  • La mayoría de las fallas que obtiene del selenio (tiempos de espera, objeto no encontrado) pueden detectarse con declaraciones de prueba excepto
  • Debe configurar el tiempo de espera en sus pruebas dentro de la prueba en sí (usando set_timeout), de esa manera no depende de la forma en que inicie el servidor, siempre esperará el tiempo que desee
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top