Pergunta

Eu estou usando RC selênio para percorrer uma longa lista de URLs, escrevendo sequencialmente o HTML de cada URL para um arquivo CSV. Problema: o programa frequentemente saídas em vários pontos lista devido a URL "excedeu o tempo limite após 30000ms" exceções. Em vez de parar o programa quando se atinge um limite de tempo URL, eu estava tentando ter o programa simplesmente escrever uma nota do tempo limite no arquivo CSV (na linha onde o HTML para o URL teria ido) e movimento para o próximo URL na lista. Tentei adicionar uma cláusula de 'else' ao meu programa, mas ele não parecem ajuda (veja abaixo) - isto é: o programa ainda pára cada vez que ela atinge um tempo limite. Eu também parecem ter 30000ms exceções de tempo limite, mesmo quando eu aberta selênio-servidor com um 60000ms tempo limite janela --eg: "java -jar selênio-server.jar -timeout 600000" ???

Qualquer conselho seria muito apreciado. Obrigado.

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()
Foi útil?

Solução

Tente o seguinte:

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

Alguns comentários:

  • Você não precisa de um wait_for_page_to_load após um processo aberto, que fará com que você tempos limite porque uma vez que a página é carregada após o opeen, ele vai começar a esperar novamente e a página não será carregamento.
  • A maioria das falhas que você começa de selênio (timeouts, objeto não encontrado) pode ser pego com try-exceto declarações
  • Você deve definir o tempo limite em seus testes withing a própria (usando set_timeout) teste, dessa forma ele não depende da maneira que você iniciar o servidor, ele sempre vai esperar o tempo que você queria
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top