我一直在尝试使用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正在作为导入模块运行。
答案 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/")