我是 Python 新手,所以请原谅我的无知。比如说,我有以下结构:
parentDir\
runTests.py
commonpageelements.py
testcases\
__init__.py
test1.py
test2.py
我想初始化webdriver并在runTests.py中打开页面,然后将参数传递给test1.py,test2.py等。对于这个例子,我有一个test1.py的登录测试。我还想要一个包含公共(public)页面元素的 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()
我真的不确定如何实现这一点。我在这里有点盲目,尝试调整但无处可去。任何帮助将不胜感激!谢谢
最佳答案
其他人将能够比我增加更多的值(value),但我注意到一些事情:
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()
至于 setUp
和 tearDown
部分,我会将它们放在您的测试模块中,因此您的 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()
关于python - 如何调用python子目录中包含的selenium webdriver测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12862114/