Domanda

Sto usando il selenio RC per scorrere un lungo elenco di URL, scrivendo in sequenza l'HTML da ciascun URL in un file CSV. Problema: il programma esce frequentemente in vari punti dell'elenco a causa dell'URL "scaduto dopo 30000 ms" eccezioni. Invece di interrompere il programma quando si verifica un timeout dell'URL, stavo cercando di fare in modo che il programma scrivesse semplicemente una nota del timeout nel file CSV (nella riga in cui sarebbe andato l'HTML per l'URL) e spostato all'URL successivo nell'elenco. Ho tentato di aggiungere una clausola 'else' al mio programma ma non sembra essere d'aiuto (vedi sotto) - ovvero: il programma si ferma ancora ogni volta che si verifica un timeout. Mi sembra anche di ottenere eccezioni di timeout di 30000ms anche quando apro selenium-server con una finestra di timeout di 60000ms --eg: " java -jar selenium-server.jar -timeout 600000 " ???

Qualsiasi consiglio sarebbe molto apprezzato. Grazie.

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()
È stato utile?

Soluzione

Prova quanto segue:

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()

Alcuni commenti:

  • Non è necessario un wait_for_page_to_load dopo un'apertura, che causerà timeout perché una volta che la pagina viene caricata dopo l'apertura, ricomincerà ad attendere e la pagina non verrà caricata.
  • La maggior parte degli errori che si ottengono dal selenio (timeout, oggetto non trovato) possono essere colti con istruzioni try-tranne
  • Dovresti impostare il timeout nei test all'interno del test stesso (usando set_timeout), in questo modo non dipende dal modo in cui avvii il server, aspetterà sempre il tempo desiderato
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top