使用Python自动化Selenium测试

5

我有一个Django项目,想用Selenium编写浏览器交互测试。我的目标是从Hudson/Jenkins自动化测试。到目前为止,我成功地让测试与Django服务器进行交互,但从服务器日志中看到它正访问/selenium-server/driver路径,而不是正确的路径。

这是我的代码(基于Firefox的Selenium IDE插件生成的):

from selenium import selenium


class AccountAdminPageTests(unittest.TestCase):
    def setUp(self):
        self.selenium = selenium("localhost", 
                                 8000, 
                                 "*chrome", 
                                 "http://localhost:8000/")
        self.selenium.start()
        self.selenium.open("/")

    def test_ok(self):
        self.assertTrue(self.selenium.is_text_present('OK'))

    def tearDown(self):
        self.selenium.stop()


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

有任何线索吗?


你需要在不同的端口上运行Selenium(默认为4444端口)。这就是你命中错误URL的原因。 - retornam
5个回答

9

我从未见过这个确切的错误,但我认为Selenium试图连接到您的应用程序而不是selenium服务器(一个.jar文件)。

selenium()的第一个参数应该是selenium服务器的端口。

默认情况下,该端口应为4444,您可能需要使用以下命令启动它:

$ java -jar selenium-server.jar

FWIW,以下是我在CI服务器上运行Selenium测试的方法...

from multiprocessing import Process
from django.test import TestCase
from selenium import selenium

class SeleniumFixtureCase(TestCase):
"""
Wrapper to multiprocess localhost server and selenium instance on one
test run.
"""

def setUp(self):
    "Make the selenium connection"
    TestCase.setUp(self)
    self.server = Process(target=serve)
    self.server.start()
    self.verificationErrors = []
    self.selenium = selenium("localhost", 4444, "*firefox",
                             "http://localhost:8000/")
    self.selenium.start()

def tearDown(self):
    "Kill processes"
    TestCase.tearDown(self)
    self.server.terminate()
    self.selenium.stop()
    self.assertEqual([], self.verificationErrors)

def _login(self):
    "Login as Albert Camus"
    self.selenium.open("http://localhost:8000/admin/")
    self.selenium.wait_for_page_to_load("30000")
    self.selenium.type("id_username", "albert")
    self.selenium.type("id_password", "albert")
    self.selenium.click("//input[@value='Log in']")
    self.selenium.wait_for_page_to_load("30000")

7
self.server = Process(target=serve) 这行代码是什么意思?没有提到 serve 是什么... 这段代码的意思是创建一个新的进程(process),并将其目标(target)设置为 serve 函数。但在当前上下文中,并没有提到 serve 函数的具体定义和实现。 - Tommaso Barbugli

4

我和同事使用了Django和Selenium 2创建了一些自动化的Selenium测试,而且不需要使用jar文件。这里是一个链接,显示了我们的测试用例代码。


3

1
使用LiveServerTestCase,您无需并行运行实时服务器,它将使用测试数据库(包括遵守fixtures变量!)。这绝对是持续集成的最佳选择。staticfiles模块还有一个子类用于处理静态文件的LiveServerTestCase情况。 - Risadinha
@Risadinha提到的子类是StaticLiveServerTestCase:http://django.readthedocs.org/en/latest/ref/contrib/staticfiles.html#django.contrib.staticfiles.testing.StaticLiveServerTestCase - mynameistechno

1

selenium() 调用的第二个参数应该是 Selenium 服务器端口号(如 David 的答案所述),而不是被测试应用程序的端口号。默认端口号为 4444。我建议将调用替换为:

  self.selenium = selenium("localhost", 4444, ....

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接