Я пытался разработать решение для автоматизированного тестирования с использованием Selenium RC и Python, и после продолжительного тестирования я попал, так сказать, в довольно трудный блок.
У меня есть три файла: unit.py, case1.py и case1m.py
unit.py настраивает экземпляры case1m.py с помощью браузера и порта, а затем запускает тест, отправляя экземпляр case1m через unittest.main ().
Файл case1.py - это простой случай, созданный из Selenium IDE; при запуске из командной строки он выполняет контрольный пример и завершает работу с помощью 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 (). При выполнении он работает до тех пор, пока не попробует метод do_command () в экземпляре selenium.
Вот ошибка:
Traceback (последний последний вызов):
Файл "C: \ sel-test \ unit.py", строка 13, в
a.setBrowser ( "* хром", 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, в начале
result = self.get_string ("getNewBrowserSession", [self.browserStartCommand, self.browserURL, self.extensionJs])
Файл "C: \ Python26 \ lib \ selenium.py", строка 225, в get_string
результат = self.do_command (глагол, аргументы)
Файл "C: \ Python26 \ lib \ selenium.py", строка 213, в do_command
conn.request ("POST", "/ selenium-server / driver /", тело, заголовки)
Файл "C: \ Python26 \ lib \ httplib.py", строка 910, в запросе
self._send_request (метод, URL, тело, заголовки)
Файл "C: \ Python26 \ lib \ httplib.py", строка 947, в _send_request
self.endheaders ()
Файл "C: \ Python26 \ lib \ httplib.py", строка 904, в заголовках
self._send_output ()
Файл "C: \ Python26 \ lib \ httplib.py", строка 776, в _send_output
self.send (МСГ)
Файл "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
для res в getaddrinfo (хост, порт, 0, SOCK_STREAM):
socket.gaierror: [Errno 10109] getaddrinfo не удалось
Мои вопросы: почему комбинация unit.py/case1m.py приводит к socket.gaierror, когда файл case1.py будет работать без ошибок? Из того, что я вижу, класс селена должен получать ту же самую информацию к тому времени, когда он достигает self.do_command (). Единственное отличие состоит в том, что case1.py запускается непосредственно из командной строки, а case1m.py - как импортированный модуль.