【发布时间】:2010-06-24 18:04:44
【问题描述】:
我一直在尝试使用 Selenium RC 和 Python 开发一个自动化测试用例解决方案,经过长时间的测试,我遇到了一个相当困难的障碍,可以这么说。
我有三个文件:unit.py、case1.py 和 case1m.py
unit.py 使用浏览器和端口配置 case1m.py 的实例,然后通过 unittest.main() 发送 case1m 实例来运行测试。
case1.py 文件是从 Selenium IDE 生成的普通案例;从命令行运行时,它会执行测试用例并以 OK 退出。我使用这个文件来帮助调试其他两个文件的故障点。
以下是所有三个文件的来源:
单位.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"
案例1.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("*chrome",4444)
文件“C:\sel-test\case1m.py”,第 10 行,在 setBrowser
self.setUp()
文件“C:\sel-test\case1m.py”,第 16 行,在 setUp
self.selenium.start()
文件“C:\Python26\lib\selenium.py”,第 190 行,开始
结果 = self.get_string("getNewBrowserSession", [self.browserStartCommand, self.browserURL, self.extensionJs])
文件“C:\Python26\lib\selenium.py”,第 225 行,在 get_string
结果 = self.do_command(verb, args)
do_command 中的文件“C:\Python26\lib\selenium.py”,第 213 行
conn.request("POST", "/selenium-server/driver/", body, headers)
文件“C:\Python26\lib\httplib.py”,第 910 行,在请求中
self._send_request(方法、网址、正文、标题)
_send_request
中的文件“C:\Python26\lib\httplib.py”,第 947 行 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)
文件“C:\Python26\lib\socket.py”,第 500 行,在 create_connection
对于 getaddrinfo(host, port, 0, SOCK_STREAM) 中的 res:
socket.gaierror: [Errno 10109] getaddrinfo 失败
我的问题是:为什么 unit.py/case1m.py 组合会导致在 case1.py 文件运行没有错误时出现 socket.gaierror?据我所见,selenium 类在到达 self.do_command() 时应该接收到完全相同的信息。唯一的区别是 case1.py 是直接从命令行运行的,而 case1m.py 是作为导入模块运行的。
【问题讨论】:
标签: python browser selenium selenium-rc