【问题标题】:How to call selenium webdriver tests contained in subdirectory in python如何调用python子目录中包含的selenium webdriver测试
【发布时间】:2012-10-12 15:14:22
【问题描述】:

我是 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()

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

【问题讨论】:

    标签: python selenium webdriver selenium-webdriver


    【解决方案1】:

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

    • if __name__ == '__main__' 需要在最外层范围内(否则会留在类内,不会被执行)。
    • 当您导入common_page_elements 时,您不会在run_tests.py 中引用它。如果您在此处定义 username 之类的内容,则需要在其前面显式引用 common_page_elements
    • 在您的test_loginLogout 函数中,您将两个参数传递给它。我不是专家,但我从未见过将self 以外的变量传递给测试用例的情况。因此,即使您重组代码以从test1.py 正确调用函数test_login_logout,您也不会传递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()
    

    【讨论】:

      【解决方案2】:

      我通过如下重写 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() 
      

      【讨论】:

      • 我添加了一个可能有用的答案。主要思想是,它将使您的测试更好地划分并更容易集体执行。希望它有所帮助:)
      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2021-11-20
      相关资源
      最近更新 更多