Python Selenium обрабатывает исключения тайм-аута с длинным списком URL - PullRequest
1 голос
/ 25 октября 2009

Я использую selenium RC для циклического перебора длинного списка URL-адресов, последовательно записывая HTML-код каждого URL-адреса в файл CSV. Проблема: программа часто завершает работу в разных точках списка из-за исключений URL «Превышено время ожидания после 30000 мс». Вместо того, чтобы останавливать программу при достижении времени ожидания URL-адреса, я пытался заставить программу просто записать примечание об истечении времени ожидания в файле CSV (в строке, в которой должен был быть указан HTML-код для URL) и переместить его. на следующий URL в списке. Я попытался добавить предложение «else» в свою программу, но, похоже, это не помогло (см. Ниже) - то есть: программа по-прежнему останавливается каждый раз, когда истекает время ожидания. Я также, кажется, получаю 30000ms исключения тайм-аута, даже когда я открываю Selen-Server с окном 60000ms тайм-аут --eg: "java -jar selenium-server.jar -timeout 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()

1 Ответ

3 голосов
/ 26 октября 2009

Попробуйте следующее:

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 после открытия, это приведет к истечению времени ожидания, поскольку после загрузки страницы после открытия она снова начнет ждать и страница не будет загружаться.
  • Большинство сбоев, которые вы получаете из-за селена (тайм-ауты, объект не найден), можно обнаружить с помощью операторов try-кроме
  • Вы должны установить тайм-аут в своих тестах с самим тестом (используя set_timeout), чтобы он не зависел от того, как вы запустили сервер, он всегда будет ждать желаемое время
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...