Python Selenium обрабатывает исключения тайм-аута с длинным списком URL-адресов
Вопрос
Я использую selenium RC для циклического просмотра длинного списка URL-адресов, последовательно записывая HTML-код из каждого URL-адреса в CSV-файл.Проблема:программа часто завершается в разных точках списка из-за исключений URL "Время ожидания истекло после 30000мс".Вместо остановки программы при достижении тайм-аута URL-адреса я пытался заставить программу просто записать примечание о тайм-ауте в CSV-файл (в строку, куда должен был быть помещен HTML для URL-адреса) и перейти к следующему URL-адресу в списке.Я попытался добавить предложение 'else' в свою программу, но, похоже, это не помогло (см. Ниже) - т.Е.:программа по-прежнему останавливается каждый раз, когда истекает тайм-аут.Я также, кажется, получаю исключения тайм-аута 30000ms, даже когда я открываю selenium-сервер с окном тайм-аута 60000ms - например:"java -jar selenium-server.jar -тайм-аут 600000"???
Я был бы очень признателен за любой совет.Спасибо.
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()
Решение
Попробуйте следующее:
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()
Некоторые комментарии:
- Вам не нужно wait_for_page_to_load после открытия, это приведет к тайм-аутам, потому что как только страница будет загружена после открытия, она снова начнет ждать, и страница не будет загружаться.
- Большинство сбоев, которые вы получаете от selenium (тайм-ауты, объект не найден), могут быть обнаружены с помощью инструкций try-except
- Вы должны установить тайм-аут в своих тестах внутри самого теста (используя set_timeout), таким образом, это не зависит от способа запуска сервера, он всегда будет ждать нужное вам время