Попытка запустить сценарии Selenium IDE Python как набор тестов - PullRequest
1 голос
/ 29 августа 2011

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

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

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

Причина, по которой я уделяю время запуску сценария тестирования в Python, заключается в том, что наше программное обеспечение Test case solution (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 и посмотрим, смогу ли я удалить команду, чтобы закрыть браузер.

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

Ответы [ 2 ]

0 голосов
/ 01 сентября 2011

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

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

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

import unittest2 as unittest
0 голосов
/ 29 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...