使用Python从Selenium RC生成多个浏览器

0 投票
1 回答
1399 浏览
提问于 2025-04-16 00:24

我一直在尝试用Selenium RC和Python开发一个自动化测试的解决方案,但经过一段时间的测试,我遇到了一个很大的障碍。

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

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

case1.py是一个普通的测试案例,是从Selenium IDE生成的;当从命令行运行时,它会执行测试案例并正常退出。我用这个文件来帮助调试另外两个文件中的问题。

以下是这三个文件的源代码:

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("*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行,在start中
result = self.get_string("getNewBrowserSession", [self.browserStartCommand, self.browserURL, self.extensionJs])
文件 "C:\Python26\lib\selenium.py",第225行,在get_string中
result = self.do_command(verb, args)
文件 "C:\Python26\lib\selenium.py",第213行,在do_command中
conn.request("POST", "/selenium-server/driver/", body, headers)
文件 "C:\Python26\lib\httplib.py",第910行,在request中
self._send_request(method, url, body, headers)
文件 "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行,在send中
self.connect()
文件 "C:\Python26\lib\httplib.py",第716行,在connect中
self.timeout)
文件 "C:\Python26\lib\socket.py",第500行,在create_connection中
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno 10109] getaddrinfo失败

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

1 个回答

1

对比这两个代码片段,我觉得你可能把浏览器和端口的参数搞反了。这很可能就是你出错的原因。

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

撰写回答