使用Python从Selenium RC生成多个浏览器

时间:2010-06-24 18:04:45

标签: python browser selenium selenium-rc

我一直在尝试使用Selenium RC和Python开发自动化测试用例解决方案,经过漫长的测试后,我已经遇到了一个非常困难的障碍,可以这么说。

我有三个文件:unit.py,case1.py和case1m.py

unit.py使用浏览器和端口配置case1m.py的实例,然后通过unittest.main()发送case1m实例来运行测试。

case1.py文件是一个由Selenium IDE生成的vanilla案例;从命令行运行时,它执行测试用例并单击“确定”退出。我用这个文件来帮助调试其他两个文件的失败点。

以下是所有三个文件的来源:


unit.py:

import unittest
from case1m import case1m

browser = "*chrome"
port = 4444

a = case1m()
a.setBrowser("*chrome",4444)
unittest.main(a)


case1m.py - 处理浏览器/端口参数并运行selenium测试用例:

from selenium import selenium
import unittest, time, re

class case1m(unittest.TestCase):
    def setBrowser(self,b,p):
        print "entered setBrowser"
        self.browser = b
        self.port = p
        print "leaving setBrowser"
        self.setUp()

    def setUp(self):
        print self.browser,", ",self.port
        self.verificationErrors = []
        self.selenium = selenium("localhost", self.browser, self.port, "http://megagate-ffcdcb.xl_net.internal/")
        self.selenium.start()
        print "end setUp"
        self.runTest()

    def runTest(self):
        print "entered runTest"
        sel = self.selenium
        sel.open("/seltest/")
        try: self.failUnless(sel.is_text_present("BODY"))
        except AssertionError, e: self.verificationErrors.append(str(e))
        print "leaving runTest"
        self.tearDown()     

    def tearDown(self):
        print "entered tearDown"
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)
        print "leaving tearDown"


case1.py:

from selenium import selenium
import unittest, time, re

class case1(unittest.TestCase):
    def setUp(self):
        print "entered setUp"
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*chrome", "http://megagate-ffcdcb.xl_net.internal/")
        self.selenium.start()

    def runTest(self):
        sel = self.selenium
        sel.open("/seltest/")
        try: self.failUnless(sel.is_text_present("BODY"))
        except AssertionError, e: self.verificationErrors.append(str(e))

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == '__main__':
    unittest.main()

我遇到的第一个问题是将浏览器和端口值传递给case1m类的实例。我尝试使用__init__来收集它们作为参数,但显然对TestCase类进行子类化,然后添加__init__覆盖会导致问题; setUp(),runTest()和tearDown()方法不再像在case1类中那样自动触发。

相反,我覆盖并插入了一个setBrowser()方法来收集值并在类实例中创建浏览器和端口变量。这又引起了和以前一样的问题,所以我使用方法调用插入setUp(),runTest()和tearDown()。执行时,它会一直运行,直到它在selenium实例中尝试do_command()方法。

这是错误:

  

追踪(最近的呼叫最后):
    文件“C:\ sel-test \ unit.py”,第13行,在中       a.setBrowser( “*铬”,4444)
    在setBrowser中输入文件“C:\ sel-test \ case1m.py”,第10行       self.setUp()
    文件“C:\ sel-test \ case1m.py”,第16行,在setUp中       self.selenium.start()
    文件“C:\ Python26 \ lib \ selenium.py”,第190行,开头
      result = self.get_string(“getNewBrowserSession”,[self.browserStartCommand,self.browserURL,self.extensionJs])
    在get_string中文件“C:\ Python26 \ lib \ selenium.py”,第225行       result = self.do_command(动词,args)
    文件“C:\ Python26 \ lib \ selenium.py”,第213行,在do_command中       conn.request(“POST”,“/ selenium-server / driver /”,正文,标题)
    请求中的文件“C:\ Python26 \ lib \ httplib.py”,第910行       self._send_request(方法,网址,正文,标题)
    文件“C:\ Python26 \ lib \ httplib.py”,第947行,在_send_request中       self.endheaders()
    文件“C:\ Python26 \ lib \ httplib.py”,第904行,在endheaders中       self._send_output()
    文件“C:\ Python26 \ lib \ httplib.py”,第776行,在_send_output中       self.send(MSG)
    文件“C:\ Python26 \ lib \ httplib.py”,第735行,发送
      self.connect()
    文件“C:\ Python26 \ lib \ httplib.py”,第716行,在连接中       self.timeout)
    在create_connection中文件“C:\ Python26 \ lib \ socket.py”,第500行       for get in getddrinfo(host,port,0,SOCK_STREAM):
  socket.gaierror:[Errno 10109] getaddrinfo失败

我的问题是:为什么在case1.py文件运行时没有错误,unit.py / case1m.py组合会导致socket.gaierror?从我所看到的,selenium类应该在到达self.do_command()时接收完全相同的信息。唯一的区别是case1.py直接从命令行运行,而case1m.py正在作为导入模块运行。

1 个答案:

答案 0 :(得分:1)

并排查看2个代码片段,我认为你已经颠倒了浏览器和端口参数。这可能是您的错误的来源。

case1.py(运行正常):

self.selenium = selenium("localhost", 4444, "*chrome", "http://megagate-ffcdcb.xl_net.internal/")

case1m.py(套接字错误):

self.selenium = selenium("localhost", self.browser, self.port, "http://megagate-ffcdcb.xl_net.internal/")