利用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?