2016-04-29 70 views
1

我有一些真正的问题,试图找出如何得到这个工作,我敢肯定有一些专家在这里谁可以为我工作,请:))Python Selenium Test Suite单Webdriver实例?

所以我有一个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() 

这似乎是现在的运行这两个班,但第二类永远无法找到任何元素,但第一类中的同一行完美地工作。

回答

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一样)。

Personnally我把我所有的测试类继承自一个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): 
     .... 
+0

我想我明白你的意思,我试图在2一起现在使用的这个组合,我会更新我的原问题与我现在有什么不同,但是在完成第一堂课之后,它似乎没有运行第二课/测试? – Karl

+0

'cls.driver.maximize_window()'也应该放在'setupClass'里面。除此之外,我不知道你的第二班为什么不跑。你怎么称呼测试?我使用pytest,它运行得很好。请注意,'setupClass'将为每个新类重新创建驱动程序,只是它不会为每个测试重新创建一个驱动程序(如'setUp')。 – JulienD

+0

也许你忘了从SeleniumTest继承第二个测试类呢? – JulienD