У меня есть пара проблем с запуском более одного тестового скрипта 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 и посмотреть, могу ли я удалить команду для закрытия браузера.
Если у кого-то есть другие предложения, которые были бы весьма признательны.
Причина, по которой 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
Будет ли он работать, если вы удалите второй набор операторов импорта, второй оператор класса и вторую функцию setUp, а затем переименуете функции test_python_script, чтобы на концах были _1 и _2.