2016-04-29 84 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