Python selênio tratamento de exceções de tempo limite com uma longa lista de URLs
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()
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