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

1

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

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

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

Теги:
selenium
testcase
test-suite

2 ответа

0

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

Чтобы преодолеть это, вы можете использовать методы класса 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
  • 0
    Эй, Йоав, я попробовал твое предложение, и окна Firefox по какой-то причине не открылись.
  • 0
    Трудно сказать точно, но я предполагаю, что вы используете Python старше 2.7 или не установили unittest2 / не смогли правильно импортировать его. Убедитесь, что setUpClass выполняется при загрузке. например, добавить несколько операторов печати в каждую функцию и проверить, выполняются они или нет.
Показать ещё 3 комментария
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню