Python Selenium使用一长串URL处理超时异常

时间:2009-10-25 19:24:26

标签: python exception selenium timeout loops

我正在使用selenium RC循环浏览一长串URL,顺序将每个URL的HTML写入csv文件。问题:由于URL“30000ms后超时”异常,程序经常在列表中的各个点退出。我没有在达到URL超时时停止程序,而是试图让程序在CSV文件中写下超时的注释(在URL的HTML所在的行中)并移动到列表中的下一个URL。我试图在我的程序中添加一个'else'子句,但它似乎没有帮助(见下文) - 即:程序在每次达到超时时仍然停止。即使我用60000ms的超时窗口打开selenium-server,我似乎也得到30000ms的超时异常 - 例如:“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 个答案:

答案 0 :(得分: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()

一些意见:

  • 打开后不需要wait_for_page_to_load,这会导致超时,因为一旦页面在opeen之后加载,它将再次开始等待,页面将不会加载。
  • 从selenium获得的大多数失败(超时,找不到对象)可以通过try-except语句捕获
  • 您应该在测试中使用测试本身设置超时(使用set_timeout),这样就不依赖于启动服务器的方式,它总会等待您想要的时间