Создание нескольких браузеров из Selenium RC с использованием Python - PullRequest
0 голосов
/ 24 июня 2010

Я пытался разработать решение для автоматизированного тестирования с использованием 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 - как импортированный модуль.

1 Ответ

1 голос
/ 25 июня 2010

Глядя на 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/")
...