如何调用python子目录中的selenium webdriver测试

2024-05-14 15:42:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我想初始化webdriver并在中打开页面运行测试.py,然后将参数传递给test1.py、test2.py等。我也想页面元素.py包含公共页元素的文件。我将在下面详细介绍python文件。在

为commonpageelements.py我只是简单地定义了各种元素,比如username=“inspected\u name”。在

我尝试了以下方法运行测试.py以下内容:

^{pr2}$

然后,在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()

我真的不知道该怎么做。我有点瞎了眼,试着调整一下,却一无所获。任何帮助将不胜感激!谢谢


Tags: pyid元素bydriverusernamepassword页面
2条回答

我通过重写运行测试.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() 

其他人会比我更能增加价值,但我注意到以下几点:

  • 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可以如下所示:

^{pr2}$

相关问题 更多 >

    热门问题