我有一个具有六个功能的应用程序。他们每个人都从登录网站开始。我创建了另一个名为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,我可以在一个浏览器会话中测试我的六个类吗?可能吗?我该如何更改代码?谢谢!
答案 0 :(得分:1)
你的问题不是关于Selenium;您的问题是跨测试共享测试数据。 (测试数据恰好是Selenium驱动程序。)
使用unittest
,可以通过以下两种方式之一完成设置。
如果您向测试用例添加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()
# ...
重要的是,这仍将为每个测试创建一个新的驱动程序(会话)。但...
如果在测试用例中添加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()
# ...
对于使用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)
基于我对您的要求的理解。我会建议这种方法:
使用返回驱动程序的方法创建登录类。 (在这里,您初始化一个驱动程序并将其返回。因此,您也可以在使用其他类时使用相同的浏览器)
对于所有六个类,定义将驱动程序作为参数并返回相同的after语句的方法。 (所以,每次调用这些方法时,都可以给你的驱动程序) 注意:您不需要再次编写Login语句。
最后,编写一个新脚本,导入您创建的所有类。这里通过调用log方法(基于您的登录类)初始化Login类并获取驱动程序处理程序。然后通过提供您作为参数提供的驱动程序,从您想要的任何类中调用其他方法。
我。由于您在Login和ClassName1中初始化firefox驱动程序,因此会创建两个会话。您应该避免在ClassName中初始化驱动,因为您在Login Class中已经有了特定的代码。
II。是的,您可以使用上述指南在一个浏览器会话中测试所有类。
希望这有助于整理代码。