Python Selenium 处理长网址列表的超时异常

1 投票
1 回答
3313 浏览
提问于 2025-04-15 15:22

我正在使用selenium RC来依次处理一长串网址,把每个网址的HTML内容写入一个csv文件。问题是:程序在处理列表中的某些网址时经常会因为“30000毫秒超时”而退出。我的想法是,当程序遇到网址超时时,不是直接停止,而是记录一下超时的情况(在原本应该写HTML的那一行)然后继续处理下一个网址。我尝试在程序中添加一个'else'语句,但似乎没有什么用(见下文)——也就是说,每次遇到超时,程序还是会停止。我还发现,即使我用60000毫秒的超时设置启动selenium-server,仍然会出现30000毫秒的超时异常,比如:“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

试试下面的方法:

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

一些说明:

  • 在打开页面后,你不需要再使用等待页面加载的命令,这样会导致超时问题。因为一旦页面加载完成,系统会再次开始等待,而页面可能就不会再加载了。
  • 你在使用selenium时遇到的大多数错误(比如超时、找不到对象)都可以通过try-except语句来处理。
  • 你应该在测试中设置超时时间(使用set_timeout),这样就不受你启动服务器的方式影响,始终会按照你设定的时间等待。

撰写回答