尝试将Selenium IDE Python脚本作为测试套件运行
我在运行多个由Selenium IDE Python远程控制插件导出的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)
...并且从剩下的"if __name__
"语句中去掉了:
self.selenium.stop()
这样Python日志和浏览器窗口就保持打开状态了。这是朝着正确方向迈出的一步,但我需要在脚本运行完后关闭日志窗口。
我猜下一步是创建另一个停止类,然后在selenium.py文件中稍微调整一下,看看能否去掉关闭浏览器的命令。
如果有人有其他建议,我将非常感激。
2 个回答
如果你删除第二组导入语句、第二个类声明和第二个设置函数,然后把test_python_script函数的名字改成后面加上_1和_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