【问题标题】:How do I write a Python Selenium test script that contains more than one test case?如何编写包含多个测试用例的 Python Selenium 测试脚本?
【发布时间】:2013-12-11 09:45:00
【问题描述】:

我正在使用 Python 编写 Selenium Webdriver 脚本,该脚本仅部分执行我想要的操作。我希望它运行一组测试用例,每个测试用例在类中都有自己的方法。因此,对于我的脚本,我希望它测试折扣表单 (test_add_discount),然后测试添加单元表单 (test_add_unit_type)。

每次我运行它时,我得到的只是第一个,然后它会随着消息关闭;

在 12.948 秒内运行 1 次测试

如果我使用 -v 参数详细运行它,我仍然看不到对第二个测试用例的任何引用。

这是我的脚本;

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
import unittest, time, re

class AdminTestCase(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://mysite.local"

    def test_discount_test_case(self):
        driver = self.driver
        driver.get(self.base_url + "/admin/login")
        driver.find_element_by_id("username").clear()
        driver.find_element_by_id("username").send_keys("admin")
        driver.find_element_by_id("password").clear()
        driver.find_element_by_id("password").send_keys("p@ssw0rd")
        driver.find_element_by_xpath("//button[@type='submit']").click()
        driver.find_element_by_xpath("//li[4]/a/span").click()
        driver.find_element_by_link_text("Add Discount").click()
        driver.find_element_by_name("title").clear()
        driver.find_element_by_name("title").send_keys("Selenium Test Discount")
        driver.find_element_by_name("body").clear()
        driver.find_element_by_name("body").send_keys("Test discount text")
        driver.find_element_by_name("start_date").clear()
        driver.find_element_by_name("start_date").send_keys("01/01/2014")
        driver.find_element_by_name("end_date").clear()
        driver.find_element_by_name("end_date").send_keys("01/03/2014")
        driver.find_element_by_name("discount_percentage").clear()
        driver.find_element_by_name("discount_percentage").send_keys("33")
        driver.find_element_by_xpath("//button[@type='submit']").click()

    def test_add_unit_type(self):
        driver = self.driver
        driver.get(self.base_url + "/maxsys/unit_types")
        driver.find_element_by_link_text("Add Unit type").click()
        driver.find_element_by_name("title").clear()
        driver.find_element_by_name("title").send_keys("Selenium Test Unit Type")
        driver.find_element_by_name("height").clear()
        driver.find_element_by_name("height").send_keys("22.5")
        driver.find_element_by_name("width").clear()
        driver.find_element_by_name("width").send_keys("Non-numeric")
        driver.find_element_by_name("depth").clear()
        driver.find_element_by_name("depth").send_keys("Test discount text")
        driver.find_element_by_name("body").clear()
        driver.find_element_by_name("body").send_keys("unit type description")
        driver.find_element_by_xpath("//button[@type='submit']").click()


    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

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

【问题讨论】:

  • 我注意到您没有teardown() 方法,这可能是问题所在吗?我猜是因为我从来没有见过你在这里遇到的问题。您所有的测试用例方法的名称中都包含“test”,因此应该可以找到它们。
  • 我确实有一个 tearDown() 但它也只运行了第一个测试。你是说我的方法在这里是正确的吗?
  • 对于我所有的 Webdriver 测试,我都做了类似的事情,我确实使用了一个基类,它具有 setupteardown,每个测试类都继承自其中,但我认为这不会区别。与 Python 一样,也许检查你的缩进?编辑:刚刚看到你的答案,缩进它!绝对将您的编辑器设置为空格,这样可以省去很多麻烦。

标签: python unit-testing selenium


【解决方案1】:

好的,事实证明我的代码没问题。问题在于 Python 的缩进规则。第二个测试用例中的缩进是制表符而不是空格。我现在已将我的编辑器设置为用 4 个空格替换制表符,并且一切都按预期运行。

非常令人气愤,而且更糟糕的是,肉眼看不见。但是,当我在互联网上发誓说 Python 的缩进时,我被告知我最终会学会喜欢它,所以我试图保持开放的心态。

为了解决这个问题,我刚刚了解了从命令行调用 python 脚本时的 -t 参数,它会在 Python 2 中给出关于混合空格和制表符的警告。

使用 -tt 会将它们从警告升级为错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多