利用Python产生来自Selenium RC的多个浏览器

我一直在尝试使用Selenium RC和Python开发一个自动化测试用例解决方案,经过漫长的测试后,我在路上遇到了一个相当困难的问题,可以这么说。

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

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

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

这是所有三个文件的来源:


unit.py:

import unittest
from case1m import case1m

browser = "*chrome"
port = 4444

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


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

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)
文件“C: sel-test case1m.py”,第10行,在setBrowser中
self.setUp()
在setUp文件“C: sel-test case1m.py”,第16行
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行
结果= self.do_command(动词,参数)
在do_command中的文件“C: Python26 lib selenium.py”,第213行
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()
在_send_output文件“C: Python26 lib httplib.py”,第776行
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行
对于getaddrinfo(主机,端口,0,SOCK_STREAM)中的res:
socket.gaierror:[Errno 10109] getaddrinfo失败

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


并排观察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/")
链接地址: http://www.djcxy.com/p/50789.html

上一篇: Spawning multiple browsers from Selenium RC utilizing Python

下一篇: How to convert Selenese (html) to Python programmatically?