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

标签 python selenium webdriver selenium-webdriver

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

至于 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()

关于python - 如何调用python子目录中包含的selenium webdriver测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12862114/

相关文章:

python - 如何使用 boto3 删除 AWS 存储桶中的文件夹及其内容

python - Docker flask 应用程序不工作 - 端口问题

ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作?

javascript - 使用cucumber JS时出现错误 "HookUndefined Step"是什么意思?

Ruby : Watir : 如何避免从 Net::ReadTimeout 关闭浏览器?

angularjs - 使用 Selenium 触发 Angular 页面的 ng-change

python - 为什么 async pysnmp 这么慢?

python - 如何导入使用 argparse 的模块

java - Selenium + JUnit : test order/flow?

python - Selenium 的 driver.get() 调用的最大递归错误