在Python中自动化Selenium测试

在Python中自动化Selenium测试,python,django,selenium,Python,Django,Selenium,我有一个Django项目,我正试图用Selenium为其编写浏览器交互测试。我的目标是让Hudson/Jenkins的测试自动化。到目前为止,我能够让测试命中Django服务器,但是从服务器日志中我看到它命中的是url/selenium服务器/driver,而不是正确的路径 以下是我的代码(基于Firefox的Selenium IDE插件生成的代码: from selenium import selenium class AccountAdminPageTests(unittest.Test

我有一个Django项目,我正试图用Selenium为其编写浏览器交互测试。我的目标是让Hudson/Jenkins的测试自动化。到目前为止,我能够让测试命中Django服务器,但是从服务器日志中我看到它命中的是url
/selenium服务器/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正在尝试连接到您的应用程序,而不是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")

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

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

我和一位同事使用django和selenium 2创建了一些自动化的selenium测试。它不需要使用jar文件就可以工作。下面是一个例子,展示了我们的测试用例。

我们目前使用django Jenkins从Jenkins成功运行django测试:

FWIW django以LiveServerTestCase的形式提供对Selenium的支持:

LiveServerTestCase启动一个django服务器,它允许像Selenium这样的客户端连接到它


此外,您现在可以使用PhantomJs作为无头测试的web驱动程序。这使得CI集成方式更容易。

对于自动化Selenium测试,我肯定会使用像Jenkins这样的CI解决方案。您可以配置Jenkins从您的服务器中提取代码库并触发Selenium测试。我一直在使用Pytest奥姆·詹金斯


您可以在此处找到使用Github和Selenium配置Jenkins的分步教程:

self.server=Process(target=service)代表什么?这里没有提到serve…您需要在不同的端口上运行Selenium(默认为4444)。这就是为什么您在LiveServerTestCase中遇到错误的URL的原因。您不必让一台实时服务器并行运行,它将使用测试数据库(包括尊重fixtures变量!)。这无疑是实现持续集成的方法。staticfiles模块还有一个子类用于LiveServerTestCase,用于在这种情况下正确处理静态文件。@Risadinha提到的子类是
StaticLiveServerTestCase