gpt4 book ai didi

python - 在第一个测试完成且测试失败后,Python和Unittest打开第二个浏览器

转载 作者:行者123 更新时间:2023-12-01 00:20:44 25 4
gpt4 key购买 nike

找到了许多有关此问题的主题,但没有找到任何简单描述的问题解决方法,因此,针对该问题创建新主题,也许会更好地解决该问题。

我已经为LoginTest创建了测试用例,为LegalPersonSearchTest创建了测试用例。这两个测试用例都位于单独的文件login.py和legalPersonSearch.py​​中

from utils.utils import *
from selenium import webdriver
from locators.locators import Locators
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import unittest
from pages.loginPage import LoginPage


class LoginTest(unittest.TestCase):

@classmethod
def setUpClass(cls):
cls.driver = webdriver.Firefox()
cls.driver.implicitly_wait(10)
cls.driver.maximize_window()
cls.driver.get(URL)

def test_valid_login(self):
driver = self.driver

login = LoginPage(driver)
login.fill_login_form(adminUsername, adminPassword)
login.click_login_button()


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


我认为新的浏览器在测试之间打开的原因是在第二个文件中声明了驱动程序。

from selenium import webdriver
import unittest
from pages.legalPersonSearchPage import LegalPersonSearchPage

class LegalPersonSearchTest(unittest.TestCase):

@classmethod
def setUpClass(cls):
cls.driver = webdriver.Firefox()

def test_valid_organization_search(self):
driver = self.driver
legal = LegalPersonSearchPage(driver)

legal.open_legal_person_search_page()

@classmethod
def tearDown(cls):
cls.driver.quit()


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


如何修改LoginTest使浏览器仅打开一次,而不是在两次测试之间打开?

我需要修改它,因为登录后(测试的1/2)是测试的第二部分。它将完成,然后浏览器关闭并打开新的窗口,然后重新登录。

正如有人告诉我的那样,最佳实践是将登录测试的一部分保留在整个测试之外。

最佳答案

回答您的一个问题-driver被打开两次,因为您有两种不同的setUp()方法,每个类分别使用一个方法-LoginTestLegalPersonSearchTest。运行test_valid_login时,将调用setUpClass()方法,该方法将初始化driver。然后,运行测试。此driver实例永远不会被拆除,因此窗口保持打开状态。

然后,运行test_valid_organization_search。此类还具有自己的setUpClass()方法,该方法将初始化另一个driver实例。因此,现在您有两个驱动程序,两个驱动程序都在每个类文件的setUpClass()方法中打开。

这种设置产生的结果不是您想要的。我认为您在这里误解了“最佳实践是使登录测试部分不包含在整个测试中”的意思。

这并不意味着您需要编写两个单独的测试-一个用于登录,另一个用于测试其余功能。这实际上是bad practice,因为您希望您的测试用例彼此独立地运行-测试用例不应依赖于先前的测试用例来正确执行。

我认为您在这里寻找的解决方案是将登录功能写入您的setUp()方法,以便始终在测试用例开始之前执行登录。

这种方法将阻止您参与测试的登录–这就是您在此处提到的最初目标。

您可以通过删除重复的setUp()方法,并将LoginTest继承到LegalPersonSearchTest中来调整类,以便仅设置一次:

from utils.utils import *
from selenium import webdriver
from locators.locators import Locators
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import unittest
from pages.loginPage import LoginPage

# this is our "base" class
class LoginTest(unittest.TestCase):

driver = None # driver instance that we will inherit into LegalPersonSearchTest

# initialize driver, go to testing URL, etc.
def setUp(cls):
cls.driver = webdriver.Firefox()
cls.driver.implicitly_wait(10)
cls.driver.maximize_window()
cls.driver.get(URL)

# call login here to login before test
login_page = LoginPage(cls.driver)
login_page .fill_login_form(adminUsername, adminPassword)
login_page .click_login_button()

# move teardown into same class as setUp()
def tearDown(cls):
cls.driver.quit()



我们为 driver声明了一个类变量,您可以将其传递给 LegalPersonSearchTest。我们还删除了 __main__调用,因为我们唯一需要的入口点是 test_中的 LegalPersonSearchTest方法:

from selenium import webdriver
import unittest
from pages.legalPersonSearchPage import LegalPersonSearchPage
from login_test import LoginTest # unsure of file name containing LoginTest class

class LegalPersonSearchTest(LoginTest): # inherit LoginTest here so we can use driver


def test_valid_organization_search(self):

legal_page = LegalPersonSearchPage(self.driver)
legal_page .open_legal_person_search_page()


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


我们在这里做了一些更改:


__main__指定的主要方法的入口点-我们只需要在测试用例级别( LegalPersonSearchTest)上的一个地方
删除重复的 setUp()方法调用,这些调用导致创建多个驱动程序实例(问题描述中提到)
LoginTest类中创建的驱动程序的单个类实例将传递给 LegalPersonSearchTest
setUp()上修改了 LoginTest方法以初始化驱动程序并登录-从而不必为任何测试包括登录代码!


更新:以下评论进行了更改:


login类中删除了 LoginTest方法,并将登录代码移到了 setUp()下-这将在每个测试用例之前执行
修改 test_valid_organization_search以在初始化PageObject时使用 self.driver代替 driver


我根据推送到GitHub的 this sample Python test architecture进行了许多更改。我用作模板的文件是 base_test_fixture.py(用于 LoginTest)和 test_web_driver.py(用于 LegalPersonSearchTest)。

您可能会注意到 base_test_fixture.py还包含 def _testInitialize()def _testCleanup() -这些方法可以在 LegalPersonSearchTest类中覆盖,以执行要在 test_方法之前运行的其他步骤。这里的想法是,如果您有多个包含测试用例的 .py文件,但是每个 .py文件都需要稍微不同的设置,并且您需要做的不仅仅是 setUp()方法调用。您可以在测试用例类中覆盖 testInitialize()testCleanup()方法,这些方法将在 setUp()之后和实际的 test_方法之前执行。

让我知道您是否对此有任何疑问-需要解释很多,但是一旦您学习了这种架构,便拥有了一种非常有效的组织和执行测试用例的方式。

关于python - 在第一个测试完成且测试失败后,Python和Unittest打开第二个浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58990317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com