【问题标题】:Spawning multiple browsers from Selenium RC utilizing Python使用 Python 从 Selenium RC 生成多个浏览器
【发布时间】: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


    【解决方案1】:

    并排查看 2 个代码 sn-ps,我认为您已经反转了浏览器和端口参数。这可能是您的错误的根源。

    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/")
    

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2010-11-10
      • 2011-02-19
      • 2011-01-07
      • 1970-01-01
      • 2010-09-17
      • 2021-09-21
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多