Python Selenium - 一个会话浏览器

问题描述 投票:0回答:2

我有一个具有六个功能的应用程序。他们每个人都从登录网站开始。我创建了另一个名为login的类(在代码下面)。该项目的结构是6个班级和主要班级。你如何在这六个类中使用这个功能?这是我在每个类和登录类中登录的代码

class ClassName1(unittest.TestCase):
    WebDriver driver=new FirefoxDriver();
    driver.get("URL");
    login=driver.find_element_by_name('Login')
    password=driver.find_element_by_name('Password')
    username.send_keys("login")
    password.send_keys("password")
    driver.find_element_by_name("submit").click()

我创建了Login类:

class Login(unittest.TestCase)
    def log(self):
        WebDriver driver=new FirefoxDriver();
            driver.get("URL");
        login=driver.find_element_by_name('Login')
        password=driver.find_element_by_name('Password')
        username.send_keys("login")
        password.send_keys("password")
        selenium.find_element_by_name("submit").click()

我的主张是:

从文件导入登录 - >到ClassName1和类:Login.log()但我不知道如何使用这个我有两个会话浏览器和错误我不知道如何将它组合成一个会话

在我的应用程序中,我制作的每个类中的第二个问题 - webdriver,我可以在浏览器会话中测试我的六个类吗?每个班级都打开浏览器。我想在一个。这是可能的 ?我的应用程序中的第二个问题是我创建的每个类 - webdriver,我可以在一个浏览器会话中测试我的六个类吗?这是可能的 ?我该如何更改代码?谢谢!

java python selenium selenium-webdriver webdriver
2个回答
1
投票

你的问题不是关于Selenium;您的问题是跨测试共享测试数据。 (测试数据恰好是Selenium驱动程序。)

使用unittest,可以通过两种方式之一完成设置。

1. Setting up data for each test

如果在测试用例中添加setUp()实例方法,unittest会在每次测试之前调用它。 (同样,如果在测试用例中添加tearDown()实例方法,unittest会在每次测试后调用它。)

因为它是一个实例方法,所以您可以访问测试实例(即self)。可以将在此方法中设置的数据分配给实例上的各种属性,以便以后在实际测试功能中使用。

您可以使用此功能在每次测试之前设置驱动程序(并在之后将其拆除):

class MyTestCase(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.get("http://www.example.com")
        self.driver.find_element_by_link_text("Log in").click()
        # ...

    def tearDown(self):
        self.driver.quit()

    def test_creating_a_widget(self):
        self.driver.find_element_by_link_text("New widget").click()
        # ...

    def test_creating_a_whatsit(self):
        self.driver.find_element_by_link_text("New whatsit").click()
        # ...

重要的是,这仍将为每个测试创建一个新的驱动程序(会话)。但...

2. Setting up data for all tests

如果在测试用例中添加setUpClass()类方法,unittest将在测试用例中的所有测试运行之前调用一次(并且只调用一次)。 (同样,如果在测试用例中添加tearDownClass()类方法,unittest将在测试用例中的所有测试运行后调用一次(并且只调用一次)。)

因为它是一个类方法,所以您可以访问测试类(即cls)。可以将此方法中设置的数据分配给类中的各种属性,以便以后在实际测试函数中使用。

class MyTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()

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

可是等等!

如果您在测试中共享驱动程序,则每个测试将在上一次测试停止的地方进行。换句话说,您的测试不会被隔离,这会使编写和调试测试变得更加困难。

为解决这个问题,我们需要在每次测试之间重置。为此,我们可以回到setUp()tearDown()实例方法:

class MyTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()

    def setUp(self):
        self.driver.get("http://www.example.com")
        self.driver.find_element_by_link_text("Log in").click()
        # ...

    def tearDown(self):
        self.driver.get("about:blank")

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

    def test_creating_a_widget(self):
        self.driver.find_element_by_link_text("New widget").click()
        # ...

    def test_creating_a_whatsit(self):
        self.driver.find_element_by_link_text("New whatsit").click()
        # ...

Epilogue: Sharing setup across tests

要跨测试用例分享此行为,只需使用继承:

class BaseTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()

    def setUp(self):
        self.driver.get("http://www.example.com")
        self.driver.find_element_by_link_text("Log in").click()
        # ...

    def tearDown(self):
        self.driver.get("about:blank")

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

class WidgetsTestCase(BaseTestCase):
    def test_creating_a_widget(self):
        self.driver.find_element_by_link_text("New widget").click()
        # ...

class WhatsitsTestCase(BaseTestCase):
    def test_creating_a_whatsit(self):
        self.driver.find_element_by_link_text("New whatsit").click()
        # ...

Bonus: Use Capybara

对于使用Selenium的测试,capybara-py可能更好。它在Selenium之上提供了一个层,并负责处理大部分内容,例如,透明地等待异步行为:

import capybara
import capybara.dsl
import unittest

class BaseTestCase(unittest.TestCase):
    def setUp(self):
        self.page = capybara.dsl.page
        self.page.visit("http://www.example.com")
        self.page.click_link("Log in")
        # ...

    def tearDown(self):
        capybara.reset_sessions()

class WidgetsTestCase(BaseTestCase):
    def test_creating_a_widget(self):
        self.page.click_link("New widget")
        # ...

class WhatsitsTestCase(BaseTestCase):
    def test_creating_a_whatsit(self):
        self.page.click_link("New whatsit")
        # ...

0
投票

根据我对您的要求的理解。我会建议这种方法:

  1. 使用返回驱动程序的方法创建登录类。 (在这里,您初始化一个驱动程序并将其返回。因此,您也可以在使用其他类时使用相同的浏览器)
  2. 对于所有六个类,定义将驱动程序作为参数并返回相同的after语句的方法。 (因此,每次调用这些方法时,都可以将驱动程序提供给它们)注意:您不需要再次编写Login语句。
  3. 最后,编写一个新脚本,导入您创建的所有类。这里通过调用log方法(基于您的登录类)初始化Login类并获取驱动程序处理程序。然后通过提供您收到的驱动程序作为参数,从您想要的任何类调用其他方法。

一世。由于您在Login和ClassName1中初始化firefox驱动程序,因此会创建两个会话。您应该避免在ClassName中初始化驱动,因为您在Login Class中已经有了特定的代码。

II。是的,您可以使用上述指南通过一个浏览器会话测试所有类。

希望这有助于组织您的代码。

© www.soinside.com 2019 - 2024. All rights reserved.