Python Selenium Test Suite单个Webdriver实例?

时间:2016-04-29 10:48:19

标签: python selenium

我有一些真正的问题试图弄清楚如何让它发挥作用,我确信这里有一些专家可以为我解决,请:)

所以我在python中有很多测试用例,它们都是相互依赖的,但是是单独的脚本,我想把它们组合起来并按顺序运行它们,在一个webdriver实例中,因为它们都会继续,但是我似乎无法弄清楚如何做到这一点..

我创建了一个测试套件 -

import unittest

from Searchfieldreturnscorrectvalue import SearchFieldReturnsCorrectValue

from Navigatetostreetlightprecontentpage import Navigatetostreetlightprecontentpage


class TestSuite(unittest.TestSuite):

  def suite():
    suite = unittest.TestSuite()
suite.addTest(Searchfieldreturnscorrectvalue('test_searchfieldreturnscorrectvalue'))
suite.addTest(Navigatetostreetlightprecontentpage('test_navigatetostreetlightprecontentpage'))
return suite

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

这会运行测试,但第二个测试失败,因为它试图在第二个firefox实例中运行它。

Searchfieldreturnscorrectvalue.py

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
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class SearchFieldReturnsCorrectValue(unittest.TestCase):
def setUp(self):
    self.driver = webdriver.Firefox()
    self.driver.implicitly_wait(30)
    self.base_url = "https://www.XXXXX.com/"
    self.verificationErrors = []
    self.accept_next_alert = True

def test_search_field_returns_correct_value(self):
    driver = self.driver
    driver.get(self.base_url + "/")
    driver.find_element_by_id("edit-search-block-form--2").click()
    driver.find_element_by_id("edit-query").clear()
    driver.find_element_by_id("edit-query").send_keys("street light")
    driver.find_element_by_id("edit-query").send_keys(Keys.ENTER)
    for i in range(60):
        try:
            if self.is_element_present(By.LINK_TEXT, "Street lighting"): break
        except: pass
        time.sleep(1)
    else: self.fail("time out")
    try: self.assertEqual("Street lighting", driver.find_element_by_link_text("Street lighting").text)
    except AssertionError as e: self.verificationErrors.append(str(e))

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

def is_alert_present(self):
    try: self.driver.switch_to_alert()
    except NoAlertPresentException as 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

def tearDown(self):
    self.assertEqual([], self.verificationErrors)

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

Navigatetostreetlightprecontentpage.py

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
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Navigatetostreetlightprecontentpage(unittest.TestCase):
def setUp(self):
    self.driver = webdriver.Firefox()
    self.verificationErrors = []
    self.accept_next_alert = True

def test_navigatetostreetlightprecontentpage(self):
    driver = self.driver
    driver.find_element_by_link_text("Street lighting").click()
    try: self.assertEqual("Street lighting", driver.find_element_by_css_selector("h1.page-title__main__title").text)
    except AssertionError as e: self.verificationErrors.append(str(e))
    try: self.assertEqual("Report a faulty street light | Cheshire East", driver.title)
    except AssertionError as e: self.verificationErrors.append(str(e))

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

def is_alert_present(self):
    try: self.driver.switch_to_alert()
    except NoAlertPresentException as 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

def tearDown(self):
    self.assertEqual([], self.verificationErrors)

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

我不知道测试套件是否是正确的方法,或者只是将所有测试都放到一个文件中,但我仍然希望“类/测试”能够单独报告通过/失败,我无法让它工作的那一刻,我认为这与setUp(self)有关,需要移动到setUpModule并共享?但我无法解决,如果有人能指出我正确的方向,我将非常感激。

由于

更新

根据以下评论我厌倦了的例子,仍然没有工作..

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
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

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

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

class SearchFieldReturnsCorrectValue(SeleniumTest):
def setUp(cls):
    cls.base_url = "https://www.XXXXX.com"
    cls.verificationErrors = []
    cls.accept_next_alert = True

def test_search_field_returns_correct_value(cls):
    driver = cls.driver
    driver.get(cls.base_url + "/")
    driver.find_element_by_id("edit-search-block-form--2").click()
    driver.find_element_by_id("edit-query").clear()
    driver.find_element_by_id("edit-query").send_keys("street light")
    driver.find_element_by_id("edit-query").send_keys(Keys.ENTER)
    for i in range(60):
        try:
            if cls.is_element_present(By.LINK_TEXT, "Street lighting"): break
        except: pass
        time.sleep(1)
    else: cls.fail("time out")
    try: cls.assertEqual("Street lighting", driver.find_element_by_link_text("Street lighting").text)
    except AssertionError as e: cls.verificationErrors.append(str(e))
    driver.find_element_by_link_text("Street lighting").click()

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

def is_alert_present(cls):
    try: cls.driver.switch_to_alert()
    except NoAlertPresentException as e: return False
    return True

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

def tearDown(cls):
    cls.assertEqual([], cls.verificationErrors)            


class Navigatetostreetlightprecontentpage(SeleniumTest):
def setUp(cls):
    cls.verificationErrors = []
    cls.accept_next_alert = True

def test_navigatetostreetlightprecontentpage(cls):
    driver = cls.driver
    try: cls.assertEqual("Street lighting", driver.find_element_by_css_selector("h1.page-title__main__title").text)
    except AssertionError as e: cls.verificationErrors.append(str(e))
    try: cls.assertEqual("Report a faulty street light | Cheshire East", driver.title)
    except AssertionError as e: cls.verificationErrors.append(str(e))

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

def is_alert_present(cls):
    try: cls.driver.switch_to_alert()
    except NoAlertPresentException as e: return False
    return True

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

def tearDown(cls):
    cls.assertEqual([], cls.verificationErrors)

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

现在似乎正在运行这两个类,但是第二个类永远不能找到任何元素,但是第一个类中的同一行完美地运行。

2 个答案:

答案 0 :(得分:3)

我不确定我是否理解,但是要使用单个驱动程序实例,您可以使用创建驱动程序的setupClass类方法:

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

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

    def setUp(self):
         ....

它仍将为每个新测试类重新创建驱动程序,但它不会为每个测试重新创建一个(如setUp那样)。

我个人使我的所有测试类都继承自SeleniumTest类,如下所示:

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

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

class MyTestClass(SeleniumTest):
    def setUp(self):
         ....

答案 1 :(得分:0)

导入unittest

从硒导入Webdriver

从进口睡眠 SeleniumTest(unittest.TestCase)类:

global driver

@classmethod
def setUpClass(cls):
    #getting a common webdriver instance for all your tests for this module
    cls.driver = webdriver.Chrome("/Users/sibasish/PycharmProjects/CommonDriverInstance/chromedriver")
    cls.driver.get("https://www.google.com")

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

class MyTestClass(SeleniumTest):     def setUp():          通过

def test_sample1(self):
    print("hello1")
    self.driver.get("https://www.google.com/")
    sleep(4)

def test_sample2(self):
    print("hello2")
    self.driver.get("https://www.facebook.com/")
    sleep(4)