3

我是Python的新手,所以请耐心等待我的无知。说,我有以下结构:

parentDir\
    runTests.py
    commonpageelements.py 
    testcases\
        __init__.py
        test1.py
        test2.py

我想初始化webdriver并打开runTests.py中的页面,然后将参数传递给test1.py、test2.py等。对于这个例子,我有一个test1.py的登录测试。我还想要一个包含常见页面元素的 pageelements.py 文件。我将在下面详细介绍 python 文件。

对于 commonpageelements.py,我只定义了各种元素,例如 username="inspected_name"。

我为 runTests.py 尝试了以下内容:

from selenium import webdriver
from testcases import *
import common_page_elements
import sys, unittest, re, time, os.path, logging

class RunTests(unittest.TestCase):

    def setUp(self):

        self.driver = webdriver.Firefox()

        self.driver.implicitly_wait(30)
        self.driver.get("http://url_for_page")  

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

    def test_loginLogout(username, password):
        test_login_logout("myusername", "mypassword")

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

然后,在 test1.py 我有:

class test1(username, password):

    def test_login_logout():
        driver = self.driver
        driver.get(self.base_url)
        driver.find_element_by_id(pageelements.textfield_username).clear()
        driver.find_element_by_id(pageelements.textfield_username).send_keys(username)
        driver.find_element_by_id(pageelements.textfield_password).clear()
        driver.find_element_by_id(pageelements.textfield_password).send_keys(password)
        driver.find_element_by_name(pageelements.button_submit).click()
        driver.find_element_by_id(pageelements.link_logout).click()

我真的不确定如何实现这一目标。我在这里有点盲目,尝试调整但无处可去。任何帮助将不胜感激!谢谢

4

2 回答 2

3

其他人将能够比我增加更多的价值,但我注意到了几件事:

  • if __name__ == '__main__'需要在最外层范围内(否则它将留在类内并且不会被执行)。
  • 当您导入时common_page_elements,您不会在run_tests.py. 如果那是您定义类似 的地方username,则需要common_page_elements在其前面显式引用。
  • 在您的test_loginLogout函数中,您将两个参数传递给它。我不是专家,但我从未见过将变量以外的变量self传递给测试用例的情况。因此,即使您重组了代码以test_login_logout从正确调用函数test1.py,您也不会传递self(它将保存 的内容setUp。因此这不起作用。
  • 如果您要从不同的模块运行测试,我相信每个模块都必须对其测试用例保持封闭,这意味着它们应该能够独立运行。在您的情况下,test1.py似乎没有任何必要的信息来使用您需要的设置运行您想要的报告。
  • 考虑到以上几点,您可能想要使用该unittest.TestLoader().loadTestsFromModule()功能,它可以让您加载其他测试模块并执行它们。

这是完全未经测试的(可怕的双关语,我知道)代码,但这样的事情可能适用于您的情况:

import logging, os.path, re, sys, time, unittest
from testcases import test1, test2

def main():
    # Create a loader object
    test_loader = unittest.TestLoader()

    # Add your tests
    suite = test_loader.loadTestsFromModule(test1)
    suite.addTests(test_loader.loadTestsFromModule(test2))

    # Run the tests
    unittest.TextTestRunner(verbosity=2).run(suite)

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

至于setUptearDown部分,我会把它们放在你的测试模块中,所以你Test1Test可以看起来像这样:

# test1.py

import common_page_elements as page_elements

from selenium import webdriver


class Test1Test(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.driver.get("http://url_for_page")  

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

    def testLoginLogout(self):
        # Likely not necessary to redefine `driver` here - just use `self.driver`
        driver = self.driver
        # Not sure how this relates to the `get` in `setUp`
        driver.get(self.base_url)
        driver.find_element_by_id(page_elements.textfield_username).clear()
        driver.find_element_by_id(page_elements.textfield_username).send_keys(username)
        driver.find_element_by_id(page_elements.textfield_password).clear()
        driver.find_element_by_id(page_elements.textfield_password).send_keys(password)
        driver.find_element_by_name(page_elements.button_submit).click()
        driver.find_element_by_id(pageelements.link_logout).click()
于 2012-10-13T01:34:16.920 回答
1

我通过重写 runTests.py 来解决这个问题,如下所示:

from selenium import webdriver
from testcases import login
import common_page_elements
import sys, unittest, re, time, os.path, logging

class runTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()        
        self.driver.implicitly_wait(30)
        self.base_url = "http://url_for_page"
        self.driver.get(self.base_url)

    def testLogin(self):
        test1.test_login(self, "myusername", "mypassword") 

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)


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


and test1.py as:

    import common_page_elements

    def test_login(self, username, password):
        driver = self.driver
        driver.get(self.base_url)
        driver.find_element_by_id(common_page_elements.textfield_username).clear()
        driver.find_element_by_id(common_page_elements.textfield_username).send_keys(username)
        driver.find_element_by_id(common_page_elements.textfield_password).clear()
        driver.find_element_by_id(common_page_elements.textfield_password).send_keys(password)
        driver.find_element_by_name(common_page_elements.button_submit).click() 
于 2012-10-12T20:34:50.233 回答