Попытка запустить сценарии Selenium IDE Python в качестве набора тестов

У меня есть пара проблем с запуском более одного тестового скрипта Python, экспортированного форматером плагина Selenium IDE Python Remote Control.

1) После завершения скрипта Python окно браузера автоматически закрывается. Я запускаю тесты в Firefox, например.

2) Selenium не может экспортировать свои тестовые наборы в python. Как я могу воспроизвести функциональность набора тестов в python?

Причина, по которой я трачу время на запуск тестового сценария на Python, заключается в том, что наше программное обеспечение для решения тестовых случаев (Testuff) позволяет вызывать API для обновления соседнего тестового примера, который был запущен с помощью автоматизации тестового набора Selenium.

Вот пример кода с вызовами API.

Спасибо.

from selenium import selenium
import unittest, time, re

class python_script(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*chrome", "http://test website url/")
        self.selenium.start()

    def test_python_script(self):
        sel = self.selenium
from selenium import selenium
import unittest, time, re, urllib

class python_script(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*chrome", "http://test website url/")
        self.selenium.start()


    def test_python_script(self):
        sel = self.selenium
        sel.open("http://192.168.48.23/labmatrix")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@name='username']"):
                    break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff test_id number","status" : "failed"}
            result = urllib.urlopen("testuff api url", urllib.urlencode(fields))
            print result.read()
            self.fail("time out")
        sel.type("//*[@name='username']", "username")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@name='password']"): break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff test_id number","status" : "failed"}
            result = urllib.urlopen("testuff api url", urllib.urlencode(fields))
            print result.read()
            #self.fail("time out")
        sel.type("//*[@name='password']", "password")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@id='submitButton']"): break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff test_id number","status" : "failed"}
            result = urllib.urlopen("testuff api url", urllib.urlencode(fields))
            print result.read()
            self.fail("time out")
        sel.click("//*[@id='submitButton']")
        #time.sleep(0.1)
        for i in range(60):
            try:
                if sel.is_element_present("//*[@id='loadingDeck'][@selectedIndex='1']"):
                    fields = {"test_id" : "testuff test_id number","status" : "passed"}
                    result = urllib.urlopen("testuff api url", urllib.urlencode(fields))
                    print result.read()
                    break
            except: pass
            #time.sleep(1)
        else:
            self.fail("time out")

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

Спасибо за быстрый ответ. Я попробовал рекомендацию jcfollower с этим кодом:

from selenium import selenium
import unittest, time, re

class python_script(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*chrome", "Testing Website URL")
        self.selenium.start()

    def test_python_script_1(self):
        sel = self.selenium


    def test_python_script_2(self):
        sel = self.selenium
        sel.open("Testing website URL")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@name='username']"):
                    break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "Testuff API Test_id","status" : "failed"}
            result = urllib.urlopen("API URL", urllib.urlencode(fields))
            print result.read()
            self.fail("time out")
        sel.type("//*[@name='username']", "username")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@name='password']"): break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff API test_id","status" : "failed"}
            result = urllib.urlopen("testuff API url", urllib.urlencode(fields))
            print result.read()
            #self.fail("time out")
        sel.type("//*[@name='password']", "password")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@id='submitButton']"): break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff API test_id","status" : "failed"}
            result = urllib.urlopen("API URL", urllib.urlencode(fields))
            print result.read()
            self.fail("time out")
        sel.click("//*[@id='submitButton']")
        #time.sleep(0.1)
        for i in range(60):
            try:
                if sel.is_element_present("//*[@id='loadingDeck'][@selectedIndex='1']"):
                    fields = {"test_id" : "testuff API test_id","status" : "passed"}
                    result = urllib.urlopen("API URL", urllib.urlencode(fields))
                    print result.read()
                    break
            except: pass
            #time.sleep(1)
        else:
            self.fail("time out")

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

...и, к сожалению, окно браузера все еще закрыто. Любые другие предложения?

Спасибо.


Удалось частично сработать.

Удален один из:

if __name__ == "__main__":
    unittest.main()

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

...и удалил:

        self.selenium.stop()

из оставшегося оператора «if __name__» и журнал python плюс окно браузера остаются открытыми. Это шаг в правильном направлении, но мне нужно, чтобы окно журнала закрывалось после завершения работы скрипта.

Я предполагаю, что следующим шагом будет создание еще одного класса остановки и немного поиграть с ним в файле selenium.py и посмотреть, смогу ли я удалить команду для закрытия браузера.

Если у кого-то есть другие предложения, которые были бы очень признательны.


person Steven Seese    schedule 29.08.2011    source источник


Ответы (2)


Причина, по которой firefox перезапускается каждый раз, заключается в том, что setUp вызывается перед вызовом каждой функции модульного тестирования (и, аналогично, tearDown после). Таким образом, модульный тест просто создает новый экземпляр браузера Selenium для каждого теста. Это не обязательно плохо, но может быть быстрее повторно использовать один и тот же сеанс браузера.

Чтобы обойти это, вы можете вместо этого использовать методы класса setUpClass / tearDownClass, например:

class python_script(unittest.TestCase):
    @classmethod
    def setUpClass(cls)
        cls.selenium = selenium("localhost", 4444, "*chrome", "http://test website url/")
        cls.selenium.start()

    def setUp(self):
        self.verificationErrors = []

    def test_python_script_1(self):
        ...

    def test_python_script_2(self):
        ...

    def tearDown(self):
        self.assertEqual([], self.verificationErrors)

    @classmethod
    def tearDownClass(cls):
        cls.selenium.stop()

Обратите внимание, что setUpClass и tearDownClass появились только в python 2.7! Если вы используете более старую версию Python, вы все равно можете использовать ее, но вам придется установить библиотеку с именем unittest2. После его установки вы можете просто изменить строку импорта в верхней части скрипта на что-то вроде

import unittest2 as unittest
person gingerlime    schedule 01.09.2011
comment
Привет, Йоав, я попробовал твое предложение, и по какой-то причине окна Firefox не открывались. - person Steven Seese; 12.09.2011
comment
трудно сказать точно, но я предполагаю, что вы используете python старше 2.7 или не установили unittest2/не смогли правильно его импортировать. Убедитесь, что setUpClass выполняется при загрузке. например добавьте несколько операторов печати в каждую функцию и проверьте, выполняются ли они или нет. - person gingerlime; 13.09.2011
comment
Привет Йоав, я использую Python 2.7. Спасибо. - person Steven Seese; 21.09.2011
comment
Если вы используете python 2.7, вам не нужно устанавливать unittest2... Я не уверен, почему он не запускается, но если вы хотите снова вставить свой код, возможно, чего-то не хватает... - person gingerlime; 27.09.2011

Будет ли это работать, если вы удалите второй набор операторов импорта, второй оператор Class и вторую функцию setUp, а затем переименуете функции test_python_script так, чтобы на их концах были _1 и _2.

person jcfollower    schedule 29.08.2011