Python Selenium - 一个会话浏览器

时间:2018-03-01 19:12:00

标签: java python selenium selenium-webdriver webdriver

我有一个具有六个功能的应用程序。他们每个人都从登录网站开始。我创建了另一个名为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,我可以在一个浏览器会话中测试我的六个类吗?可能吗?我该如何更改代码?谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

1。为每个测试

设置数据

如果您向测试用例添加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。为所有测试设置数据

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

因为它是一个类方法,所以您可以访问测试类(即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()
        # ...

奖励:使用Capybara

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

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()
        # ...

答案 1 :(得分:0)

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

  1. 使用返回驱动程序的方法创建登录类。 (在这里,您初始化一个驱动程序并将其返回。因此,您也可以在使用其他类时使用相同的浏览器)

  2. 对于所有六个类,定义将驱动程序作为参数并返回相同的after语句的方法。 (所以,每次调用这些方法时,都可以给你的驱动程序) 注意:您不需要再次编写Login语句。

  3. 最后,编写一个新脚本,导入您创建的所有类。这里通过调用log方法(基于您的登录类)初始化Login类并获取驱动程序处理程序。然后通过提供您作为参数提供的驱动程序,从您想要的任何类中调用其他方法。

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

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

    希望这有助于整理代码。